Bir Uygulamanın CRUD katmanında Birim Testleri oluşturma, testleri nasıl bağımsız hale getirebilirim?


14

Bu yüzden Birim Testlerimi mümkün olduğunca kitap başında yapmaya çalışıyorum, ancak bazı basit Ekle / Sil yöntemlerini test ettiğimde sorun oluyor.

Add yöntemi için, temelde bir kukla nesne oluşturmak ve eklemek zorunda, sonra test başarılı olduktan sonra, kukla nesne silmek zorunda.

Ve silme testi için, silebilmek için açık bir şekilde kukla bir nesne oluşturmam gerekiyor.

Bir testin başarısız olup olmadığını görebileceğiniz gibi, diğeri de başarısız olur, çünkü ikisi de gereklidir.

"Bir Siparişi İptal Et" yazan bir test yazmanız gereken bir sistemle aynı ... ilk önce iptal etmek için kukla bir sipariş gerekli olacaktır, bu birim test yönergelerine aykırı değil mi?

Bunun gibi davaların nasıl ele alınması gerekiyor?


Ayrıca şu soruya da bakmak isteyebilirsiniz: programmers.stackexchange.com/questions/115455/…
Güven

Yanıtlar:


13

Yaptığınız işte yanlış bir şey yok. Birden fazla test aynı kodu kapsayabilir; bu sadece bir sorunun birkaç testin başarısız olmasına neden olacağı anlamına gelir. Kaçınılması gereken, diğer testlerin sonuçlarına bağlı testlerdir. Yani, silme testiniz ekleme testinin çalıştırılmasına bağlıdır ve bu nedenle silme testinizi ekleme testinizden ÖNCE çalıştırırsanız başarısız olur. Bu sorunu önlemek için, her testin başında bir "boş sayfa" olduğundan emin olun, böylece belirli bir testte olanlar sonraki testleri etkileyemez.

Bunu yapmanın harika bir yolu, testleri bir bellek içi veritabanına karşı çalıştırmaktır.

Add testinizde boş bir veritabanı oluşturun, nesneyi ekleyin ve gerçekten eklendiğini iddia edin.

Silme testinizde, zaten sildiğiniz nesne ile veritabanını oluşturun. Nesneyi silin ve silindiğini iddia edin.

Yırtma kodunuzdaki veritabanını uçurun.


Bellek içi veritabanı sadece hızlı (bellekte) ve basittir (işlemde). Bunu herhangi bir veri deposuyla yapabilirsiniz.
Paul Draper

3

İşlemleri kullanın.

İşlemleri destekleyen bir veritabanı kullanıyorsanız, her bir işlemi bir işlemde çalıştırın. Testin sonunda işlemi geri alın. Daha sonra her test veritabanını değiştirmeden bırakır.

Evet, bir siparişi iptal etmek için önce bir sipariş oluşturmanız gerekir. Bu iyi. Test önce bir sipariş oluşturur, ardından iptal eder, ardından siparişin iptal edildiğini doğrular.


Bu fikri seviyorum. Bugün büyük etkisi ile uyguladı.
pimbrouwers

3

Sen iyi yapıyorsun. Birim testinin tek ve temel prensibi, sahip olduğunuz her kod yolunu kapsamaktır, böylece kodunuzun yapması gerekeni yaptığından emin olabilirsiniz ve değişiklik ve yeniden düzenleme işlemlerinden sonra bunu yapmaya devam edebilirsiniz. Birim testlerini küçük, basit ve tek amaçlı tutmak faydalı bir hedeftir, ancak temel değildir. API'nizin iki ilişkili yöntemini çağıran bir teste sahip olmak kendi başına sorgulanabilir değildir, aslında belirttiğiniz gibi, genellikle gereklidir. Gereksiz testlere sahip olmanın dezavantajı, yazmak için daha fazla zaman almalarıdır, ancak geliştirme sırasında neredeyse her şey olduğu için, bu her zaman yapmanız gereken bir değiş tokuştur ve en iyi çözüm neredeyse hiçbir zaman uç noktalardan biri değildir.


2

Yazılım test teknikleri son derece çeşitlidir ve bunlar hakkında ne kadar çok eğitim alırsanız, birçok farklı (ve bazen de çelişen) rehberlik görmeye başlayacaksınız. Devam edecek tek bir 'kitap' yok.

Sanırım, şu gibi şeyler söyleyen birim testleri için bazı rehberlikler gördüğünüz bir durumdasınız.

  • Her test tek başına olmalı ve diğer testlerden etkilenmemelidir
  • Her birim testi bir şeyi ve sadece bir şeyi test etmelidir
  • Birim testleri veritabanına çarpmamalıdır

ve bunun gibi. Ve tüm bunlar, 'birim testi' nasıl tanımladığınıza bağlı olarak doğrudur .

'Birim testi'ni şöyle bir şey olarak tanımlayabilirim: "diğer bağımlı bileşenlerden izole edilmiş bir birim kod için bir işlevsellik uygulayan bir test".

Bu tanım altında, yaptığınız şey (testi çalıştırmadan önce bir veritabanına kayıt eklemeyi gerektiriyorsa) hiç de 'birim testi' değil, yaygın olarak 'entegrasyon testi' olarak adlandırılan şeylerden daha fazlasıdır. (Benim tanımımla, gerçek bir birim testi veritabanına çarpmaz, bu yüzden silmeden önce bir kayıt eklemeniz gerekmez.)

Bir entegrasyon testi (örneğin, bir kullanıcı arayüzü gibi birden çok bileşeni kullanır işlevselliği kullanacaktır ve bir veritabanı) ve birim testler için de geçerli olacak rehberlik mutlaka entegrasyon testleri için geçerli değildir.

Diğerlerinin yanıtlarında belirttiği gibi, bazı birim test kılavuzuna aykırı şeyler yapsanız bile yaptığınız şey yanlış olmayabilir. Bunun yerine, her test yönteminde gerçekten neyi test ettiğinizi düşünmeye çalışın ve testinizi tatmin etmek için birden fazla bileşene ihtiyacınız olduğunu fark ederseniz ve bazı bileşenler ön yapılandırma gerektiriyorsa, devam edin ve yapın.

Ancak en önemlisi, birçok tür yazılım testi (birim testleri, sistem testleri, entegrasyon testleri, keşif testleri, vb.) Olduğunu anlayın ve bir türün rehberliğini diğerlerine uygulamamaya çalışmayın.


Yani veritabanından silmeyi test edemeyeceğinizi mi söylüyorsunuz ?
ChrisF

Veritabanına isabet ediyorsanız, bir birim test değil, (tanım gereği) bir entegrasyon testidir. Yani bu anlamda hayır. Bir veritabanından silme işlemini 'birim testi' yapamazsınız. Ne yapabilirsiniz birim test test ettiğiniz kod bazı verileri silmek istenir ne zaman, doğru veri erişim modülü ile etkileşime olmasıdır.
Eric King

Ancak mesele şu ki, bazı kişiler 'birim testi' farklı tanımlayabilirler, bu yüzden 'birim testi' rehberliği uygularken dikkatli olmalıyız, çünkü rehberlik bizim düşündüğümüz şekilde geçerli olmayabilir.
Eric King

1

İşte bu yüzden diğer kılavuzlardan biri arayüz kullanmaktır. Yöntem belirli bir sınıf uygulaması yerine bir arabirim uygulayan bir nesneyi alırsa, kod tabanının geri kalanına bağlı olmayan bir sınıf oluşturabilirsiniz.

Başka bir alternatif alaycı çerçeve kullanmaktır. Bunlar, test ettiğiniz yönteme aktarılabilen bu tür sahte nesneleri kolayca oluşturmanıza olanak tanır. Sahte sınıf için bazı saplama uygulamaları oluşturmanız gerekebilir, ancak yine de gerçek uygulamadan ve testin neyle ilgilendiğinden ayrılma yaratır.


1

Bir testin başarısız olup olmadığını görebileceğiniz gibi, diğeri de başarısız olur, çünkü ikisi de gereklidir.

Yani?

... bu birim test kurallarına aykırı değil mi?

Hayır.

Bunun gibi davaların nasıl ele alınması gerekiyor?

Birkaç test bağımsız olabilir ve hepsi aynı hata nedeniyle başarısız olabilir. Aslında normal. Birçok test - dolaylı olarak - bazı ortak işlevleri test edebilir. Ve ortak işlevsellik bozulduğunda hepsi başarısız olur. Bunda yanlış bir şey yok.

Birim testleri, sınıflar olarak tam olarak tanımlanır, böylece güncelleme ve silme işlemlerini test etmek için kullanılan ortak bir sahte kayıt gibi kodu kolayca paylaşabilirler.


1

Sahte bir çerçeve kullanabilir veya bellek içi veritabanıyla bir 'ortam' kullanabilirsiniz. Sonuncusu, test başlamadan önce testi geçmek için ihtiyacınız olan her şeyi oluşturabileceğiniz bir sınıftır.

Sonuncuyu tercih ediyorum - kullanıcılar bazı verileri girmenize yardımcı olabilir, böylece testleriniz gerçek dünyaya en yakın olur.


Doğru - ancak gerçek veritabanı bağlantısını burada test etmiyorsunuz. Bunun her zaman işe yarayacağını varsaymazsanız - ancak varsayımlar tehlikelidir.
ChrisF
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.