首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据setup_module或其他函数的输出动态参数化pytest函数

根据setup_module或其他函数的输出动态参数化pytest函数
EN

Stack Overflow用户
提问于 2020-09-23 19:09:46
回答 1查看 67关注 0票数 0

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

代码语言:javascript
运行
复制
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_function中动态参数化测试数据。

我试过了:

a)在当前代码中,即使setup_module从测试数据中删除了一个列表,因为我的测试用例是使用具有两个列表的测试数据全局参数化的,所以测试用例对测试数据中的一个列表运行两次。我从其他问题中读到,根据pytest结构,这是不可能的。

b)如果我通过执行以下操作来尝试该夹具:

代码语言:javascript
运行
复制
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运行。

如果我做错了什么,有人能给我提个建议吗?如果没有遵循问题指南,很抱歉,因为第一次在这里发布了一个问题。

EN

回答 1

Stack Overflow用户

发布于 2020-09-23 20:25:37

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

conftest.py

代码语言:javascript
运行
复制
def pytest_configure(config):
    # save the testdata in the config, so you can access it from the hook
    config.testdata = calculate_testdata()

test.py

代码语言:javascript
运行
复制
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的情况下,这将生成测试函数:

代码语言:javascript
运行
复制
test.py::test_function[servername_1-servermac_1-vlans] 
test.py::test_function[servername_2-servermac_2-vlans] 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64026641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档