Testler nasıl test edilir?


53

Kodumuzu daha doğru hale getirmek için test ediyoruz (aslında, yanlış olma olasılığı daha düşüktür ). Bununla birlikte, testler de koddur - hatalar da içerebilirler. Eğer testleriniz bozuksa, kodunuzu daha iyi hale getiremezler.

Testlerde üç olası hata türü düşünebilirim:

  1. Mantıksal hatalar, programcı eldeki görevi yanlış anladığında ve testler yapması gerektiğini düşündüğü şeyi yaptığında yanlış olur;

  2. Temel test çerçevesindeki hatalar (örneğin, sızdıran alaycı bir soyutlama);

  3. Testlerdeki Hatalar: Test, programcının düşündüğünden biraz farklıdır.

Tip (1) hatalarını engellemek imkansız görünüyor (programlayıcı sadece ... daha akıllıca olmadıkça). Ancak, (2) ve (3) izlenebilir olabilir. Bu tür hatalarla nasıl başa çıkıyorsunuz? Onlardan kaçınmak için özel stratejileriniz var mı? Örneğin, yalnızca test yazarının önayarlarını kontrol eden bazı özel "boş" testler yazıyor musunuz? Ayrıca, kırık bir test vakasında hata ayıklamaya nasıl yaklaşıyorsunuz?


3
Alay etmeyle ilgili okuduğum her tanıtım bu problemi vuruyor gibi görünüyor. Bir şeyleri alay etmeye başladığınızda, testler her zaman test ettikleri koddan daha karmaşık görünüyor. Açıkçası, gerçek dünya kodunu test ederken bu durum daha düşük bir ihtimaldir, ancak öğrenmeye çalıştığınız zaman bu durum oldukça azdırıcıdır.
Carson63000

@ Carson63000 Test edilen sahte bir şeyi test etmek basit bir testse , karmaşıklık bölünmüş ve kontrol altındadır (sanırım).
mlvljr

13
Peki test testlerini nasıl test edersiniz?
ocodo

+1. Öğe 1, bir gereksinim hatası olabilir. Sadece gereksinimleri gözden geçirerek önlenebilir. Muhtemelen programcıların ellerinden de
çıkarsa

@codo: Watchers'ı izlediğiniz şekilde. :)
Greg Burghardt

Yanıtlar:


18

Testler zaten test edildi. Testler hatalardan korunan tasarım gereğidir, çünkü test sadece kod ve beklentilerimiz arasındaki farkları tespit eder. Sorun varsa, bir hatamız olur. Hata kodda veya testlerde aynı olasılıkta olabilir.

  1. Hem kodunuza hem de testlerinize aynı hatayı eklemenizi önleyen bazı teknikler var:

    1. Müşteri uygulayıcıdan farklı bir kişi olmalıdır.
    2. Önce testleri ve sonra kodu yazın (Test Odaklı Geliştirme'deki gibi).
  2. Temel platformu test etmeniz gerekmez. Testler sadece sizin tarafınızdan yazılmış kodu uygulamakla kalmaz, aynı zamanda kodu platformdan da çalıştırır. Test platformunda hata yakalamak istemeseniz de, platformda her zaman bir hatayı gizleyen kod ve testler yazmak çok zordur, başka bir deyişle, hem test / kodunuzda sistematik bir hata olması çok zordur. Platformda ve yarattığınız her testte olasılık azaltılır. Bunu yapmayı deneseydin bile çok zor bir işin olurdu.

  3. Testlerde hatalar olabilir, ancak testler geliştirilen kodla test edildiği için genellikle kolayca yakalanırlar. Kod ve testler arasında kendinden zorlama geribildirimi vardır. Her ikisi de belirli bir arabirim çağrısının nasıl davranması gerektiği konusunda öngörüde bulunur. Cevap farklıysa, kodda bir hata olması gerekmez. Testte de bir hata olabilir.


Çok güzel cevap. Testler ve kod arasında kendi kendini güçlendiren bir döngü fikrini ve altta yatan platformda sürekli hataları gizleyen testler yazmanın zor olacağı gözlemini severim.
Ryszard Szopa

Bu, gerçek kodun ne yapması gerektiği hakkındaki hatalı varsayımlara dayanarak testlerin yapılmasını engellemez. Bu da test sırasında tespit edilemeyen çok kötü hatalara neden olabilir. Bunu engellemenin tek yolu, üçüncü tarafça yapılan testlerin, kuruluş ile gerçek kodu yazmasıyla hiçbir ilgisi olmayan yazılı olarak yapılmasıdır, bu nedenle gereksinim belgelerini yorumlama konusunda birbirlerinin düşüncelerini "kirletemez".
17'de

24

Bireysel testleri olabildiğince küçük (kısa) yapmayı deneyin.

Bu, ilk etapta bir hata yaratma şansını azaltmalıdır. Bir tane oluşturmayı başarsanız bile, bulmak daha kolaydır. Birim testlerinin başarısızlık ve sapmalara karşı düşük toleransla küçük ve spesifik olduğu varsayılmaktadır.

Sonunda, muhtemelen sadece bir deneyim meselesi. Ne kadar çok test yazarsanız, o kadar iyi olursanız, kötü testler yapma şansınız o kadar az olur.


3
Testlerin biraz karmaşık bir kuruluma ihtiyacı varsa? Bazen bu tür şeyler senin kontrolünde değil.
Ryszard Szopa 12:10

Sanırım karmaşık kurulum testlerin "başlangıç ​​koşulu". Bu başarısız olursa, tüm testleriniz başarısız olmalıdır. Aslında, şu anda böyle bir proje üzerinde çalışıyorum ve birim testlerini hiç kullanmayan insanlar sürekli olarak aynı şeyi sordular. Ne kadar gerçek birim testlerini açıkladığımızı söyleyene kadar :) O zaman muazzam olmasına rağmen yapılabileceğini anladılar. Projenin karmaşıklığı.
dr Hannibal Lecter

Bu "başlangıç ​​koşulunun" karşılanıp karşılanmadığını kontrol etmenin en iyi yolu tam olarak sorum. Bunun için ayrı bir test yazıyor musunuz? Veya bu durum doğru olmazsa testlerin bozulacağını varsayalım. Kurulum "felaketle ilgili" kötü değil, sadece biraz kapalı olduğunda durum ne olacak?
Ryszard Szopa

2
İlk şartlar doğru değilse testleriniz başarısız olmalıdır, hepsi bu. Devlet ne zaman A, işte sonucu bekliyoruz B. Eğer devletiniz yoksa A, test başarısız olmalıdır. Bu noktada neden başarısız olduğunu, kötü başlangıç ​​koşullarını veya kötü bir testi araştırabilirsiniz, ancak her iki durumda da başarısız olması gerekir . Eğer "biraz kapalı", dedikleri gibi, olsa bile (yani "A" => "B", "a" => "b"ama asla "a" => "B"veya test kötüdür).
dr Hannibal Lecter

19

Bir taktik, testi test ettiği koddan önce yazmak ve doğru sebepten önce testin başarısız olmasını sağlamaktır. TDD kullanıyorsanız , en azından bu düzeyde test testi yaptırmanız gerekir.

Bir test odasının kalitesini test etmenin daha ayrıntılı bir yolu mutasyon testi kullanmaktır .


2
Ve testin doğru sebepten dolayı başarısız oluyor .
Frank Shearar

@ Frank - Evet. Bunu cevaba ekleyeceğim.
Don Roby,

Ve test edilecek yeni davranış için yeni bir test ekliyorsunuz. Mevcut testlere ekleme.
Huperniketes

@DonRoby, Mutasyon testini pratikte faydalı buldunuz mu? Bununla ilgili test durumlarınızda hangi eksiklikleri buldunuz?
dzieciou

4

# 1 ve # 3 için: Ünite testleri hiç mantık içermemelidir, eğer öyleyse, muhtemelen ünite testinizde birden fazla şeyi test ediyorsunuzdur. Ünite testi için en iyi uygulama, ünite testi başına sadece bir test yapılmasıdır.

Ünite testleri nasıl iyi yazılacağı hakkında daha fazla bilgi için Roy Osherove tarafından bu videoyu izleyin .


reklam # 3 - Testlerin mümkün olduğunca basit olması ve herhangi bir mantık içermemesi gerektiğine katılıyorum. Ancak, ihtiyaç duyacağı nesneleri oluştururken testin kurulum aşamasını düşünün. Biraz yanlış nesneler oluşturabilirsiniz. Bu düşündüğüm türden problemler.
Ryszard Szopa

'Biraz yanlış nesneler' derken, nesne durumunun doğru olmadığı veya nesnenin gerçek tasarımının doğru olmadığı anlamına mı geliyorsunuz? Nesne durumu için muhtemelen geçerliliğini kontrol etmek için testler yazabilirsiniz. Tasarım yanlış ise test başarısız olmalıdır.
Piers Myers

3

# 1 açısından - Ben bu şeyler için eşleştirmek / kod incelemesi için iyi bir fikir olduğunu düşünüyorum. Ön varsayımları yapmak veya sadece yanlış şeyler yapmak kolaydır, ancak testinizin ne yaptığını açıklamak zorunda kalırsanız, amacın ne olduğunu, yanlış hedefe nişan almayı seçmeniz daha olasıdır.


2

Ünite testi yapmayı bırakmanın bir noktası olmalı. Çizginin ne zaman çizileceğini bilmeli. Test vakalarını test etmek için test senaryoları yazmalı mıyız? Sınama sınavlarına yazılan yeni sınavlardan ne haber? Onları nasıl test edeceğiz?

if (0 > printf("Hello, world\n")) {
  printf("Printing \"Hello, world\" failed\n");
}

Düzenleme: Yorum tarafından önerilen açıklama ile güncellendi.


-1 Ne? Bunun alakası yok gibi görünüyor.
alternatif

2
Ünite testini denemenin ne zaman durması gerektiğinin bir noktası olmalı. Çizgiyi ne zaman çizeceğini bilmelisin. Test vakalarını test etmek için test senaryoları yazmalı mıyız? Sınama sınavlarına yazılan yeni sınavlardan ne haber? Onları nasıl test edeceğiz?
aufather

2
Süreç Beyin ifadenizi ekstrapolasyona çalışırken EInfiniteRecursion'ı artırdı ...
Mason Wheeler

Cevabınızı yorumunuzla değiştirirseniz +1
not edin - 0

3
Adil olmak gerekirse, örneğiniz saman bir adam. Printf () alt sistemini bir C kütüphanesinde test ediyorsunuz, printf () öğesini çağıran programı değil. Bununla birlikte, bir noktada bir testin özyinelemeli testini bozması gerektiğine katılıyorum.
Tim Post

2

Hey.
Başvurular yapmanız gerekiyor:

  • Ürününüz
  • Bu ürün için testiniz.

Ürününüze karşı testler yaparken, aslında testin kendisinde değil , ürününüz ve testleriniz arasındaki etkileşimde bulunmazsınız . Test başarısız olursa uygulamanın bir hatası olduğunu söylemez. Ürün ve test arasındaki etkileşimin başarılı olmadığını söylüyor . Şimdi neyin yanlış gittiğini belirlemek senin işin. Ya olabilir:

  • uygulama beklediğiniz gibi davranmıyor (bu beklenti testinizde ifade edildi)
  • uygulama doğru davranıyorsa, bu davranışı doğru şekilde belgelendirmediniz (testlerinizde)

Benim için başarısız testler basit bir geri bildirim değil, bu ve bu yanlış . Bu tutarsızlık göstergesidir ve isteğin yanlış gittiğini kontrol etmek için ikisini de incelemeliyim. Sonunda, uygulamanın doğru olduğunu onaylamaktan sorumluyum, testler, kontrol edilmeye değer alanları vurgulamak için sadece bir araçtır.

Testler sadece uygulamanın bazı kısımlarını kontrol ediyor. Uygulamayı test ederim, testleri test ederim.


2

Testler böcekleri barındıracak kadar "akıllı" olmamalıdır.

Yazdığınız kod bir takım özellikler uygular. (Eğer X, ardından Y, Z olmadığı sürece Q, vb.). Testin gerçekleştirilmeye çalışılması gereken, Z'nin Z olmadığı sürece X'in gerçekten Y olduğunu belirlemektir. Bu, testin yapması gereken tüm işlemlerin X ayarlanması ve Y'nin doğrulanması anlamına gelir.

Ama bu tüm davaları kapsamıyor, muhtemelen diyorsunuz ve haklısınız. Ancak eğer testi Z ile yapmıyorsanız, X'in sadece Y ile yapması gerektiğini bilecek kadar "akıllı" hale getirirseniz, testte iş mantığını yeniden uygularsınız. Bu, aşağıda biraz daha derinlere ineceğimiz için sorunlu. İlk testinizi "daha akıllı" hale getirerek kod kapsamını iyileştirmemelisiniz, bunun yerine X ve Z'yi ayarlayan ve Q'yi doğrulayan ikinci bir aptal test eklemelisiniz. bazen mutlu yol olarak da bilinir) ve kenar kasayı ayrı bir test olarak kapsayan biri.

Bunun bir çok nedeni vardır, her şeyden önce başarısız bir testin iş mantığındaki bir hatadan mı yoksa testlerdeki bir hatadan mı kaynaklandığını nasıl belirlersiniz? Açıkçası cevap, eğer testler olabildiğince basitse, böcekleri barındırma olasılığı çok düşüktür. Testlerinizin test edilmesi gerektiğini düşünüyorsanız, hatalı test yapıyorsunuzdur .

Diğer nedenler arasında yalnızca çabayı çoğaltmanız (daha önce de belirttiğim gibi, tüm olasılıkları tek bir testte uygulamak için yeterince akıllı bir test yazmak) temel olarak, gereksinimler değişirse o zaman testlerin yeni gereksinimleri yansıtacak şekilde değiştirilmesi kolay olmalı, testler bir tür dokümantasyon görevi görür (test edilen ünitenin spesifikasyonunun ne olduğunu söylemenin resmi bir yoludur), vb.

TL: DR: Testlerinizin test edilmesi gerekiyorsa, yanlış yapıyorsunuz demektir. Aptal testleri yaz .


0

Cevap değil (yorum yapma yetkisine sahip değilim), ancak test senaryoları geliştirmek için başka nedenleri unuttum mu diye merak ediyordum ...
Testlerdeki tüm hataları bir kez çözdüğünüzde, uygulamanızı kolayca regresyon testine sokabilirsiniz. Otomatik test paketleri entegrasyondan önce sorunları daha önce bulmanıza yardımcı olacaktır. Gereksinimlerdeki değişikliklerin test edilmesi nispeten daha kolaydır, çünkü değişiklikler daha yeni olabilir, eski test vakalarının değiştirilmiş hali ve eski davalar başarısızlıkları tespit etmeye devam eder.


0

Kısa cevap: Üretim kodu testleri test eder .

Bunu , ekonomide kullanılan kredi / borç modeliyle karşılaştırın . Mekaniği çok basittir - Kredi borçtan farklıysa, yanlış bir şey var.

Aynısı birim testleri için de geçerlidir - Bir test başarısız olursa bir şeyin yanlış olduğunu gösterir. Üretim kodu olabilir, ancak test kodu da olabilir! Bu son kısım önemliyse.

Tip (1) hatalarınızın birim testlerinde bulunamayacağını unutmayın. Bu tür hataları önlemek için başka araçlara ihtiyacınız var.

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.