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

Проверяем сканирование и классификацию

Тест на пустом каталоге и тест на повторное сканирование Sorted/ — простые случаи, которые чаще всего ломаются незаметно.

SafeSort · Часть 5 из 6Тесты и CI
Arrangeподготовить файлыActвызвать scan()Assertпроверить результат

Тесты для scan() и classify() вместе создают маленькую, полностью контролируемую файловую структуру во временном каталоге, а затем проверяют, что сканер нашёл именно те файлы, которые туда положили — ни больше, ни меньше.

tests/test_scanner.py
def test_scan_finds_nested_files(tmp_path):
    (tmp_path / "a").mkdir()
    (tmp_path / "a" / "otchet.pdf").write_text("...")
    (tmp_path / "photo.jpg").write_text("...")

    files = scan(tmp_path, Config())
    names = {f.path.name for f in files}
    assert names == {"otchet.pdf", "photo.jpg"}

def test_scan_skips_destination_directory(tmp_path):
    (tmp_path / "Sorted" / "documents").mkdir(parents=True)
    (tmp_path / "Sorted" / "documents" / "staryj.pdf").write_text("...")

    files = scan(tmp_path, Config())
    assert files == []
Пустой каталог — тоже проверяемый случай
Тест на пустом временном каталоге (без единого файла) кажется тривиальным, но именно такие крайние случаи чаще всего ломаются при рефакторинге: убедиться, что scan() возвращает пустой список, а не падает с ошибкой, — простой, но реальный тест.

Второй тест выше — прямая проверка требования, которое мы обсуждали раньше: каталог результата никогда не сканируется повторно. Без такого теста регресс (случайный возврат старой, неправильной логики) остался бы незамеченным до тех пор, пока кто-то не запустил бы SafeSort дважды подряд на одном каталоге и не увидел странный результат вручную.

Практика: тестируем сканер и классификатор
Нужен доступ к настоящей файловой системе — выполните локально в VS Code, PyCharm или Jupyter
Практика выполняется локально
Открыть практику →