Глава 23 · Часть V · Проверяем и автоматизируем
Проверяем интерфейс командной строки
capsys перехватывает напечатанный программой текст. Тесты проверяют его как обычную строку без реального терминала.
SafeSort · Часть 5 из 6Тесты и CI
Последний слой 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, без установки