Есть прекрасный инструмент для написания тестов -- pytest (вы же, конечно, покрываете тестами свой код?). В pytest есть фикстура tmpdir, которая позволит вам не страдать над тестами, в которых необходимо проверять работу файловой системы. Например, мне нужно было проверить, что корректно работает функция, очищающая директорию от старых файлов.
В
https://docs.pytest.org/en/latest/tmpdir.html
https://py.readthedocs.io/en/latest/path.html
#pytest #unittests #unittest #test #tests #python #tmpdir
def test_clear_cache(tmpdir):Если в тестах вам нужно учитывать время модификации файла, то во время создания вам нужно изменить его самостоятельно (потому что подряд созданные файлы создадутся мгновенно, и их mtime будет одинаков), это можно сделать с помощью метода
pass```Фикстура tmpdir указывается в качестве параметра вашему тесту.
Мне нужно было создать пачку файлов в разных директориях. Сначала я переопределила переменную, в которой хранится путь до нужной мне директории на проде:
```kcarectl.PATCH_CACHE = str(tmpdir)```-- ничего не надо придумывать, указывать какие-то точные пути и пр., tmpdir сам со всем разберется.
Далее мне нужно создать файлы:
```tmpdir.mkdir("dir").mkdir("level").join("kpatch.bin").ensure(file=True)```Фикстура `tmdir` предоставляет интерфейс, похожий на os.path. Важно: `join` не создает файл, он лишь возвращает объект, с которым можно что-то делать (писать внутрь что-то с помощью `write`, например). Чтобы именно создать файл в вашей файловой системе, нужно использовать `ensure`.
Если вам нужно создать несколько файлов в одной директории:
```kdir = tmpdir.mkdir("dir").mkdir("level")
kdir.join("kpatch.bin").ensure(file=True).setmtime(i * 3 + 0)
khashdir.join("kpatch.extra.bin").ensure(file=True).setmtime(i * 3 + 1)
setmtime. Помните, что это тесты, вам не нужно реальное время, так что для простоты можно использовать 0, 1, 2, 3 и пр. секунды в качестве переданного таймстемпа. В
tmpdir, который является оберткой над py.path, еще много полезных штук, посмотрите документацию обоих: https://docs.pytest.org/en/latest/tmpdir.html
https://py.readthedocs.io/en/latest/path.html
#pytest #unittests #unittest #test #tests #python #tmpdir
Забыла упомянуть суперполезную и важную фичу tmpdir. Чего ради всё это (:
tmpdir будет создавать ваши тестовые файлы в
То есть вам не нужно каждый раз править путь в
Наслаждайтесь (:
#pytest #unittests #unittest #test #tests #python #tmpdir
tmpdir будет создавать ваши тестовые файлы в
/tmp/. Он создаст директорию ваших тестов -- pytest-of-<NAME>, а внутри него директории, посвященные конкретному запуску тестов. Он так же будет убирать их за собой: после каждого запуска тестов в pytest-of-<NAME> будет не больше 4-х директорий с запусками, остальные буду удаляться: ~$ ls /tmp/pytest-of-lauvenhelz/
pytest-52 pytest-53 pytest-54 pytest-55 pytest-lauvenhelz```Но что это за pytest-lauvenhelz на последнем месте? Это киллерфича (: tmpdir создает симлинк на директорию с последним запуском тестов:
```~$ ls -la /tmp/pytest-of-lauvenhelz/pytest-lauvenhelz
lrwxrwxrwx 1 lauvenhelz lauvenhelz 53 Feb 27 18:23 /tmp/pytest-of-lauvenhelz/pytest-lauvenhelz -> /tmp/pytest-of-lauvenhelz/pytest-55/test_clear_cache0
То есть вам не нужно каждый раз править путь в
ls -la во время разработки тестов, чтобы смотреть, что там создалось-удалилось-изменилось. Вы один раз пишете ls -la /tmp/pytest-of-<NAME>/pytest-<NAME>/ и всё оставшееся время пользуетесь этой командой: tmpdir позаботится, чтобы вы видели свежие результаты. Наслаждайтесь (:
#pytest #unittests #unittest #test #tests #python #tmpdir