tl;dr — я хочу написать функцию Python unittest
, которая удаляет файл, запускает тест и восстанавливает файл. Это вызывает состояние гонки, потому что unittest
запускает несколько тестов параллельно, а удаление и создание файла для одного теста портит другие тесты, которые выполняются в то же время.
Длинный конкретный пример:
У меня есть модуль Python с именем converter.py
, и с ним связаны тесты в test_converter.py
. Если в том же каталоге, что и converter.py
, есть файл с именем config_custom.csv
, будет использоваться пользовательская конфигурация. Если нет пользовательского файла конфигурации CSV, то в converter.py
встроена конфигурация по умолчанию.
Я написал модульный тест, используя unittest
из стандартной библиотеки Python 2.7, чтобы проверить это поведение. Модульный тест в setUp()
переименует config_custom.csv
в wrong_name.csv
, затем запустит тесты (надеюсь, используя конфигурацию по умолчанию), затем в tearDown()
переименует файл обратно так, как он должен быть.
Проблема. Модульные тесты Python выполняются параллельно, и я столкнулся с ужасными условиями гонки. Файл config_custom.csv
будет переименован посреди других модульных тестов недетерминированным образом. Это вызовет по крайней мере одну ошибку или сбой примерно в 90% случаев, когда я запускал весь набор тестов.
Идеальным решением было бы сказать unittest
: НЕ запускайте этот тест параллельно с другими тестами, этот тест особенный и требует полной изоляции.
Мой обходной путь — добавить необязательный аргумент в функцию, которая ищет файлы конфигурации. Аргумент передается только набором тестов. Он игнорирует файл конфигурации, не удаляя его. На самом деле удаление тестового файла более изящно, это то, что я действительно хочу проверить.