Понимание нестабильных тестов Django: Порядок создания влияет на порядок массива
У меня есть тест в Django, который выглядит примерно так:
class WebhookClientSerializerTestCase(TestCase):
def test_serializes_agent_from_client(self):
agent1 = factories.AgentUserFactory(email='dave@agently.com')
agent2 = factories.AgentUserFactory(email='jim@agently.com')
client = factories.ClientFactory(agents=[agent1, agent2])
schema = serializers.WebhookClientSerializer() # do some stuff
data = schema.dump(client).data
self.assertEqual(data['agents'][0]['email'], 'dave@agently.com')
self.assertEqual(data['agents'][1]['email'], 'jim@agently.com')
Мы создаем сущность под названием Agent
, затем еще одну и проходим через некоторую пользовательскую логику сериализатора. Сериализатор возвращает массив сериализованных данных агента. В том же классе определены и другие тесты.
Однако иногда агенты выходят в неправильном порядке. Это не удается при
AssertionError: u'jim@agently.com' != 'dave@agently.com'
Я предполагал, что когда создаются сущности, это делается последовательно. Этот тест отлично работает локально, но в CI/CD он иногда, но не всегда, дает сбой. Мы используем флаг --parallel
при запуске тестов, но я не вижу, где или как асинхронность влияет на порядок выходного массива.
Почему порядок меняется, и как я могу написать этот тест более надежным?
Вам следует использовать self.assertDictEqual(dict_a, dict_b)
Это не имеет никакого отношения к параллельности, поскольку тестовый пример не выполняется двумя процессами. Вы всегда должны стремиться использовать наиболее конкретное утверждение, это помогает значительно уменьшить количество случайных неудачных тестов.