Massimo Santo
Massimo Santo

Reputation: 1

Pytest-Variables: how to use them without funcarg?

I wanna pass a json file for testbed definition to pytest.

My testcases are implemented inside a unittest class and need to use the json file send via pytest cli.

I tried to use pytest-variable to pass a json to pytest. Then I want to use the json as a dictionary inside my tests.

To be clearer, my test is launched with this command

pytest -s --variables ../testbeds/testbed_SQA_252.json TC_1418.py

I know unittest cannot accept external arguments but will be very useful a technique to unlock this constraint.

CASE 1 -- test implemented as functions --->OK

def test_variables(variables):
     print(variables)

in this case the ouput is correct and the json is printed in the CLI

CASE 2-- test implemented as Unittest Class--->KO

class TC_1418(unittest.TestCase):
     def setUp(self, variables):
        print (variables)
        ....other functions

I obtain the following error:

TypeError: setUp() missing 1 required positional argument: 'variables'

Any Idea?

Upvotes: 0

Views: 310

Answers (1)

tmt
tmt

Reputation: 8624

Your issue comes from mixing up concepts of pytest (e.g. injection of fixtures like variables) with concepts of unittest.TestCase. While pytest supports running tests based on unittest, I'm afraid that injection of plugins' fixtures into test methods is not supported.

There is a workaround though that takes advantage of fixtures being injected into other fixtures and making custom fixtures available in unittest.TestCase with @pytest.mark.usefixtures decorator:

# TC_1418.py

import pytest
import unittest


@pytest.fixture(scope="class")
def variables_injector(request, variables):
    request.cls.variables = variables


@pytest.mark.usefixtures("variables_injector")
class Test1418(unittest.TestCase):
    def test_something(self):
        print(self.variables)

Notice that the name of the class starts with Test so as to follow conventions for test discovery.

If you don't want to go into this travesty, I propose you rather fully embrace Pytest and make your life easier with simple test functions that you have already discovered or properly structured test classes:

# TC_1418.py

class Test1418:
    def test_something(self, variables):
        print(variables)

Upvotes: 1

Related Questions