it-swarm.dev

Birim testleri ile neyi test etmelisiniz?

Yeni kolejden çıkıyorum ve önümüzdeki hafta bir yerde üniversiteye başlıyorum. Birim testleri gördük, ama onları çok fazla kullanmadık; ve herkes onlardan bahsediyor, bu yüzden belki biraz yapmalıyım diye düşündüm.

Sorun şu ki, bilmiyorum ne test etmek. Ortak vakayı test etmeli miyim? Edge davası? Bir fonksiyonun yeterince kapsandığını nasıl bilebilirim?

Her zaman bir testin bir fonksiyonun belirli bir vaka için işe yaradığını kanıtlamasına rağmen, fonksiyonun işe yaradığını kanıtlamak tamamen yararsızdır.

128
zneak

Kişisel felsefem şu ana kadar:

  1. Yapabileceğiniz her şeyin ortak durumunu test edin. Bu, bir değişiklik yaptıktan sonra kodun ne zaman kırıldığını size söyleyecektir (bence, otomatik birim testinin en büyük avantajı).
  2. Muhtemelen hatalar olacağını düşündüğünüz alışılmadık derecede karmaşık birkaç kodun Edge vakalarını test edin.
  3. Bir hata bulduğunuzda, düzeltmeden önce kapsaması için bir test senaryosu yazın
  4. Birinin öldürmek için zamanı olduğunda daha az kritik koda Edge durum testleri ekleyin.
124
Fishtoaster

Şimdiye kadar cevapların bolluğu arasında hiç kimse denklik bölümleme ve sınır değer analizi , eldeki sorunun cevabındaki hayati hususlara değinmedi. Diğer tüm cevaplar yararlı olsa da niteldir, ancak burada nicel olmak mümkündür - ve tercih edilir. @fishtoaster, sadece test nicelemesinin kapaklarına göz atmak için bazı somut kılavuzlar sağlar, ancak denklik bölümleme ve sınır değer analizi daha iyisini yapmamıza izin verir.

denklik bölümlendirmesinde , tüm olası girdi kümesini beklenen sonuçlara göre gruplara ayırırsınız. Bir gruptan herhangi bir girdi eşdeğer sonuçlar verecektir, bu nedenle bu gruplara denklik sınıfları denir. (Eşdeğer sonuçların değil aynı sonuçlar anlamına geldiğini unutmayın.)

Basit bir örnek olarak, küçük harfli ASCII karakterleri büyük harfli karakterlere dönüştürmesi gereken bir program düşünün. Diğer karakterler kimlik dönüşümünden geçmelidir, yani değişmeden kalmalıdır.

| # |  Equivalence class    | Input        | Output       | # test cases |
+------------------------------------------------------------------------+
| 1 | Lowercase letter      | a - z        | A - Z        | 26           |
| 2 | Uppercase letter      | A - Z        | A - Z        | 26           |
| 3 | Non-alphabetic chars  | [email protected]#,/"... | [email protected]#,/"... | 42           |
| 4 | Non-printable chars   | ^C,^S,TAB... | ^C,^S,TAB... | 34           |

Son sütun, hepsini numaralandırırsanız test senaryolarının sayısını bildirir. Teknik olarak, @ fishtoaster kuralı 1'e göre 52 test vakası eklersiniz - yukarıda verilen ilk iki satır için olanların tümü "ortak vaka" altına girer. @ fishtoaster kuralı 2, yukarıdaki 3. ve 4. satırlardan bir kısmını veya tamamını da ekler. Ancak denklik bölümleme testi ile her bir denklik sınıfında herhangi bir test durumu yeterlidir. "A" veya "g" veya "w" seçerseniz aynı kod yolunu test edersiniz. Böylece, 52+ yerine toplam 4 test vakanız olur.

Sınır değer analizi hafif bir ayrıntılandırma önerir: temelde bir denklik sınıfının her üyesinin, eşdeğer olmadığını gösterir. Yani, sınırlardaki değerler kendi başlarına bir test vakasına layık görülmelidir. (Bunun kolay bir gerekçesi rezil tek tek hata !) Böylece, her denklik sınıfı için 3 test girişi olabilir. Yukarıdaki girdi alanına bakıldığında ve ASCII değerler) bilgisiyle - bu test senaryosu girişleriyle karşılaşabilirim:

| # | Input                | # test cases |
| 1 | a, w, z              | 3            |
| 2 | A, E, Z              | 3            |
| 3 | 0, 5, 9, !, @, *, ~  | 7            |
| 4 | nul, esc, space, del | 4            |

(Orijinal eşdeğerlik sınıfı tanımlarınızı yeniden düşünmek isteyebileceğiniz anlamına gelen 3'ten fazla sınır değeri alır almaz, bu onları düzeltmek için geri dönmediğim kadar basitti.) Böylece, sınır değer analizi bizi sadece Kapsamlı test yapmak için 128 test vakasına kıyasla, tam kapsamlı güvene sahip 17 test vakası. (Kombinatoriklerin kapsamlı testlerin herhangi bir gerçek dünya uygulaması için mümkün olmadığını belirttiğini belirtmiyoruz!)

68
Michael Sorens

Muhtemelen benim görüşüm çok popüler değil. Ancak, birim testlerle ekonomik olmanızı öneririm. Çok fazla birim testiniz varsa, gerçek kodlama yerine testlerin sürdürülmesiyle zamanınızın yarısını veya daha fazlasını kolayca harcayabilirsiniz.

Bağırsakta kötü hissettiğiniz şeyler veya çok önemli ve/veya temel şeyler için testler yazmanızı öneririm. IMHO birim testleri, iyi mühendislik ve savunma kodlamasının yerini tutmaz. Şu anda az çok kullanılamaz bir proje üzerinde çalışıyorum. Gerçekten stabildir ancak refaktör için bir acıdır. Aslında hiç kimse bir yıl içinde bu koda dokunmadı ve dayandığı yazılım yığını 4 yaşında. Neden? Birim testleri ile karmaşık olduğu için, kesin olarak: Birim testleri ve otomatik entegrasyon testleri. (Salatalık ve benzerlerini hiç duydunuz mu?) Ve işte en iyi kısmı: Bu (henüz) kullanılamaz yazılım parçası, çalışanları test odaklı geliştirme sahnesinde öncü olan bir şirket tarafından geliştirildi. : D

Benim önerim:

  • Testler yazmaya başlayın sonra temel iskeleti geliştirdiniz, aksi takdirde yeniden düzenleme acı verici olabilir. Diğerleri için geliştiren bir geliştirici olarak, gereksinimleri en başından itibaren asla elde edemezsiniz.

  • Birim testlerinizin hızlı bir şekilde yapılabildiğinden emin olun. Entegrasyon testleriniz varsa (salatalık gibi) biraz daha uzun sürerse sorun olmaz. Ama uzun süren testler eğlenceli değil, inanın bana. (İnsanlar C++ 'ın daha az popüler hale gelmesinin tüm nedenlerini unutuyor ...)

  • Bu TDD malzemelerini TDD uzmanlarına bırakın.

  • Ve evet, bazen beklenmedik durumları beklediğiniz yere bağlı olarak Edge vakalarına, bazen de ortak vakalara konsantre olursunuz. Her zaman beklenmedik bir şey bekliyorsanız, iş akışınızı ve disiplinizi gerçekten yeniden düşünmelisiniz. ;-)

20
Philip

İlk olarak Test Odaklı Geliştirme ile test ediyorsanız, kapsamınız% 90 veya daha yüksek bir aralıkta olacaktır, çünkü bunun için başarısız bir birim testi yazmadan işlevsellik eklemeyeceksiniz.

Eğer gerçeği sonra test ekliyorsanız, o zaman Eski Kod ile Etkili Çalışma by Michael Feathers bir kopyasını almak ve bazı bakmak hem kodunuza testler ekleme hem de kodunuzu daha test edilebilir hale getirmek için yeniden düzenleme yöntemleri.

8
Paddyslacker

Test Odaklı Geliştirme uygulamalarını izlemeye başlarsanız, bunlar kılavuz sizi süreç boyunca sıralar ve ne test edeceğiniz doğal olarak gelir. Başlamak için bazı yerler:

Testler önce gelir

Testleri yazmadan önce asla kod yazmayın. Açıklama için bkz. Kırmızı-Yeşil-Refactor-Tekrar.

Regresyon testlerini yazın

Ne zaman bir hata ile karşılaşırsanız, bir testcase yazın ve başarısız olduğundan emin olun . Arızalı bir test çantasından bir hatayı yeniden oluşturamazsanız, gerçekten bulamadınız.

Kırmızı-Yeşil-Elden Geçirme-tekrarlayın

Kırmızı: Uygulamaya çalıştığınız davranış için en temel testi yazarak başlayın. Bu adımı, üzerinde çalışmakta olduğunuz sınıfı veya işlevi kullanan bazı örnek kodlar yazmayı düşünün. Sözdizimi hatası derlediğinden/içermediğinden ve başarısız olduğundan emin olun. Bu açık olmalı: hiç kod yazmadınız, bu yüzden başarısız olmalı, değil mi? Burada öğrenilmesi gereken en önemli şey, testin en az bir kez başarısız olduğunu görmezseniz, geçerse, bazı sahte nedenlerden dolayı yaptığınız bir şey nedeniyle bunu yaptığından asla emin olamazsınız.

Yeşil: Testin geçmesini sağlayan en basit ve aptal kodu yazın. Akıllı olmaya çalışmayın. Açık bir Edge vakası olduğunu görseniz bile, test hesaba katılırsa, don't bununla başa çıkmak için kod yazın (ama Edge vakasını unutmayın: buna ihtiyacınız olacak sonra). Fikir, yazdığınız her kod parçasının, her if, her try: ... except: ... bir test vakası tarafından gerekçelendirilmelidir. Kodun zarif, hızlı veya optimize edilmiş olması gerekmez. Sadece testin geçmesini istiyorsun.

Refactor: Kodunuzu temizleyin, yöntem adlarını doğru alın. Testin hala geçip geçmediğine bakın. Optimize. Testi tekrarlayın.

Tekrarlayın: Testin kapsamadığı Edge vakasını hatırlıyorsunuz, değil mi? Şimdi büyük anı. Bu durumu kapsayan bir testcase yazın, başarısız olduğunu izleyin, bazı kodlar yazın, geçtiğini görün, refactor.

Test sizin kod

Belirli bir kod parçası üzerinde çalışıyorsunuz ve bu tam olarak test etmek istediğiniz şey. Bu, kütüphane işlevlerini, standart kütüphaneyi veya derleyicinizi test etmemeniz gerektiği anlamına gelir. Ayrıca, "dünya" test kaçının. Buna şunlar dahildir: harici web API'lerini, bazı veritabanı yoğun şeyleri arama vb.

6
Ryszard Szopa

Birim testleri için, yapmak için tasarlandığını yaptığını test etmeye başlayın. Yazdığınız ilk vaka bu olmalı. Tasarımın bir parçası "Önemsiz olarak geçerseniz bir istisna atmalıdır" ise, bunu tasarımın bir parçası olduğu için de test edin.

Bununla başlayın. Testin en temelini yapma konusunda deneyim kazandıkça bunun yeterli olup olmadığını öğrenmeye ve kodunuzun test gerektiren diğer yönlerini görmeye başlayacaksınız.

3
Bryan Oakley

Hisse senedi cevabı "muhtemelen kırılabilecek her şeyi test etmek" .

Kırmak için çok basit olan ne? Veri alanları, beyin-ölü mülk erişimcileri ve benzer kaynama tavanı. Başka herhangi bir şey muhtemelen bir gereksinimin tanımlanabilir bir kısmını uygular ve test edilmesinden fayda sağlayabilir.

Elbette, kilometreniz - ve çalışma ortamınızın uygulamaları - değişebilir.

0
Jeffrey Hantin