Пингвитон
151 subscribers
4 photos
12 links
иногда пишу тут какие-то полезные штуки про Linux и Python
Download Telegram
Есть прекрасный инструмент для написания тестов -- pytest (вы же, конечно, покрываете тестами свой код?). В pytest есть фикстура tmpdir, которая позволит вам не страдать над тестами, в которых необходимо проверять работу файловой системы. Например, мне нужно было проверить, что корректно работает функция, очищающая директорию от старых файлов.

def test_clear_cache(tmpdir):
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)
Если в тестах вам нужно учитывать время модификации файла, то во время создания вам нужно изменить его самостоятельно (потому что подряд созданные файлы создадутся мгновенно, и их mtime будет одинаков), это можно сделать с помощью метода 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 будет создавать ваши тестовые файлы в /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