根据setup_模块或其他函数的输出动态参数化pytest函数

2024-09-28 22:01:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个pytest代码,我有一个setup_模块,我在其中进行一些代码处理,修改一个名为testdata的列表,该列表是全局声明的。我需要根据从setup_模块接收到的内容,动态地将列表列表传递给我的测试用例

testdata = [['servername_1', 'servermac_1', 'vlans'],['servername_2', 'servermac_2', 'vlans']]
 
def setup_module(module):
    #global testdata
    #do some steps
    #based on if the server has issues or server mac is different, 
    # return testdata which may or may not remove one or both list from test data(modified testdata)

def teardown_module(module):
    #close ssh connection

@pytest.mark.parametrize('servername, servermac, vlan', testdata)
def test_function(servername, servermac, vlans):
    for vlans in vlans:
       do ssh to servername:
          #do things

无论如何,在test_函数中动态参数化testdata

我试过:

a)对于当前代码,即使setup_模块从testdata中删除了一个列表,因为我的测试用例是用testdata全局参数化的,它有两个列表,测试用例在testdata中为一个列表运行两次。我从其他问题中了解到,按照pytest结构,这是不可能的

b)如果我通过以下方式尝试夹具:

testdata = [['servername_1', 'servermac_1', 'vlans'],['servername_2', 'servermac_2', 'vlans']]

@pytest.fixture
def setup():
    #do some steps
    #based on if the server has issues or server mac is different, 
    # return testdata which may or may not remove one or both list from test data

def teardown_module(module):
    #close ssh connection


def test_function(setup):
    testdata = setup 

    for test in testdata:
        servername = test[0]
        servermac = test[1]
        vlans = test[2]

    for vlans in vlans:
       do ssh to servername:
          #do things

使用此代码结构,PyTest不认为这是两组测试用例,而只是一组案例。另外,我不能在这里使用assert,因为如果第一个servername出现故障,并且我将其断言为false,那么第二个servername的代码将根本不会运行

有人能告诉我我是不是做错了什么吗。 如果没有遵循问题指导原则,表示歉意,因为这是第一次在这里发布问题


Tags: or代码test列表serverpytestdefsetup
1条回答
网友
1楼 · 发布于 2024-09-28 22:01:39

如果在加载时不知道测试用例,可以在运行时在pytest_generate_tests中对函数进行参数化。为了能够在此之前设置测试数据,您必须使用在pytest_generate_tests之前执行的初始化挂钩,比如pytest_configure(必须将其放入conftest.py)。下面是一个可能的实现:

conftest.py

def pytest_configure(config):
    # save the testdata in the config, so you can access it from the hook
    config.testdata = calculate_testdata()

test.py

def teardown_module(module):
    # close ssh connection

@pytest.hookimpl
def pytest_generate_tests(metafunc):
    if all([name in metafunc.fixturenames
            for name in ("servername", "servermac", "vlans")]):
        metafunc.parametrize(("servername", "servermac", "vlans"), 
                             metafunc.config.testdata)

def test_function(servername, servermac, vlans):
    ...

对于示例testdata,这将生成测试函数:

test.py::test_function[servername_1-servermac_1-vlans] 
test.py::test_function[servername_2-servermac_2-vlans] 

相关问题 更多 >