Я разрешил подобные проблемы в большом проекте Django, который также использовал носового бегуна и заводского мальчика. Я не могу сказать вам, как автоматически обнаруживать тест связь как вопрос просил, но я имею в заднем число, чтобы рассказать о некоторых из проблем, которые вызывают сцепление в моем случае:
Проверить весь импорт TestCase
и убедитесь, что они используют Django's TestCase
, а не unittest's TestCase
. Если некоторые разработчики в команде используют PyCharm, который имеет удобную функцию авто-импорта, может быть очень легко случайно импортировать имя из-за неправильного места. Unittest TestCase
с радостью будет работать в тестовом наборе большого Django-проекта, но вы не сможете получить хорошие функции фиксации и отката, которые имеет тестовый пример Django.
Убедитесь, что любой тест класса, который переопределяет setUp
, tearDown
, setUpClass
, tearDownClass
также делегатов super
. Я знаю, это звучит очевидно, но очень легко забыть!
Также возможно, чтобы изменчивое состояние проникло из-за фабричного мальчика. Осторожнее с использований фабричных последовательностей, которые выглядят что-то вроде:
name = factory.Sequence(lambda n: 'alecxe-{0}'.format(n))
Даже если дб чистая, последовательность не может начинаться с 0, если другие тесты запускать заранее. Это может вас укусить, если вы сделали утверждения с неправильными предположениями о том, какие значения будут использовать модели Django при создании фабричным мальчиком.
Аналогичным образом вы не можете делать предположения о первичных ключах. Предположим, что модель django Potato
имеет ключевое слово с автоматическим полем, а в начале теста нет Potato
строк, а заводский мальчик создает картофель, то есть вы использовали PotatoFactory()
в setUp
. Вам не гарантировано, что первичный ключ будет 1, что удивительно. Вы должны содержать ссылку на экземпляр, возвращенный фабрикой, и делать утверждения против этого фактического экземпляра.
Будьте очень осторожны также с RelatedFactory
и SubFactory
. Фабричный мальчик имеет привычку собирать любой старый экземпляр, чтобы удовлетворить отношение, если он уже существует, висящий в дБ. Это означает, что вы получаете как связанный объект, иногда не повторяется - если другие объекты создаются в setUpClass
или светильниках, связанный объект, выбранный (или созданный) на заводе, может быть непредсказуемым, потому что порядок испытаний произволен.
Ситуации, в которых модели Django имеют @receiver
декораторы с post_save
или pre_save
крючки очень сложны, чтобы правильно обращаться с заводским мальчиком. Для лучшего контроля над связанными объектами, включая случаи, когда просто захват какого-либо старого экземпляра может быть неправильным, вам иногда приходится обрабатывать детали самостоятельно, переопределяя метод класса _generate
на заводе и/или используя собственные крючки с помощью декоратора @factory.post_generation
.
Hi Jāzeps, придуманный, увидев вас здесь! 'pytest-random-order' выглядит хорошо, я проверю его. – wim
Ха-ха, эй @wim спасибо! – jbasko