48

I've been trying to add parametrized @pytest.mark.parametrize tests to a class based unittest.

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

But the parametrized stuff didn't kick in:

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

I've switched to simple class based tests (without unittest). But I'd like to know if anyone tried it and it worked.

falsetru
  • 357,413
  • 63
  • 732
  • 636
graffic
  • 1,303
  • 2
  • 14
  • 18

2 Answers2

45

According to pytest documentation:

unittest.TestCase methods cannot directly receive fixture function arguments as implementing that is likely to inflict on the ability to run general unittest.TestCase test suites.

falsetru
  • 357,413
  • 63
  • 732
  • 636
15

There's a simple workaround to parameterize unittest-based Python tests by using "parameterized": https://pypi.org/project/parameterized/

Here's a simple example. First install "parameterized": pip install parameterized==0.9.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)

Now you can easily run your code with pytest

I've successfully used this technique to parameterize selenium browser tests that use the SeleniumBase framework on GitHub in this example.

Michael Mintz
  • 9,007
  • 6
  • 31
  • 48