0Pricing
Python Academy · Lekcja

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 == expected

Jeden 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 > 0

Nazwane 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) == result

Nakł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=html

Odczytywanie 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, 88

Pokrycie 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: False

Niepowodzenie 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) == expected

Szybkie 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

  1. Pisanie pierwszych testów pytest
  2. Fixtures oraz konfiguracja i sprzątanie
  3. Parametryzacja i pokrycie testami
  4. Mockowanie za pomocą unittest.mock
← Powrót do Python Academy