Python - doctest'e karşı unittest [kapalı]


160

Python'da birim testine başlamaya çalışıyorum ve birinin doctest ve unittest'in avantajlarını ve dezavantajlarını açıklayıp anlayamayacağını merak ediyordum.

Her birini hangi koşullar için kullanırsınız?

Yanıtlar:


177

Her ikisi de değerlidir. Unittest'in yerini alarak hem doctest hem de burun kullanıyorum . Testin, dokümantasyon olarak gerçekten kullanışlı bir kullanım örneği verdiği durumlarda doctest kullanıyorum. Genellikle bu testleri kapsamlı hale getirmiyorum, sadece bilgilendirme amaçlı. Ben doctest tersine etkili bir şekilde kullanıyorum: kodumu doctest dayalı doğru test değil, benim belgelere göre kod doğru olup olmadığını kontrol etmek.

Bunun nedeni, kapsamlı doctest'lerin belgelerinizi çok fazla dağıtacağını bulmam, bu nedenle ya kullanılamaz docstringlerle ya da eksik testlerle sonuçlanacaksınız.

Kodu gerçekten test etmek için amaç, örnekte ne olduğunu göstermek yerine her durumu iyice test etmektir; bu, diğer çerçeveler tarafından daha iyi karşılandığını düşündüğüm farklı bir hedeftir.


29
Çok daha az kazan plakası var ve testleri yazmak (ve okumak) için çok daha basit buluyorum. Testleri yazmak için düşük başlangıç ​​maliyeti (yani, sadece bir "test_foo ()" fonksiyonu yazın ve gidin), aynı zamanda testlerinizi çivilemeden önce ilginç kod bitlerini yapma cazibesini ortadan kaldırmaya yardımcı olur.
Brian

6
Bence bu harika bir cevap.
James Brady

Başka hangi test çerçevelerini kullanıyorsunuz? Yoksa sadece burun mu?
Joe

6
Bu cevabın yaşı göz önüne alındığında, muhtemelen unittest'in eski sürümlerinin "kaynak plakası" nın çoğunun büyük ölçüde gittiğini belirtmek gerekir. Nose'u hala daha iyi seviyorum, ama hemen hemen bir savurma.
Adam Parkin

1
FYI burnu son birkaç yıldır "bakım modunda" ve muhtemelen tüm gelişimi durduracak (3. taraf müdahalesi yok). Destekçileri yeni projelerin alternatif kullanmasını tavsiye ediyor.
Altı

48

Unittest'i neredeyse tamamen kullanıyorum.

Arada bir, doctest tarafından kullanılabilecek bir öğretiye bazı şeyler koyacağım.

Test vakalarının% 95'i birim testtir.

Neden? Doktrinleri biraz daha kısa ve daha fazla tutmayı seviyorum. Bazen test vakaları bir doktora açıklığa yardımcı olur. Çoğu zaman, uygulamanın test senaryoları bir doktora için çok uzun.


Bir örnek, neye uygun olduğunu düşündüğünüzü docstringve neyin uygun olmadığını görmek güzel olurdu . Aslında terimlerle bir arayüzün nasıl kullanılacağını açıkça gösteren terimlerden hoşlanıyorum, ancak bunu hem birim hem de birim test için kullanmak uygun olmayabilir.
user1767754

33

Belgelemenin bir başka avantajı da kodunuzun belgelerinizin söylediklerini yaptığından emin olmanızdır. Bir süre sonra, yazılım değişiklikleri belgelerinizi ve kodunuzu farklı şeyler yapabilir. :-)


6
+1 benden - mükemmel nokta
doug

28

Bir biyoinformatik olarak çalışıyorum ve yazdığım kodun çoğu "bir kez, bir görev" komut dosyaları, sadece bir veya iki kez çalıştırılacak ve tek bir belirli görevi yürüten kod.

Bu durumda, büyük birim testleri yazmak aşırıya kaçabilir ve doctest'ler yararlı bir uzlaşmadır. Yazmak daha hızlıdır ve genellikle koda dahil olduklarından, başka bir dosyayı açmak zorunda kalmadan kodun nasıl davranması gerektiğine her zaman göz kulak olmalarına izin verir. Küçük komut dosyası yazarken faydalıdır.

Ayrıca, senaryolarınızı programlama konusunda uzman olmayan bir araştırmacıya iletmeniz gerektiğinde doctests yararlıdır. Bazı insanlar, birim testlerin nasıl yapılandırıldığını anlamakta zorlanırlar; Öte yandan, doctests basit kullanım örnekleridir, böylece insanlar bunları nasıl kullanacaklarını görmek için kopyalayıp yapıştırabilirler.

Yani, cevabımı devam ettirmek için: küçük senaryolar yazmanız gerektiğinde ve bunları geçmeniz ya da bilgisayar bilimcisi olmayan araştırmacılara göstermeniz gerektiğinde doctest'ler yararlıdır.


6
"küçük senaryolar yazmanız gerektiğinde ve bunları geçmeniz ya da bilgisayar bilimcisi olmayan araştırmacılara göstermeniz gerektiğinde doktorlar yararlıdır." Mükemmel nokta. Aynı şeyi yapıyorum ve python olmayan programcılar her zaman belgelerin yürütülebileceğine şaşırıyorlar.
Daniel Canas

14

Birim testi fikrine yeni başlıyorsanız, başlamak doctestçok kolay çünkü kullanımı çok kolay. Aynı zamanda doğal olarak bir miktar dokümantasyon sağlar. Ve ile daha kapsamlı testler için doctest, belgeleri harici bir dosyaya yerleştirebilirsiniz, böylece belgelerinizi karıştırmaz.

unittestJUnit veya benzer bir şey kullandığınız bir arka plandan geliyorsanız, genellikle başka bir yerde yaptığınız gibi birim testleri yazmak istediğinizi öneririm .


4
Bu yönde cesaretlendirildim (başlangıçta doctest), ama sonunda pişman oldum. Önemsiz test senaryolarında, düzenleyicimin sözdizimi vurgulamasını ve otomatik tamamlamasını kaybettim. Testler ayrı bir dosyadayken, artık doğrudan editörden çalıştıramadım - içeriği her seferinde karşılık gelen kaynak dosyaya geri döndürmek zorunda kalacağım.
Kasım'da 10:06

7

Sadece unittest kullanıyorum; Bence doctest ana modülü çok fazla karıştırıyor. Bu muhtemelen kapsamlı testler yazmakla ilgilidir.


7

Her ikisini de kullanmak geçerli ve oldukça basit bir seçenektir. doctestModül içerir DoctTestSuiteve DocFileSuitesırasıyla bir modül veya bir dosya, bir unittest uyumlu testsuite oluşturmak yöntem.

Bu yüzden her ikisini de kullanıyorum ve genellikle kurulum gerektirmeyen veya çok az kurulum gerektiren işlevlerle basit argümanlar için doctest kullanıyorum (argümanlar için basit tipler). Aslında birkaç doctest testinin bu işlevi belgelemekten ziyade işlevi belgelemeye yardımcı olduğunu düşünüyorum .

Ancak daha karmaşık vakalar ve daha kapsamlı bir test senaryosu seti için, daha fazla kontrol ve esneklik sağlayan unittest kullanıyorum.


7

Doctest'i unittest'in yerine kullanmıyorum. Biraz üst üste gelmelerine rağmen, iki modül aynı işleve sahip değildir:

  • Kullandığım unittestbeni çabuk kodunun geri kalanı üzerinde herhangi bir değişiklik etkisini belirlemeye yardımcı olur, yani bir birim test çerçeve olarak.

  • doctestYorumlar (yani docstrings) hala kodun geçerli sürümüyle ilgili olduğunu garanti olarak kullanıyorum .

Elde ettiğim test odaklı geliştirmenin yaygın olarak belgelenmiş faydaları unittest. doctesteski kodların bakımını yanlış yönlendiren yorumlara sahip olma tehlikesini çözer.


4

Neredeyse asla doctest kullanmıyorum. Kodumun kendi kendini belgelemesini istiyorum ve öğretiler kullanıcıya belgeleri sağlar. Bir modüle yüzlerce test satırı ekleyen IMO, öğreti dizilerini daha az okunabilir hale getirir. Ayrıca gerektiğinde birim testlerinin değiştirilmesini daha kolay buluyorum.


4

Doctestbazen yanlış sonuçlara yol açabilir. Özellikle çıktı kaçış dizileri içerdiğinde. Örneğin

def convert():
    """
    >>> convert()
    '\xe0\xa4\x95'
    """
    a = '\xe0\xa4\x95'
    return a
import doctest
doctest.testmod()

verir

**********************************************************************
File "hindi.py", line 3, in __main__.convert
Failed example:
    convert()
Expected:
    'क'
Got:
    '\xe0\xa4\x95'
**********************************************************************
1 items had failures:
   1 of   1 in __main__.convert
***Test Failed*** 1 failures. 

Çıktının türünü de kontrol etmez. Sadece çıktı dizelerini karşılaştırır. Örneğin, tamsayı gibi tamsayı gibi yazdırılan bir tür rasyonel hale getirmiştir. O zaman rasyonel geri dönen fonksiyonunuz olduğunu varsayalım. Bu nedenle, çıktı rasyonel tam sayı mı yoksa tamsayı mı ise bir doctest farklılaşmaz.


5
r""" ... """İlk sorunu gidermek için raw docstrings ( ) kullanabilirsiniz.
2013

Python 3.4'te iyi çalışıyor. Python 2.7'de de çalışmasını sağlamak '\\xe0\\xa4\\x95'için doktorunuzda kullanın .
Cees Timmerman

Ayrıca unicode değişmezlerinin de doctests ile çalışmadığını gördüm (dosyanın üstündeki doğru 'kodlama utf-8' yorum satırında bile) Genellikle doctests unittest testleri kadar desteklenmez, bu yüzden bazı hatalar vardır o sabit alamadım.
RichVel

2

Keşif tabanlı sistemleri (şu anda eski olanı kullanarak "burun" ve "py.test" tercih ediyorum)

test bir dokümantasyon kadar iyi olduğunda doctest iyidir, aksi takdirde kodu çok fazla dağınık hale getirir.


burun inanılmaz derecede faydalı görünüyor; Henüz kullanma şansım olmadı, ama büyük umutlarım var :)
Tony Arkles

burun kullanımı en kolay test çerçevesi IMO. Test senaryolarının yazılmasını ve çalıştırılmasını oldukça zahmetsiz hale getirir.
Kamil Kisiel
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.