Глава 23 · Часть V · Проверяем и автоматизируем

Проверяем интерфейс командной строки

capsys перехватывает напечатанный программой текст. Тесты проверяют его как обычную строку без реального терминала.

SafeSort · Часть 5 из 6Тесты и CI
Arrangeфайл во временномкаталогеActmain(["scan", ...])Assertкод возврата и выводcapsys

Последний слой SafeSort, который стоит проверить тестами, это сама командная строка: правильно ли argparse разбирает аргументы, и правильный ли код возврата получает вызывающая сторона.

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: встроенная перехватка вывода pytest
Функция main() печатает результат через print(), а не возвращает текст напрямую. Фикстура capsys перехватывает всё, что попало на стандартный вывод и поток ошибок во время теста, и позволяет проверить это как обычную строку.

Проверка --help тоже заслуживает отдельного теста. argparse печатает справку и намеренно поднимает SystemExit(0): код 0 означает успешное завершение, а не ошибку. Некорректные аргументы тоже приводят к SystemExit, но уже с ненулевым кодом, обычно 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
Практика: тесты аргументов командной строки
Интерактивный ноутбук в браузере: Python 3.14 через Pyodide, без установки
Открыть практику →