2010-04-25 21 views
33

Python'un doctest konseptini sadece işlevler değil, sınıflar için kullanmak mümkün müdür? Eğer öyleyse, doktrinleri - 'docstring' veya kurucunun docstring'inde nereye koyacağım? ÖncedenPython: Sınıflar için doctest'leri kullanma

class Test: 
    """ 
    >>> a=Test(5) 
    >>> a.multiply_by_2() 
    10 
    """ 
    def __init__(self, number): 
     self._number=number 

    def multiply_by_2(self): 
     return self._number*2 

teşekkür

Adam

+5

kullandığınız böylece daima Nesnesi' ziyade yoktan 'dan devralan * Yeni stil sınıfları *. –

+9

Sadece yeni stil sınıfları olan python 3 haricinde ve bildirilen ebeveynler olmadan 'object' ibaresi belirtilir. – Daenyth

cevap

23

Sen kod kaçırıyorsun

Dosyanın sonuna bu eklemem gerekiyor testler koymak nerede gelince

class Test: 
    <snip> 

if __name__ == "__main__": 
    import doctest 
    doctest.testmod() 

: aslında dosyanın altındaki doctestleri çalıştırmak

  • Sınıfı bir bütün olarak deniyorsa, bunları 'docstring' sınıfına koyardım.
  • Yapıcıyı test ediyorsa, bunları kurucunun belgelerine yerleştiririm.
  • Bir yöntemi test ediyorsanız (bu durumda olduğu anlaşıldığı gibi), aslında onları bu yöntemin belgesine koyardım.
+1

+1 Teşekkürler! Ancak, bir yöntemi belgelemek biraz sıkıcı görünüyor, çünkü her bir doktrin için bir nesneyi başlatmamı gerektiriyor. –

+4

@Adam: Daha karmaşık testlere ihtiyacınız varsa, en uygun modülü kullanın. doktrin öncelikli olarak, kodun test edilmesine değil, belgelerin test edilmesine yöneliktir. –

5

doctest modül dosyada herhangi Docstringler arar ve herhangi bir gömülü kod çalıştırır:

ben gibi bir şey arıyorum, netleştirmek için İçinde, evet, sınıflar için doctest kullanmak mümkündür.

Sınıfın belgelerine veya yapıcısına doktrinler koymanın daha iyi olup olmadığı konusuna gelince, bunun tam olarak neyi belgelediğinize bağlı olduğunu düşünüyorum.

Eğer doktora derse genel bir bakış sunuluyorsa ve nasıl kullanacağımı derse koymanın daha iyi olacağını düşünüyorum.

Belge, özellikle sınıfın örneklerinin nasıl oluşturulacağıyla ilgili ise, __init__ yöntemine girmelidir.

Doktrinlerin amacının, öncelikle belgelerin kendi kendini doğrulayan örnek kodlarına sahip olduğunu unutmayın, bu nedenle, IMHO dokümantasyon yönü, test yönü üzerinde önceliğe sahip olmalıdır.

Düzenleme: - sadece sınıfını tanımlar ana piton kod çalıştırmaya neden python test.py -v çalıştıran örnekte

yukarıdaki doctest yürütmek için hiçbir kod yoktur. Python 2.6 kullanıyorsanız Alternatif

if __name__ == "__main__": 
    import doctest 
    doctest.testmod() 

veya sonrası ile çalıştırın:

python -m doctest -v test.py 
+0

Teşekkürler, ama neden benim örneğim çalışmıyor? Python test.py -v' denedim ve hiçbir şey almamıştım –

+1

@Adam Ne göndersiniz, tam 'test.py' dosyasıysa, '__name__ ==' __main__ ': import doctest; doctest.testmod() '; Bunu kullandıysanız, çıktı yok hata anlamına gelir. :) – badp

+0

eklediyse -v –

47

yerine her yöntemde nesne nesnelleştirilme, böyle bir şey yapabileceğini: Bir yan not olarak

class Test: 
    def multiply_by_2(self): 
     """ 
     >>> t.multiply_by_2() 
     10 
     """ 
     return self._number*2 

if __name__ == "__main__": 
    import doctest 
    doctest.testmod(extraglobs={'t': Test()}) 
+3

Extraglobs anahtar kelimesini bilmiyordum. Teşekkürler! Bu çok yararlı. –

İlgili konular