2010-04-25 18 views
33

Czy możliwe jest zastosowanie do ćwiczeń klas doktorskich, a nie tylko funkcji Pythona?Python: przy użyciu doctests dla klas

Jeśli tak, to gdzie umieszczę dowody - na "docstring" klasy lub na docstrucie konstruktora?

celu wyjaśnienia, szukam czegoś podobnego:

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 

Dzięki z góry,

Adama

+5

Na marginesie, zawsze dziedziczą 'object' raczej niż nic tak że używasz * nowy klasy stylu *. –

+9

Z wyjątkiem pythona 3, gdzie istnieją tylko klasy w nowym stylu, a obiekt 'object' jest domyślny bez zadeklarowanych rodziców. – Daenyth

Odpowiedz

23

tracisz kod do faktycznie uruchomić doctests na dole pliku:

class Test: 
    <snip> 

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

Jak dla gdzie umieścić badań:

  • Jeśli to testowanie klasy jako całości, umieściłbym je w klasie "docstring".
  • Jeśli testujesz konstruktora, umieściłbym je w dokumentacji procesu konstruktora.
  • Jeśli testuje metodę (jak się wydaje w tym przypadku), umieściłbym ją w docstruowaniu tej metody.
+1

+1 Dzięki! Jednak dokumentowanie metody wydaje się nieco nudne, ponieważ wymaga inicjalizacji obiektu dla każdego testu. –

+4

@Adam: jeśli potrzebujesz bardziej wyrafinowanych testów, skorzystaj z modułu unittest. doctest jest przeznaczony głównie do testowania dokumentacji, a nie do testowania kodu. –

5

doctest moduł szuka wszelkich docstrings w pliku i wykonuje żadnego kodu osadzonego w nim, więc tak, możliwe jest użycie doctest dla klas.

Co do tego, czy lepiej jest umieścić doctesty w klasie docstring lub konstruktorze, myślę, że to zależy od tego, co dokładnie dokumentujesz.

Jeśli docstring daje ogólny przegląd klasy i jak z niej korzystać, to myślę, że lepiej jest umieścić ją w klasie.

Jeśli w dokumencie docstring chodzi konkretnie o tworzenie instancji klasy, powinien on zostać wprowadzony w metodzie __init__.

Pamiętaj, że celem testów jest przede wszystkim posiadanie własnego sprawdzającego przykładowego kodu w dokumentacji, dlatego IMHO aspekt dokumentacji powinien mieć pierwszeństwo przed aspektem testowania.

Edit:

W przykładzie powyżej nie ma kodu do wykonania doctest - prowadzenie python test.py -v wykona główny kod Pythona, który właśnie definiuje klasę.

Trzeba dodać to do końca pliku:

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

Alternatywnie Jeśli używasz Pythona 2.6 lub później uruchomić go z:

python -m doctest -v test.py 
+0

Dzięki, ale dlaczego mój przykład nie działa? Próbowałem 'python test.py -v' i nie otrzymałem niczego –

+1

@Adam Jeśli to, co napisałeś, jest pełnym plikiem' test.py', nie zrobiłeś 'if __name__ ==" __main__ ": import doctest; doctest.testmod() '; jeśli używałeś tego, żadne dane wyjściowe nie oznaczają błędów. :) – badp

+0

nie, jeśli dodał -v –

47

Zamiast instancji obiektu w każdej metodzie, można zrobić coś takiego:

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

Nie wiedziałem o słowach-kluczach. Dzięki! Jest to bardzo przydatne. –

Powiązane problemy