Понимание нестабильных тестов 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)

Это не имеет никакого отношения к параллельности, поскольку тестовый пример не выполняется двумя процессами. Вы всегда должны стремиться использовать наиболее конкретное утверждение, это помогает значительно уменьшить количество случайных неудачных тестов.

Вернуться на верх