TEST kodumu nasıl test etmeliyim?


22

Çoğu yazılım geliştiricisinin üzerinde hemfikir olduğu şeylerden biri, test etmediğiniz sürece doğru şekilde çalışmak için koda güvenmemeniz gerektiğidir. Test etmezseniz, yalnızca yolda daha fazla çalışmanıza neden olacak gizli hataları olabilir.

Normal kodumu nasıl test edeceğimi anlıyorum, ancak hataları bulunduğunda etkili bir şekilde bulup rapor edebildiğinden emin olmak için test kodumu nasıl test etmeliyim? Şahsen, olmaması gerektiği zaman geçecek hatalı test vakalarını yazabilecek kadar aptal oldum, bu yüzden ilk başta benim yazma testlerimin amacını yendi. Neyse ki, zaman içinde hataları bulup düzelttim, ancak test mantrasına göre, çalıştığından emin olmak için hiçbir test setinin kendi testleri olmadan tamamlanmış gibi gözükmüyor.

Bana öyle geliyor ki, bunu yapmanın en iyi yolu, testin hata kodu için başarısız olmasını sağlamaktır. testler 'iş'. Bu beni ikinci soruma getiriyor: Test vakalarına yakalandıklarından emin olmak için böcekleri tanıtmanın iyi yolları nelerdir? Sadece rastgele emin bir yanlış dal yapmak, ifadeleri açıklama mı if-elsebenim testler yakalayacak memnun kalana kadar, kendi durumunu olumsuzlaştırılmasıyla koþulur, vb yan etkilere sahip kod yürütme sırasını değiştirmek enortak böcek? Profesyonel geliştiriciler testlerinin gerçekte yapmaları gerekeni yaptığını nasıl doğrularlar? Testlerin işe yaradığını mı varsayıyorlar, yoksa test etmek için de zaman ayırıyorlar mı? Eğer öyleyse, testleri nasıl test ederler?

İnsanların testlerini test etmek ve daha sonra testlerini test etmek için çok fazla zaman harcamasını önermiyorum. Testleri gerçekten gerçek kodları asla yazmıyorlar ama biraz faydalanabileceğimi düşündüğüm aptalca şeyler yaptım 'meta-test' den ve bunun için en iyi yolun ne olduğunu merak ediyordum. : D

* 'Hatasız' kodu test ederken testin başarılı olup olmadığını kontrol edebilirim, ancak kodu test için bir özellik olarak kullanmak oldukça geriye dönük görünüyor ...


Birim testlerinize güvenmiyor gibisiniz - büyük olasılıkla test yazma konusunda çok fazla deneyiminiz olmadığı için? Bu durumda, daha fazla test yazmak ve farklı bir sonuç beklemek mantıksız olacaktır . Yaptığın şeyi yapmaya devam et, yapabildiğin kadar titiz ol (başarısızlığın yanı sıra başarı için de test et) ve yakında ünite testlerin kendileri için ödeme yapmaya başlayacak - ve onlara olan güvenin artacak.
MattDavey


Daha fazla alet kullanmadan önce, gerçek aletlerinizi daha iyi kullanın . Daha az test yazın, ancak daha verimli ve daha iyi yazılı testler yazın. Anlamadığınız bir şeye güvenemezsiniz.
Steve Chamaillard

Yanıtlar:


16

TDD için standart akış:

  1. Başarısız bir test yazın. (Kırmızı)
  2. Geçmesini sağlayan en küçük kod değişikliğini yapın (Yeşil)
  3. Refaktör (Yeşil tutulması)

Bu durumda, testlerinizin testi, adım 1'dir - herhangi bir kod değişikliği yapmadan önce testin başarısız olduğundan emin olun.

Sevdiğim diğer bir test, bazı kodları silip silip başka bir yolla tekrar uygulayabilmeniz ve testlerinizin silindikten sonra başarısız olması, ancak farklı bir algoritma ile çalışıp çalışmamalarıdır.

Her şeyde olduğu gibi sihirli mermi yoktur. Gerekli bir testi yazmayı unutmak, bir geliştiricinin kodu yazmayı unutmak kadar yapması kolaydır. En azından ikisini birden yapıyorsanız, ihmalinizi keşfetmek için iki kat daha fazla fırsatınız var.


4
Çifte defter tutma: Birim testleri üretim kodunu test eder ve bunun tersi de geçerlidir. Aynı sorunu belirtmenin iki farklı yolu vardır. İkili defter tutma gibi, işlemlerinizi iki farklı şekilde kaydettiğiniz ve her ikisinin de aynı toplamları elde etmesi gerektiği gibi.
EricSchaefer

Soru, adım 2, kodu hala buggy olsa bile testi yeşil hale getirdiğinde ortaya çıkan problemdir. Basit örnek: bir işaretçiyi boş olmayan bir liste nesnesine döndürmesi gereken bir işleve sahipsiniz. Testiniz işaretçinin null1. adımda başarısız olup olmadığını test eder . Boş bir liste döndürerek geçtiği en küçük kod değişikliğini yaparsınız. Test şimdi "yeşil" çünkü iki böcek var.
Christian Hackl,

@HristianHackl bu gelişme aşamasında mükemmel bir uygulama! Beklenen davranışı daha da belirtmek için ilk önce başarısız olan bir (veya daha fazla) testi eklemeniz gerekir. Daha sonra bu testleri yeşil yaparak uygularsınız.
Andy,

@Andy: Hem kodda hem de testte bir hata yaşadığımda bunun mükemmel bir uygulama olduğunu ve bir diğerini fark etmemi engellediğimi açıklamaya özen gösterin? (Koddaki hata, boş bir listenin döndürülmesi ve testteki hata ise nullboş olup olmadığını kontrol
etmemdir

@HristianHackl boş çek göre haklısın. Bu, aslında, bir testte de yapılmalıdır. Gereksinimlerinizi testlere dönüştürdüğünüzde, adım adım, hata için çok az yer var. Spesifikasyona uymadığınız zamanlar hariç (boş olmayan bir kontrole bakmak gibi).
Andy

9

Bir yaklaşım, Jester gibi bir araç kullanarak Mutasyon Testi'dir :

Jester kodunuzda bazı değişiklikler yapar, testlerinizi çalıştırır ve testler başarılı olursa Jester neyin değiştiğini söyleyen bir mesaj görüntüler.


4

Testler için testler? O yola gitme. O zaman muhtemelen testler için testler ve testler için testler için testler yapmanız gerekir ... nerede duruyorsunuz?

Genel test akışı bu şekilde devam eder ve geliştirici olarak zamanınızın çoğunu 1-3 puanlarına harcayacaksınız:

  1. kod
  2. Birim testleri
  3. Entegrasyon testleri
  4. Sistem / diğer otomatik
  5. QA / insan test cihazları

2 dakika harcarsam koduna hatalar ekleyerek (...)

Sonunda kodunuz kendi hatalarını "büyütecek", onları elle tanıtmakla zaman kaybetmeyin. Bahsetmiyorum bile, gerçekten de bir hata olduğunu bildiğin bir şey mi var? Hatalar gelecek, bu konuda endişelenmem.

İfadeleri rasgele yorumlamalı mıyım, bir if-başka şubesinin yanlış koşulu durumunu koşullandırarak kontrol etmeliyim (...)

Bu aslında ne düşündüğünüzü test edip etmediğinizi doğrulamak için uygun bir yaklaşımdır. "Test için sınama testi" ile aynı sorundan muzdarip olmasının her zaman o kadar iyi olduğunu sanmıyorum : ne zaman kodları değiştirmeyi bıraktığınızı bildiğinize göre% 100 test yapıyorsunuz?

Klasik pragmatik programcının tavsiyelerinin tüm zamanları hatırlanması da güzel bir şey - buna ihtiyacınız olmayacak . Çevik olun, görünebilecek veya görünmeyen varsayımlar yerine gerçek hatalar için testler ve kodlar yazın.


3
Kodumun kendi hatalarını ürettiği için endişelenmiyorum, testlerim gerçekleştiğinde onları yakalama konusunda endişeleniyorum. Testlerim hatalıysa, işlerini yapmazlar ve hala var olduklarında belirli bir hata sınıfından kurtulduğumu düşünürüm, sadece işimi zorlaştırırım çünkü yanlış test sonuçlarına bakıyorum (başarısız olmaları gerektiği zaman geçin).
Gordon Gustafson

@ CrazyJugglerDrummer: Testleriniz kesin olan tüm hataları yakalayamıyor. Bu amaca hizmet etmiyorlar - QA'nın girdiği yer burasıdır. Bunu yaparlarsa, kaynak kodu değişmediyse yazılımın hiç görmediği anlamına gelir.
km

3

Yapım gereği, fonksiyonel kod ve test kodu, biri diğerine karşı test edilir. Bir problem kalıyor: ortak mod hataları durumunda, fonksiyonel koddaki bir hata test kodundaki bir hata ile gizlendiğinde. TDD bu etkiye karşı bağışıklık kazanmaz. Bu nedenle, bu olasılığı azaltmak için test genellikle farklı kişiler tarafından çoklu seviyelerde gerçekleştirilir.


0

Ünite testinizi yazarken bir kez hata ayıklayıcısında test edersiniz. O zaman onu rahat bırak ve unut gitsin. Burada sorun yok.

Bunu düşün. Birim testinin amacı nedir? Ana programınızda yapacağınız sayısız değişiklikten herhangi biri yanlışlıkla programdaki mantığı değiştirdiğinde sizi bilgilendirir. Buna sahip olmak istiyorsunuz çünkü herhangi bir değişikliğin potansiyel olarak bir şeyleri kırabileceğini biliyorsunuz. Bu nedenle, testinizi test etmezseniz tam olarak bir sorun yaşanmaz: programınızın mantığını bilerek değiştirene kadar testinizle uğraşmazsınız (ki bu testi tekrar ziyaret etmenizi ve bir kez daha test etmenizi gerektirir); Testin yanlışlıkla kırılması muhtemel değildir.


-2

Orada test bir mutasyon olduğunu değerlendirir ve önlemler testin uygunluğu ve kalite.

Bunu "test" in kendisini değerlendirmek için kullanabiliriz.

Kısaca, TestA'yı test ederek değerlendirebiliriz (TestA) TestA koduyla mutasyon kodları arasındaki farkı bulabilir (çok benzer fakat orijinal kodla biraz farklı kod).

TestA, kod ile mutasyon kodları arasındaki farkı bulamazsa, TestA'nın orijinal kodu test etmek için çok kaba düzenlemelere sahip olduğu anlamına gelir.

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.