Does pytest parametrized test work with unittest class based tests?
Question:
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.
Answers:
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.
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.8.1
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.
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.
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.
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.8.1
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.