Глава 23 · Часть V · Проверяем и автоматизируем
Проверяем перемещение и отмену
Каждый шаг — перемещение, отмену, конфликт при отмене — проверяет отдельный тест, а не один общий сценарий.
SafeSort · Часть 5 из 6Тесты и CI
Проверить перемещение файлов сложнее, чем проверить чистую функцию: нужно создать файлы, применить план, убедиться, что они оказались в новом месте, и только потом проверить отмену. Каждый шаг проверяется отдельным тестом, а не одним большим сценарием — так гораздо понятнее, что именно сломалось, если тест не проходит.
tests/test_executor.py
def test_apply_plan_moves_file_to_destination(tmp_path):
source = tmp_path / "otchet.pdf"
source.write_text("...")
destination = tmp_path / "Sorted" / "documents" / "otchet.pdf"
plan = SortPlan(root=tmp_path, operations=(MoveOperation(source, destination),))
results = apply_plan(plan)
assert results[0].completed is True
assert not source.exists()
assert destination.exists()
Тест отмены строит план, применяет его, затем вызывает undo()
и проверяет, что файл оказался в точности там, откуда был взят:
tests/test_manifest.py
def test_undo_restores_original_location(tmp_path):
source = tmp_path / "otchet.pdf"
source.write_text("...")
plan = build_plan(scan(tmp_path, Config()), tmp_path, Config())
moves = apply_plan(plan)
manifest_obj, _ = write_manifest(tmp_path, moves)
result = undo(manifest_obj)
assert source.exists()
assert result.conflicts == ()
Тест конфликта отмены — не менее важен, чем тест успешной отмены
Одного теста «отмена работает» недостаточно: нужен ещё тест, который специально создаёт конфликт — кладёт новый файл на исходное место перед вызовом
undo() — и проверяет, что SafeSort отказался его перезаписать, а не проверяет только «счастливый путь».Практика: тестируем перемещение и отмену
Нужен доступ к настоящей файловой системе — выполните локально в VS Code, PyCharm или Jupyter
Практика выполняется локально