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
Arrangeplik tymczasowykatalogActmain(["scan", ...])Assertkod zwrotny i wyjściecapsys

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
Otwórz praktykę →