Rozdział 23 · Część V · Sprawdzamy i automatyzujemy
Sprawdzamy interfejs wiersza poleceń
capsys przechwytuje tekst wydrukowany przez program. Testy sprawdzają go jak zwykły łańcuch znaków bez prawdziwego terminala.
SafeSort · Część 5 z 6Testy i CI
Ostatnią warstwą SafeSort, którą warto sprawdzić testami, jest samo łańcuch znaków polecenia:
Czy to jest w porządku? argparse analizuje argumenty i sprawdza, czy kod jest poprawny
Odbiór telefonu zostaje odbiór przez dzwoniącego.
tests/test_cli.py
def test_scan_subcommand_returns_zero_on_success(tmp_path, capsys):
(tmp_path / "otchet.pdf").write_text("...")
code = main(["scan", str(tmp_path)])
assert code == 0
assert "Files scanned: 1" in capsys.readouterr().out
def test_missing_path_returns_nonzero(tmp_path):
code = main(["scan", str(tmp_path / "net-takogo-kataloga")])
assert code != 0
capsys: wbudowane przechwytywanie pytest wyjścia
Funkcja
main() drukuje wynik przez print()zamiast zwracać tekst bezpośrednio. Fixture capsys przechwytuje wszystko, co znajduje się w standardowym strumieniu wyjścia i błędów podczas testu, i pozwala sprawdzić to jako zwykły łańcuch znaków.Weryfikacja --help również zasługuje na osobny test.
argparse drukuje certyfikat i celowo go podnosi
SystemExit(0): Kod 0 oznacza pomyślne ukończenie, a nie
błąd. Nieprawidłowe argumenty prowadzą także do SystemExit,
ale przy kodzie niezerowym, zwykle 2.
tests/test_cli.py
def test_help_exits_zero():
with pytest.raises(SystemExit) as excinfo:
main(["--help"])
assert excinfo.value.code == 0
def test_invalid_subcommand_exits_nonzero():
with pytest.raises(SystemExit) as excinfo:
main(["not-a-command"])
assert excinfo.value.code != 0
Praktyka: testy argumentów wiersza poleceń
Interaktywny Laptop w przeglądarce: Python 3.14 przez Pyodide, bez instalacji