Reputation: 1412
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.
Upvotes: 57
Views: 15064
Reputation: 15516
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.
Upvotes: 17
Reputation: 369064
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.
Upvotes: 56