Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

DDT и pytest. Как использовать файлы с тестовыми данными?

python
webdriver
Теги: #<Tag:0x00007f7b68ce6810> #<Tag:0x00007f7b68ce6568>

(Александр Литовский) #1

Пишу на python + selenium + pytest
В unittest я использовал ddt и брал разные данные из тестового файла

@ddt
@file_data('test.json')
def test(x,y....)

в py.test нет ddt, у меня большой объем тестовых данных, нашел только mark.parametrize. Пример

 @pytest.mark.parametrize('value', (1, -3, 2, 0))
    def test(self, value):

Плохо искал? Есть возможность указать в mark.parametrize файл, как в unittest ?


(Maxim Zaitsev) #2

Можно попробовать считать файл в переменную (list) и подставить в parametrize:


data = [1,2,3,4,5]

@pytest.mark.parametrize('value', data)
def test(self, value):
    pass



(Maxim Zaitsev) #3

Кстати, если напрягает длинное название фикcтуры, то можно в отдельном файла ввести свои сокращения, например:
Создаем свой модуль: pytestmark.py:

import pytest

ddt =  pytest.mark.parametrize

Используем в своих тестах:


from pytestmark import *

@ddt('value', data)
def test(self, value):
    pass

(Nikita Barchugov) #4

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

Ещё можно стакать декораторы с параметризацией, чтобы получить все возможные комбинации

import pytest
@pytest.mark.parametrize("x", [0, 1])
@pytest.mark.parametrize("y", [2, 3])
def test_foo(x, y):
    pass

Получим x=0/y=2 , x=1/y=2 , x=0/y=3 , and x=1/y=3

Полезные ссылки:
Параметризация из json файла
Генерация тестов через объект metafunc
Наглядная параметризация
Использование indirect
Параметризация и indirect
Как работает yield


(Aleksandr Jashhuk) #5

Поможет динамическая параметризация в Pytest-е. Вкурить сходу тяжело. Данные были из базы.