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