Skonfigurowanie zestawu testów dla swojego kodu może wydawać się przeszkodą, na którą nie jesteś gotowy, ale ta biblioteka wymaga dużego wysiłku.
Testowanie jest istotną częścią tworzenia oprogramowania. Pomaga wcześnie wykryć błędy i zmniejsza prawdopodobieństwo błędów w dalszej części.
Pytest to jeden z najpopularniejszych frameworków testowych dla Pythona. Pozwala pisać małe i czytelne testy, które można skalować wraz z rozwojem aplikacji. Dowiedz się, jak skonfigurować i używać Pytest z kodem Pythona.
Konfiguracja Pytesta
Przed zainstalowaniem Pytest najlepiej stworzyć wirtualne środowisko odizolować środowisko testowe, aby uniknąć konfliktów z innymi pakietami i zależnościami.
Aby utworzyć środowisko wirtualne, uruchom następujące polecenie przed zainstalowaniem Pytest.
python -m venv testy
Spowoduje to utworzenie nowego środowiska wirtualnego o nazwie testy w bieżącym katalogu. Aby aktywować środowisko, uruchom to polecenie, jeśli korzystasz z systemu Linux lub Mac:
testy źródłowe/bin/aktywuj
W systemie Windows uruchom to polecenie:
testy\\Skrypty\\aktywuj
Aby zainstalować Pytest, możesz użyć pip, menedżera pakietów Pythona, z tym poleceniem w swoim terminalu:
pip zainstaluj pytest
Jeśli nie masz Pipa, nie martw się; możesz zainstaluj Pip w systemach Windows, Mac i Linux.
Uruchom następujące polecenie, aby sprawdzić, czy poprawnie zainstalowałeś Pytest.
pytest --wersja
To powinno zwrócić numer zainstalowanej wersji.
Tworzenie pierwszego testu
Rozważ następującą funkcję, która dodaje dwie liczby i zwraca wynik.
pokdodaj_liczby(a, b):
powrót a + b
Kilka rzeczy może pójść nie tak z tą funkcją. Rozważmy na przykład, co się stanie, jeśli wywołasz funkcję z wartościami nieliczbowymi, takimi jak None lub wartością typu string. Oto niektóre z potencjalnych przypadków brzegowych, które mogą spowodować niepowodzenie funkcji.
Jeden z pierwszych testów, które napiszesz, powinien sprawdzić, czy funkcja zwraca oczekiwany wynik. Aby to zrobić, możesz użyć słowa kluczowego assert w celu porównania rzeczywistych danych wyjściowych funkcji z oczekiwanymi wynikami. W przypadku funkcji add_numbers funkcja testowa może wyglądać następująco:
poktest_dodaj_liczby():
zapewniać dodaj_liczby(2, 3) == 5
zapewniać dodaj_liczby(-1, 1) == 0
zapewniać dodaj_liczby(0, 0) == 0
Ta funkcja testowa zawiera trzy instrukcje assert, z których każda porównuje dane wyjściowe funkcji add_numbers z oczekiwaną wartością. Pierwszy test sprawdza, czy dodanie 2 i 3 zwraca 5, drugi test sprawdza, czy dodanie -1 i 1 zwraca 0, a trzeci test sprawdza, czy dodanie 0 i 0 zwraca 0.
Jak uruchamiać testy za pomocą Pytest
Po napisaniu testów następnym krokiem jest ich uruchomienie. Aby to zrobić za pomocą Pytest, przejdź do katalogu zawierającego plik testowy i uruchom polecenie pytest:
pytest
Jeśli wszystko działa zgodnie z oczekiwaniami, zobaczysz komunikat informujący, że wszystkie testy przeszły pomyślnie. Jeśli jednak którekolwiek z twierdzeń nie powiedzie się, Pytest zgłosi błąd i pokaże wartości wejściowe, które spowodowały niepowodzenie.
Załóżmy na przykład, że uruchomiłeś następującą funkcję testową dla funkcji add_numbers:
poktest_dodaj_liczby():
zapewniać dodaj_liczby(2, 3) == 6
zapewniać dodaj_liczby(-1, 1) == 0
zapewniać dodaj_liczby(0, 0) == 0
Pierwsza asercja zakończy się niepowodzeniem, ponieważ oczekiwana wartość to 6, ale rzeczywista wartość to 5 (suma 2 i 3). Pytest zwróci następujący komunikat:
Ten komunikat pokazuje wartości wejściowe, które spowodowały wartość, a także informuje, jaka powinna być rzeczywista wartość. Ułatwia to szybkie identyfikowanie i naprawianie błędów w kodzie.
Używanie Pytest.raises do potwierdzania wyjątków
Teraz napiszmy test, który obejmie jeden z przypadków brzegowych funkcji add_numbers. Gdy przekazujesz do funkcji argument nieliczbowy, taki jak None, Python powinien zgłosić wyjątek TypeError.
Powinieneś już być obsługi wyjątków w programach Pythonai możesz przetestować, czy Twój kod również poprawnie je podnosi.
Aby to zrobić, skopiuj następującą funkcję testową do swojego pliku. Wykorzystuje menedżera kontekstu pytest.raises do sprawdzenia, czy wywołanie funkcji add_number z wartością „None” powoduje zgłoszenie wyjątku TypeError.
import pytest
poktest_add_numbers_with_invalid_inputs():
z pytest.raises (Błąd typu):
dodaj_liczby(Nic, 2)
Następnie uruchom Pytest z wiersza poleceń. Jeśli wyjątek nie zostanie zgłoszony, test zakończy się niepowodzeniem.
Możesz pójść dalej i sprawdzić szczegóły komunikatu o wyjątku. Menedżer kontekstu tworzy obiekt ExceptionInfo ze szczegółami.
Na przykład w tej funkcji testowej potwierdź komunikat o wyjątku w następujący sposób:
poktest_add_numbers_with_invalid_inputs():
z pytest.raises(Błąd typu) Jak informacje o wyk:
dodaj_liczby(Nic, 2)
zapewniać ex_info.value.args[0] == „nieobsługiwane typy operandów dla +:„ NoneType ”i„ int ””
Jeśli wiadomość nie pasuje do tej w teście, Pytest wskaże awarię.
Jak używać testowania parametrycznego do testowania wielu wejść jednocześnie
Zamiast ręcznie wywoływać funkcję z wieloma danymi wejściowymi, takimi jak to:
poktest_dodaj_liczby():
zapewniać dodaj_liczby(2, 3) == 6
zapewniać dodaj_liczby(-1, 1) == 0
zapewniać dodaj_liczby(0, 0) == 0
Pytest zapewnia sparametryzowaną funkcję testowania, która pozwala łatwiej zrobić to samo. Oto jak możesz przepisać powyższą funkcję testową:
import pytest
@pytest.mark.sparametryzuj(„a, b, oczekiwane”, [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0)
])
poktest_dodaj_liczby(a, b, oczekiwane):
zapewniaćdodaj_liczby(a, b)== oczekiwany
Jak uruchomić wiele testów
Do tej pory napisałeś tylko dwa testy dla funkcji add_numbers. W przypadku bardziej złożonych funkcji z większą liczbą testów możesz pogrupować je w klasę.
Oto przykład, w jaki sposób można utworzyć klasę testową dla funkcji dodawania.
klasaTestDodajFunkcję:
@pytest.mark.parametrize("a, b, oczekiwano", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0),
])
poktest_dodatku_z_liczbami(ja, a, b, oczekiwane):
zapewniać add_numbers (a, b) == oczekiwano
poktest_add_numbers_with_invalid_inputs(samego siebie):
z pytest.raises (Błąd typu) Jak informacje o wyk:
dodaj_liczby(Nic, 2)
zapewniać ex_info.value.args[0] == „nieobsługiwane typy operandów dla +:„ NoneType ”i„ int ””
Pamiętaj, że musisz poprzedzić nazwę klasy słowem „Test”, aby Pytest mógł zidentyfikować ją jako klasę testową i uruchomić.
Pytest ma o wiele więcej funkcji
Korzystając z Pytest, możesz automatycznie zweryfikować, czy Twój kod działa zgodnie z oczekiwaniami. Pytest oferuje wiele innych funkcji, takich jak urządzenia, które pozwalają konfigurować i usuwać dane testowe oraz znaczniki do konfigurowania metadanych w funkcjach testowych.
Dodatkowo możesz zintegrować Pytest z potokiem CI i uruchamiać testy automatycznie i nieprzerwanie po zmianie kodu.