#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.