Yanıtlar:
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.
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.
docstring
ve 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.
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. :-)
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.
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.
unittest
JUnit 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 .
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.
Sadece unittest kullanıyorum; Bence doctest ana modülü çok fazla karıştırıyor. Bu muhtemelen kapsamlı testler yazmakla ilgilidir.
Her ikisini de kullanmak geçerli ve oldukça basit bir seçenektir. doctest
Modül içerir DoctTestSuite
ve DocFileSuite
sı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.
Doctest'i unittest'in yerine kullanmıyorum. Biraz üst üste gelmelerine rağmen, iki modül aynı işleve sahip değildir:
Kullandığım unittest
beni çabuk kodunun geri kalanı üzerinde herhangi bir değişiklik etkisini belirlemeye yardımcı olur, yani bir birim test çerçeve olarak.
doctest
Yorumlar (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
. doctest
eski kodların bakımını yanlış yönlendiren yorumlara sahip olma tehlikesini çözer.
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.
Doctest
bazen 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.
r""" ... """
İlk sorunu gidermek için raw docstrings ( ) kullanabilirsiniz.
'\\xe0\\xa4\\x95'
için doktorunuzda kullanın .
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.