Работает ли параметризованный тест pytest с тестами на основе класса unittest?

Я пытался добавить параметризованные тесты @pytest.mark.parametrize в модульный тест на основе классов.

class SomethingTests(unittest.TestCase):
    @pytest.mark.parametrize(('one', 'two'), [
        (1, 2), (2, 3)])
    def test_default_values(self, one, two):
        assert one == (two + 1)

Но параметризованные вещи не сработали:

TypeError: test_default_values() takes exactly 3 arguments (1 given)

Я перешел на простые тесты на основе классов (без unittest). Но я хотел бы знать, пробовал ли кто-нибудь, и это сработало.


person graffic    schedule 12.08.2013    source источник


Ответы (2)


Согласно документации pytest:

Методы unittest.TestCase не могут напрямую получать аргументы функции приспособления, так как это может повлиять на возможность запуска общих наборов тестов unittest.TestCase.

person falsetru    schedule 12.08.2013

Существует простой обходной путь для параметризации тестов Python на основе юнит-тестов с помощью «parameterized»: https://pypi.org/project/parameterized/

Вот простой пример. Сначала установите «параметризованный»: pip install parameterized==0.7.0

import unittest
from parameterized import parameterized

class MyTestClass(unittest.TestCase):

    @parameterized.expand([
        ["One", "Two"],
        ["Three", "Four"],
        ["Five", "Six"],
    ])
    def test_parameterized(self, arg1, arg2):
        print(arg1, arg2)

Теперь вы можете легко запустить свой код с помощью pytest

Я успешно использовал этот метод для параметризации тестов браузера селена, использующих структуру SeleniumBase на GitHub в этот пример.

person Michael Mintz    schedule 28.08.2018
comment
Обратите внимание, что для использования макетов вы должны декорировать за @parametrized и должны собирать макет в конце списка аргументов (возможно, arg3). Я только что попробовал. - person alanjds; 01.02.2019