İlk yaklaşımı kullanıyorum, ancak bahsettiğiniz sorunları ele almanızı sağlayan biraz farklı.
DAO'lar için testler yapmak için gereken her şey kaynak kontrolündedir. DB oluşturmak için şema ve komut dosyaları içerir (docker bunun için çok iyidir). Gömülü DB kullanılabilirse - hız için kullanıyorum.
Açıklanan diğer yaklaşımlarla önemli fark, test için gerekli verilerin SQL komut dosyalarından veya XML dosyalarından yüklenmemesidir. Her şey (etkin bir şekilde sabit olan bazı sözlük verileri hariç), yardımcı işlevler / sınıflar kullanılarak uygulama tarafından oluşturulur.
Temel amaç test tarafından kullanılan verileri yapmaktır
- teste çok yakın
- açık (veri için SQL dosyaları kullanmak, hangi testin hangi test tarafından kullanıldığını görmeyi çok sorunlu hale getirir)
- testleri ilgisiz değişikliklerden ayırın.
Temel olarak, bu yardımcı programların yalnızca testin kendisi için test için gerekli olan şeyleri bildirerek belirtmesine izin verdiği ve alakasız şeyleri atladığı anlamına gelir.
Uygulamada ne anlama geldiğine dair bir fikir vermek için, Comment
s ile Post
s arasında yazan bazı DAO testini göz önünde bulundurun Authors
. Böyle bir DAO için CRUD işlemlerini test etmek için DB'de bazı veriler oluşturulmalıdır. Test şöyle görünecektir:
@Test
public void savedCommentCanBeRead() {
// Builder is needed to declaratively specify the entity with all attributes relevant
// for this specific test
// Missing attributes are generated with reasonable values
// factory's responsibility is to create entity (and all entities required by it
// in our example Author) in the DB
Post post = factory.create(PostBuilder.post());
Comment comment = CommentBuilder.comment().forPost(post).build();
sut.save(comment);
Comment savedComment = sut.get(comment.getId());
// this checks fields that are directly stored
assertThat(saveComment, fieldwiseEqualTo(comment));
// if there are some fields that are generated during save check them separately
assertThat(saveComment.getGeneratedField(), equalTo(expectedValue));
}
Bunun, SQL komut dosyalarına veya test verileri içeren XML dosyalarına göre çeşitli avantajları vardır:
- Kodun bakımı çok daha kolaydır (örneğin Yazar gibi birçok testte referans verilen bazı varlıklara zorunlu bir sütun eklemek, çok fazla dosya / kayıt değiştirmeyi gerektirmez, yalnızca oluşturucu ve / veya fabrikada bir değişiklik yapılmasını gerektirmez)
- Spesifik testin gerektirdiği veriler, başka bir dosyada değil, testin kendisinde açıklanmıştır. Bu yakınlık, test anlaşılırlığı açısından çok önemlidir.
Geri Alma ve Tamamlama
Testlerin yürütüldükleri zaman yapılmasını daha uygun buluyorum. İlk olarak, DEFERRED CONSTRAINTS
taahhüt asla gerçekleşmezse bazı efektler (örneğin ) kontrol edilemez. İkinci olarak, bir test başarısız olduğunda, veri geri alma tarafından geri döndürülmediği için DB'de incelenebilir.
Bu, testin bozuk bir veri üretebileceği ve bu durumun diğer testlerde başarısızlığa yol açabileceği bir dezavantajı vardır. Bununla başa çıkmak için testleri izole etmeye çalışıyorum. Yukarıdaki örnekte her test yeni Author
yaratılabilir ve bununla ilgili diğer tüm varlıklar yaratılır, bu nedenle çarpışmalar nadirdir. Potansiyel olarak kırılabilen ancak bir DB seviyesi kısıtlaması olarak ifade edilemeyen kalan değişmezlerle başa çıkmak için, her bir testten sonra çalıştırılabilecek hatalı koşullar için bazı programatik kontroller kullanıyorum (ve bunlar CI'de çalıştırılıyor, ancak genellikle performans için yerel olarak kapatılıyor) nedeniyle).