Pisanie testów jednostkowych w Pythonie: jak zacząć? [Zamknięte]


533

Ukończyłem swój pierwszy prawidłowy projekt w Pythonie, a teraz moim zadaniem jest napisanie testów.

Ponieważ po raz pierwszy zrobiłem projekt, po raz pierwszy będę pisać dla niego testy.

Pytanie brzmi: jak zacząć? Nie mam absolutnie żadnego pojęcia. Czy ktoś może wskazać mi jakąś dokumentację / samouczek / link / książkę, której mogę użyć do rozpoczęcia pisania testów (i chyba w szczególności testów jednostkowych)

Wszelkie porady będą mile widziane na ten temat.


4
Nigdy nie jest za późno na pisanie testów, jeśli taka jest Twoja intencja. Lepiej mieć trochę więcej niż wszystkich, którzy narzekają ...
Asken

1
Oto dobra testowana książka programistyczna, która jest dostępna za darmo w Internecie: chimera.labs.oreilly.com/books/1234000000754/index.html
Czy

4
dobry zasób Natknąłem się na https://www.jeffknupp.com/blog/2013/12/09/improve-your-python-understanding-unit-testing/ . Jako nowicjusz w Pythonie uznałem, że jest to zrozumiałe.
promem

2
Przewodnik Autostopowicza do Pythona zawiera krótki przegląd narzędzi do testowania jednostkowego: python-guide-pt-br.readthedocs.io/en/latest/writing/tests
Anton Tarasenko

Poprzedni komentarz powinien zostać oceniony wyżej, ponieważ przewodnik ma również przykładowe repozytorium kodu na github.com/kennethreitz/samplemod, które jest również doskonałym miejscem na rozpoczęcie.
setempler

Odpowiedzi:


101

Jeśli dopiero zaczynasz korzystać z najbardziej nieprzystosowanych metod, najprostsze podejście do nauki jest często najlepsze. Na tej podstawie zalecam py.testraczej używanie modułu domyślnegounittest niż domyślnego .

Rozważ te dwa przykłady, które robią to samo:

Przykład 1 (najmniejszy):

import unittest

class LearningCase(unittest.TestCase):
    def test_starting_out(self):
        self.assertEqual(1, 1)

def main():
    unittest.main()

if __name__ == "__main__":
    main()

Przykład 2 (pytanie):

def test_starting_out():
    assert 1 == 1

Zakładając, że oba pliki mają nazwy test_unittesting.py, w jaki sposób przeprowadzamy testy?

Przykład 1 (najmniejszy):

cd /path/to/dir/
python test_unittesting.py

Przykład 2 (pytanie):

cd /path/to/dir/
py.test

7
Słyszałem o prostocie py.test w wielu miejscach ( docs.python-guide.org/en/latest/writing/tests/#py-test , docs.python.org/3.5/library/unittest.html#module -unittest , jeffknupp.com/blog/2013/12/09/... ) Dlaczego jest unit-testnadal zawarte w standardowej bibliotece, jeśli py.testi nosezapewnić taką samą funkcjonalność znacznie prostszy interfejs? Jest to po prostu w celu zapewnienia kompatybilności wstecznej, czy też unittestmają pewne zalety, py.testi nosetestnie może zapewnić?
alpha_989

@ alpha_989 Standardowa biblioteka Pythona nie zawiera najlepszych dostępnych narzędzi. Po to jest PyPI. Standardowy unittestpakiet jest wciąż wystarczająco dobry. Jest to standard, co oznacza, że ​​jest pewny, że działa dobrze. Wreszcie, każdy, kto używa Twojego kodu, nie musi instalować dodatkowych pakietów.
Jeyekomon,

72

Darmowa książka Python Dive Into Python zawiera rozdział dotyczący testów jednostkowych , który może okazać się przydatny.

Jeśli postępujesz zgodnie z nowoczesnymi praktykami, powinieneś prawdopodobnie napisać testy podczas pisania projektu i nie czekać, aż projekt będzie prawie gotowy.

Trochę za późno, ale teraz wiesz już następnym razem. :)


13
Nadal powiedziałbym, że jeśli chcesz refaktoryzować kod, który nie ma testów jednostkowych, powinieneś najpierw napisać dla niego testy jednostkowe
Hubert Kario

9
Tak, wiele osób, które po raz pierwszy przyjeżdżają na najmodniejszych gości, słyszy stare słowa, które brzmią jak: „no cóż, jest trochę za późno na twój obecny projekt”: nawet jeśli tak naprawdę nie chcieli powiedzieć, to właśnie słyszą początkujący . To jest jak chińskie przysłowie o sadzeniu drzewa: najlepszy czas na rozpoczęcie testów to początek projektu; teraz drugi najlepszy czas na rozpoczęcie testów!
JP

4
Zanurz się w łącze Python jest zerwane ... :-(
Scott Skiles

40

Moim zdaniem istnieją trzy świetne ramy testowania w języku Python, które warto sprawdzić.
unittest - moduł jest standardowo wyposażony we wszystkich dystrybucjach python
nosa - można uruchomić unittest testy i ma mniej szablonowe.
pytest - uruchamia także najtrudniejsze testy, ma mniejszą liczbę płyt, lepsze raportowanie, wiele fajnych dodatkowych funkcji

Aby uzyskać dobre porównanie wszystkich z nich, przeczytaj wprowadzenie do każdego z nich na http://pythontesting.net/start-here .
Istnieją również rozszerzone artykuły na temat urządzeń i wiele więcej.


35

Dokumenty dla najbardziej nieprzystosowanych byłyby dobrym miejscem do rozpoczęcia.

Teraz jest już trochę za późno, ale w przyszłości zastanów się nad napisaniem testów jednostkowych przed lub w trakcie samego projektu. W ten sposób możesz używać ich do testowania w miarę postępów i (teoretycznie) możesz używać ich jako testów regresyjnych, aby sprawdzić, czy zmiany w kodzie nie spowodowały uszkodzenia istniejącego kodu. Dałoby to pełną korzyść z pisania przypadków testowych :)


Dzieje się tak, jeśli zależy Ci na rozwoju opartym na testach, co nie jest złe. W moim przypadku patrzę na istniejący kod i próbuję go zrozumieć, pisząc i poprawiając testy, aby przejść, i to mnie zabiło unittest. Kiedy już zrozumiem, wykorzystam to bardziej do programowania, a także zwiększę liczbę przypadków testowych dla każdej jednostki.
woda lodowa

27

unittest jest dostarczany ze standardową biblioteką, ale polecam Ci testy nosa .

Nos rozciąga się najtrudniej, aby ułatwić testowanie ”.

Poleciłbym również pylint

analizuje kod źródłowy Pythona w poszukiwaniu błędów i oznak niskiej jakości ”.


8

Jak już inni odpowiedzieli, jest już za późno na pisanie testów jednostkowych, ale nie za późno. Pytanie brzmi, czy Twój kod jest testowalny, czy nie. Rzeczywiście, nie jest łatwo przetestować istniejący kod, jest nawet książka na ten temat: Efektywna praca ze Starszym Kodem (patrz kluczowe punkty lub poprzedni PDF ).

Teraz piszesz testy jednostkowe, czy nie. Musisz tylko pamiętać, że może to być żmudne zadanie. Możesz rozwiązać ten problem, aby nauczyć się testowania jednostkowego lub rozważyć najpierw napisanie testów akceptacyjnych (end-to-end) i rozpocząć pisanie testów jednostkowych, kiedy zmienisz kod lub dodasz nową funkcję do projektu.


2
+1 za „Skuteczne działanie ze starszym kodem”. Chodzi o kod, który nie ma testów.
David

3

nosetests to genialne rozwiązanie do testowania jednostek w pythonie. Obsługuje zarówno testy testowe, jak i doctesty, i zaczynasz pracę z prostym plikiem konfiguracyjnym.


Twój link do testów nosa jest nieaktualny. Wygląda na to, że nowa lokalizacja to: nose.readthedocs.org/en/latest
odigity 30.01.2013

1
Zgodnie z dokumentacją na github i stronie z testami nosa, nosei nose2są w trybie konserwacji . Lepiej zacząć py.testod tego, ponieważ ma dużo więcej wsparcia
alpha_989
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.