Parametryzacja i pokrycie testami
Proszę uruchamiać testy z wieloma danymi wejściowymi za pomocą @pytest.mark.parametrize.
Parametryzacja i pokrycie testami to bezpłatna lekcja Python Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Python Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Python Academy zawiera 4 lekcji w sumie.
@pytest.mark.parametrize
To samo testowanie z wieloma danymi wejściowymi można przeprowadzić za pomocą @pytest.mark.parametrize. Każda krotka jest osobnym przypadkiem testowym.
import pytest
@pytest.mark.parametrize("a,b,expected", [
(1, 2, 3),
(0, 0, 0),
(-1, 1, 0),
(10, -5, 5),
])
def test_add(a, b, expected):
assert a + b == expectedJeden parametr
W przypadku jednego argumentu należy bezpośrednio przekazać listę wartości.
import pytest
@pytest.mark.parametrize("n", [1, 2, 3, 4, 5])
def test_positive(n):
assert n > 0Nazwane identyfikatory testów
Przekaż listę ids, aby nadać każdemu zestawowi parametrów etykietę i uzyskać czytelniejsze dane wyjściowe.
import pytest
@pytest.mark.parametrize("value,result", [
(2, True),
(3, False),
], ids=["even", "odd"])
def test_is_even(value, result):
assert (value % 2 == 0) == resultNakładanie dekoratorów parametrize
Nałóż dwa dekoratory parametrize, aby uzyskać iloczyn kartezjański danych wejściowych.
import pytest
@pytest.mark.parametrize("x", [1, 2])
@pytest.mark.parametrize("y", [10, 20])
def test_product(x, y):
assert x * y > 0 # 4 test cases: (1,10),(1,20),(2,10),(2,20)pytest-cov: instalacja
Zainstaluj pytest-cov, aby zmierzyć, które wiersze kodu są wykonywane przez testy.
# pip install pytest-cov
# Basic usage:
# pytest --cov=mypackage
# HTML report:
# pytest --cov=mypackage --cov-report=htmlOdczytywanie danych o pokryciu
Pokrycie pokazuje, które wiersze, gałęzie lub instrukcje nie zostały osiągnięte podczas testów.
# Name Stmts Miss Cover
# ------- ----- ---- -----
# mypackage/utils.py 20 3 85%
#
# Missing: lines 45, 67, 88Pokrycie gałęzi
Użyj --cov-branch, aby śledzić, czy obie gałęzie instrukcji warunkowych są testowane.
# pytest --cov=mypackage --cov-branch
def is_positive(n):
if n > 0: # branch 1: True
return True
return False # branch 2: FalseNiepowodzenie przy niskim pokryciu
Użyj --cov-fail-under=N, aby zakończyć kompilację niepowodzeniem, jeśli pokrycie spadnie poniżej N procent.
# pytest --cov=mypackage --cov-fail-under=80
# FAIL Required test coverage of 80% not reached. Total: 72%Konfiguracja .coveragerc
Skonfiguruj wykluczenia z pomiaru pokrycia w .coveragerc, aby pomijać kod szablonowy.
# .coveragerc
[run]
omit =
*/migrations/*
*/tests/*
setup.py
[report]
exclude_lines =
pragma: no cover
if TYPE_CHECKING:Co oznacza dobre pokrycie
Wysokie pokrycie nie gwarantuje poprawności testów. Należy dążyć do znaczących asercji, a nie tylko do wykonywania wierszy kodu. W przypadku większości projektów praktycznym celem jest 80–90%.
# A covered but useless test:
def test_nothing():
is_positive(5) # no assert — 100% coverage, zero confidence
# A meaningful test:
def test_positive():
assert is_positive(5) is True
assert is_positive(-1) is FalseŁączenie parametrize i pokrycia
Testy parametryzowane naturalnie zwiększają pokrycie, ponieważ za pomocą jednej definicji testu wykonują wiele ścieżek kodu.
import pytest
@pytest.mark.parametrize("n,expected", [
(5, True), (-1, False), (0, False)
])
def test_is_positive(n, expected):
assert is_positive(n) == expectedSzybkie sprawdzenie
Co robi --cov-fail-under=90 podczas uruchamiania pytest?
Podsumowanie
Użyj @pytest.mark.parametrize, aby przejrzyście testować wiele danych wejściowych. Mierz pokrycie kodu za pomocą pytest-cov, śledź gałęzie za pomocą --cov-branch i wymuszaj wartości minimalne za pomocą --cov-fail-under.
Często zadawane pytania
Czy lekcja „Parametryzacja i pokrycie testami” jest bezpłatna?
Tak — pełny tekst „Parametryzacja i pokrycie testami” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Python Academy, przejdź na CoddyKit PRO. Kurs Python Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Parametryzacja i pokrycie testami”?
Proszę uruchamiać testy z wieloma danymi wejściowymi za pomocą @pytest.mark.parametrize. Ćwiczysz Python Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Python Academy?
Nie wymagamy żadnego doświadczenia. Python Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Parametryzacja i pokrycie testami”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Python Academy?
Tak. Każda lekcja Python Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Pisanie pierwszych testów pytest
- Fixtures oraz konfiguracja i sprzątanie
- Parametryzacja i pokrycie testami
- Mockowanie za pomocą unittest.mock