Ünite testleri gerçekten dokümantasyon olarak kullanılıyor mu?


22

'Ünite testleri, test edilen kodun dokümantasyonu için çok önemli bir kaynaktır' damarı içindeki ifadeleri okuduğum sayıyı sayamıyorum. Onların doğru olduğunu inkar etmiyorum.

Ama şahsen, kendimi onları dokümantasyon olarak kullanırken hiç bulamadım. Kullandığım tipik çerçeveler için yöntem bildirimleri davranışlarını belgeliyor ve ihtiyacım olan tek şey bu. Ve birim testlerinin bu dokümantasyonda belirtilen her şeyi ve ayrıca bazı dahili maddeleri yedeklediğini varsayarım, bir tarafta dukumülasyonu çoğaltır, diğer yandan ilgisiz bazı şeyler ekleyebilir.

Öyleyse soru şudur: Birim testleri ne zaman dokümantasyon olarak kullanılır? Yorumlar ne zaman her şeyi kapsamıyor? Geliştiriciler tarafından kaynak genişletilerek? Ve belgelerin kendisinin gösteremeyeceği yararlı ve alakalı olabilecekleri neler ortaya koyuyor?


4
Ünite testini doğrudan dokümantasyon olarak kullanmayı düşünmedim. Birim testlerin çoğu zaman okunaksız olduğunu düşünüyorum, çünkü çoğu geliştirici açık bir şekilde yazmak için zaman ayırmıyor.
süpermen

10
Yorumlar yanlış olabilir.

2
Özellikle ünite testleri hakkında soru sorduğunuzu biliyorum, ancak aynı zamanda entegrasyon / sistem testlerinin de gerçekten yararlı bir dokümantasyon olduğunu, sadece farklı bir düzeyde
jk.

3
“Birim deneyleri” olarak daha iyi nitelendirilebilecek birim testlerini gördüm. Dış etkenlere bağımlılıkları, onları işe yaramaz hale getirecek kadar büyüktü. Onlar da çok net değildi. (Evet, onları daha iyi olmaları için yeniden yönlendirmek için uzun vadeli bir hedefim var, ancak başka şeyleri de yapıyorum…)
Donal Fellows

4
@Ant birim testleri gerçek kodu çağırır ve beklenen cevabı belgeler ve gerçek cevabı karşılaştırır. Çağrılan kodun doğru olup olmadığı konu değil - testler nasıl çağrılacağını belgeler.

Yanıtlar:


17

Bunlar ABSOLUTE Referans Belgeleri DEĞİLDİR

Aşağıdakilerin çoğunun, testler gibi (daha az uygulanabilir olsa da) kodla senkronize edilemeyecekleri için yorumlar için de geçerli olduğunu unutmayın.

Sonuçta, kodu anlamanın en iyi yolu okunabilir çalışma koduna sahip olmaktır .

Mümkünse ve kablolu olmayan düşük seviye kod bölümleri veya özellikle zor koşullar yazmıyorsanız, ek belgeler çok önemli olacaktır.

  • Testler eksik olabilir:
    • API değişti ve test edilmedi.
    • Kodu yazan kişi, test edilecek en önemli yöntemler yerine, test etmesi en kolay yöntemlerin testlerini yazdı ve daha sonra bitirecek zamanı yoktu.
  • Testler eski olabilir.
  • Testler açık olmayan yollarla kısa devre yapılabilir ve gerçekten yapılmaz.

AMA YARARLI BİR Dökümantasyon Tamamlayıcısı Oldu

Bununla birlikte, belirli bir sınıfın ne yaptığı hakkında şüpheye düşüldüğünde, özellikle uzunca, belirsiz ve eksik yorumlar varsa (türünü biliyorsunuz ...) hızlıca test sınıfını bulmaya ve kontrol etmeye çalışıyorum:

  • gerçekte kontrol etmeye çalıştıkları (geliştirici yukarıda yalnızca "kolay" testlerin uygulanmasında belirtilen hatayı yapmamış olması dışında, en önemli haberleşmeler hakkında bir ipucu verir),
  • ve köşe davaları varsa.

Artı, bir BDD-stili kullanılarak yazılmıştır , bunlar sınıfının sözleşmesinin oldukça iyi tanımını . IDE'nizi açın (veya grep kullanın) yalnızca yöntem adlarını ve tada'yı görmek için: bir davranış listeniz var.

Regresyon ve Hataların Testlere İhtiyacı Var

Ayrıca, regresyon ve hata raporları için testler yazmak iyi bir uygulamadır: bir şeyi düzeltirseniz, durumu yeniden oluşturmak için bir test yazarsınız. Onlara bakarken, örneğin ilgili hata raporunu ve eski bir sorunla ilgili tüm ayrıntıları bulmanın iyi bir yolu.

Gerçek belgeler için iyi bir tamamlayıcı olduklarını ve en azından bu konuda değerli bir kaynak olduklarını söyleyebilirim. Doğru kullanılırsa iyi bir araçtır. Projenizin başında test etmeye başlar ve bunu bir alışkanlık haline getirirseniz, çok iyi bir referans belgesi olabilir. Zaten kod tabanını kötüleştiren kötü kodlama alışkanlıklarına sahip mevcut bir projede, onları dikkatli kullanın.


Neden reddedildiğimi sorabilir miyim? Seni orada nelere engelliyor ya da neye katılmıyorsun?
haylem

2
Argümanınızın (IMO) en iyi kısmı en küçük yazı tipinde yazılır - kodu anlamanın en iyi yolu, ilk önce okunabilir bir koda sahip olmaktır. Bunu "okunabilir ve çalışan kod" olarak değiştirirdim, ama aynı fikirdeyim. Ardından, ünite testlerine tekrar bakarsanız - çalışan testler çalışma kodudur (ve tüm kodlar gibi okunabilir olmalıdır), bu nedenle iyi yapıldığında (genellikle çok yerelse) belgeler oldukça iyi.
Joris Timmermans

@MadKeithV: teşekkürler. "Okunabilir ve çalışan kod" için güncelleme yaptım ve biraz daha yukarı itdim.
haylem

11

Bir yorum, birim sınamalarının "yürütülebilir belgeler" olduğu şeklindedir. Ünite testlerini koda göre çalıştırabilirsiniz; testlerin başarılı bir şekilde yazıldığı sırada yapıldığı gibi hala performans gösterip göstermediğini size söyler. Bu şekilde ünite, sistemin işlevselliğini belirli bir zamanda, uygulanabilir bir şekilde "dokümante eder".

Öte yandan, işlevselliği anlamak için yalnızca nadiren ünite test kodunu "dokümantasyon" olarak okudum. Tek bir birim testi, test edilmekte olan sınıfın arkasındaki gerçek sistem hakkında size çok fazla şey söyleyebilecek şekilde, çok spesifik, yerel ve soyut bir testtir.


5

Belgelere göre , kodun nasıl çalıştığını öğrenmek için bir şey istiyorum, o zaman birim testleri hem kod birimlerinin hem beklenen , hem de hata durumlarında ve hata (aka hatalar ) durumlarında nasıl çalıştığını gösteren mükemmel örneklerdir . Ayrıca, kodlarınız yazılmadan önce testleriniz oluşturulabilir, bu nedenle kodun işletme / gereksinim açısından ne yapması gerektiği temelini oluşturur.

Belgeleri mi değiştiriyorlar? Yok hayır.

Dokümantasyon için yararlı bir ek mi? Evet.


4

Birim testlerini şu şekilde görüyorum:

  • dokümantasyonun doğru olduğunu kanıtlamanın bir yolu (dokümantasyonun API uygulaması ile eşleşeceği varsayılarak).
  • Bir geliştiriciye belirli bir özelliğin nasıl kullanılacağını göstermenin bir yolu; ünite test armatürleri / ünite testlerinin kendisi genellikle birinden hızlıca öğrenebilecek kadar küçüktür.
  • ve açıkçası herhangi bir regresyon hatasını tespit etmek.

Bir dereceye kadar, mevcut belgelere tamamlayıcı olarak görülebilir, ancak belgelere değil.


3

Size başka bir şey sorarak sorunuzu cevaplayacağım.

Ne kadar sıklıkla yeni bir API / rutinle çalışırken, kullanmaya çalıştığınız şeyin bir kod örneğini aramaya yardımcı oldunuz? Kod örnekleri çevrimiçi araması için google’a geçiş yapmadınız mı?

Tam olarak ne zaman birim testleri dokümantasyon olarak kullanacaksınız.

  • Aslında, birim testleri normal kod örneklerinden biraz daha sıkı olabilir, çünkü birden fazla test yapmanız gerekir (örnekler).
  • Umarım birim testleriniz uygun kullanımı gösterir. Örneğin tüm temel bağımlılıkları ya normal nesnelerle ya da alaycı nesnelerle açıkça gösterirler. (Aksi takdirde, özellikle iyi ünite testleri değildir.)
  • NOT: Yorumlarınız veya "normal belgeler" kod örnekleri veriyorsa, gerçekten DRY ilkelerini ihlal ediyorsunuz. Ve bu kod örnekleri zaman içinde kolayca yanlış olabilir , ancak düzenli olarak yapılan birim testlerinde daha az şansı vardır.
  • Ünite testleri ayrıntılı ise (genellikle büyükse ), ek bilgi sağlamalıdır:
    • Bilinen tüm kenar durumları açıkça gösterilmiştir.
    • Atılabilecek beklenen tüm istisnalar.
    • Önceden bulunan tüm hatalar (bu, üniteyi test için genişletirken, ünite için yeni bir müşteri yazmaktan daha yararlıdır).
    • Ünite ile ilgili tüm temel iş kuralları. (varsa)

Birim testinin , daha geleneksel belgelere mükemmel bir tamamlayıcı olsa bile, dokümantasyon olarak kullanılma eğiliminde olmadığının birkaç nedeni olduğunu düşünüyorum :

  • Sık sık testlerin kendilerinin amaç için yeterince iyi yazılmadığını söylemeye teşebbüs ediyorum. Diğer cevaplar çoktan yapılan testlere çoktan karar verdi:
    • Eksik.
    • Kafa karıştırıcı. (Doğrudan test altındaki yöntemi aramayan test durumları gördüm - çağrılmadan önce çağrı yığınına 3/4 kat derinliğe inersiniz ve yöntemi çağırmanın ön koşulları karmaşık bir sınıf hiyerarşisinde farklı yerlere dağılır. )
    • Demode. (genellikle testler eskimiş olduklarında başarısız olmalıdır , ancak bu her zaman böyle değildir).
  • Bir örneğe ihtiyaç duyulduğunda, üretim kodunda zaten mevcut olan birçok kullanım örneği vardır.
  • Test edilen birim o kadar iyi yazılmıştır (kendi kendini belgelemek) yöntemlerin örneklere ihtiyacı yoktur. Keşke!
  • Programcı olarak deneyimlerime göre, derin salıverilmeye ve önümüzdeki Salı günü RTFM'ye girmeye oldukça istekliyiz ...
  • KURU ilkesini ihlal eden belgeler ve yorumlar.

2

TL; DR Birim testleri ve API yorumları tamamlayıcıdır - bazı şeyler en iyi şekilde kodda, bazıları ise nesir içerisinde açıklanmıştır.

Birim testleri, API yorumlarında tanımlanması zor (ve zahmetli) olan özel durumları ve kenar koşullarını belgelemek için yararlıdır. Ayrıca, API yorumları genellikle API'yi kullanmak isteyen kişilere yöneliktir.

Kodu değiştirmek istiyorsanız, genellikle bilmeniz gereken daha çok şey vardır ve bunların bir kısmının yorum yapmak zordur (ve bu yorumlar hızlıca bayatlanır). Bu durumda, bir birim testi de dokümantasyon olarak çalışır.

Örnek: (a, b)Belirli bir hesaplama yapan m yöntemine sahipsiniz . Geriye dönük uyumluluk gereklilikleri nedeniyle, özel girişleri a=0ve a=-1, ancak bNULL ise özel durumlar gerekir . Bunu bir yoruma eklemek karmaşık, ayrıntılı ve gereklilik daha sonra kaldırılırsa bayatlayabilecek durumda.

Bazı birim testleri yaparsanız çekler davranışını olduğunu m(0, NULL), m(-1, x)birkaç avantajları sağlar:

  • Doğru davranış tanımı açıktır, yanlış anlamalar azalır.
  • Bir yorumdan farklı olarak, insanlar kodu değiştirdiğinde gereksinimi görmezden gelemezler

ancak örneğin, bu davranış yorumda belgelenmemişse, bir kullanıcı söz konusu durum için beklenmeyen sonuçlar alabilir. Bu tam olarak iyi bir şey değil.
stijn

@ stijn: Doğru. Bu durumda, en iyi yol muhtemelen dokümanlardaki özel durumdan kısa bir bahsetmek, ayrıca ünite dağınık detaylar için test yapmak olacaktır.
sleske
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.