Это вопрос "возможно ли это в Python или мне нужно написать скрипт оболочки":
Мое приложение состоит из трех частей:
- a Django app (1.11, но оперативное поведение здесь похоже на 3)
- семанти c парсер
- a MySQL база знаний, совместно используемая обоими
Грубо говоря, Django помещает данные в КБ и запускает серию запросов к парсеру semanti c. Парсер semanti c считывает данные из базы знаний, чтобы сообщить результаты запроса. Django и КБ старые друзья; Django и парсер semanti c - старые друзья; Интеграция между анализатором semanti c и КБ является новой.
Если я использую Django стандартный TestCase, синтаксический анализатор semanti c не сможет увидеть какие-либо промежуточные изменения в базе знаний, сделанные во время тест, потому что весь тест обернут в атомы c () на Django. Это облом, но хорошо: тесты, в которых анализатор semanti c должен читать из базы данных, теперь наследуются от TransactionTestCase.
Проблема в том, что мы являемся исследовательским магазином, и мы часто экспериментируем с новые методы, которые нарушают поведение низкого уровня. Раньше у меня был тщательно заказанный TestSuite из более чем 50 тестов, который начинается с простых строительных блоков и накапливается в сложности для полного использования. При запуске с параметром --failfast это представляло ошибки в логическом порядке для моего цикла разработки.
Django, однако, помещает TransactionTestCases в свои собственные маленькие корзины случайного порядка :
Чтобы гарантировать, что весь код TestCase начинается с чистой базы данных, Django организатор тестов переупорядочивает тесты следующим образом:
- Все подклассы TestCase запускаются первыми.
- Затем выполняются все остальные Django тесты (тесты, основанные на SimpleTestCase, включая TransactionTestCase), без какого-либо особого упорядочения, гарантированного и не применяемого среди них.
- Затем любой другой unittest.TestCase выполняются тесты (в том числе doctests), которые могут изменить базу данных, не восстанавливая ее в исходное состояние.
... что, конечно, отлично и верно для регрессионных тестов и CI, но затормозил весь мой рабочий процесс исправления ошибок в логическом порядке.
Кажется, есть некоторые расширенные варианты тестирования, но я не заинтересован погрузиться в обнаружение пользовательских тестов, если нет оснований ожидать, что Django действительно будет соблюдать тот порядок, который я установил sh. Есть ли такая надежда, вы, кто более знаком с Django тестами, чем я? Или я застрял, переводя свой TestSuite в сценарий оболочки и потребляя дополнительные издержки?