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

Проверяем перемещение и отмену

Каждый шаг — перемещение, отмену, конфликт при отмене — проверяет отдельный тест, а не один общий сценарий.

SafeSort · Часть 5 из 6Тесты и CI
Arrangeсоздать файл вовременном каталогеActapply_plan() / undo()Assertфайл на новом илиисходном месте

Проверить перемещение файлов сложнее, чем проверить чистую функцию: нужно создать файлы, применить план, убедиться, что они оказались в новом месте, и только потом проверить отмену. Каждый шаг проверяется отдельным тестом, а не одним большим сценарием — так гораздо понятнее, что именно сломалось, если тест не проходит.

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
Практика выполняется локально
Открыть практику →