Проверить все записи из списка записей тестовых данных

#python #unit-testing #pytest #python-unittest

#питон #модульное тестирование #пытест #python-unittest

Вопрос:

В настоящее время я переключаюсь с Python Unittests на pytest, что делает мои тесты более понятными.

Но есть одна вещь, которая мне не ясна. В моих unittests я перебираю (например) список или JSON ответа.

 def test_result_list_xyz():
    api = SomeApi()   
    for entry in api.get_result_as_list()
        self.asserEqual('xyz', entry.xyz, msg='There is a fish in it..')
 

Это всего лишь пример, в некоторых других случаях у меня есть предопределенные тестовые данные, хранящиеся в списках. Который будет повторен в тестовом методе и протестирован.

Пример:

     {'foo': 'bar'},
    {'foo2': 'bar2'}
]
INVALID_TEST_DATA = [
    {'foo': ['this should not work..']},
    {'foo2': None }
]
 

Недостатком этого является то, что при первом утверждении весь тест останавливается, а остальные данные тестироваться не будут.

Как решить эту проблему в pytest без ущерба для остановки при первой ошибке?

Есть ли способ запускать тест на каждой итерации, чтобы в конце я проверил все записи из списка? (Если в списке входных данных есть 3 записи, необходимо выполнить 3 теста.)

И каков наилучший способ протестировать кучу данных с помощью pytest в целом?

Ответ №1:

Как насчет использования подхода, подобного следующему

 INVALID_TEST_DATA = [
    {'foo': ['this should not work..']},
    {'foo2': None }
]


def test_result_list_xyz():
    api = SomeApi()   
    for entry in api.get_result_as_list():
        for key, value in entry:
            self.asserEqual(INVALID_TEST_DATA[key], entry[key], msg='There is a fish in it..')

 

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