0

尝试将命令行参数(table_name)带入 pytest(通过 conftest.py,见下文)并在辅助方法中使用该参数在数据库中进行查询,然后使用查询结果使用 @pytest 创建参数化测试输入.mark.parametrize 在 test_ 函数上。

#contents of conftest.py
import pytest

def pytest_addoption(parser):
    parser.addoption("--table_name", action="store", default=None, help="enter table name")

@pytest.fixture
def table_name(request):
    return request.config.getoption('--table_name')

问题是:命令行参数(table_name)正在使用夹具检索,我们想将其传递给辅助方法以进行查询并将查询结果放入列表中,但由于辅助方法采用夹具,它不能在另一个fixture/test_function之外调用。所以我们不能把列表放入参数化的 test_function params

#helper method
def get_test_cases(table_name):
    #connect to DB, makes query
    #puts all query results into a list called tests
    return tests

#test function
@pytest.mark.parametrize("columns...", (values...)) #list is read as values
def test_function(columns):
    #assertion tests

有没有办法使用命令行参数并将数据库查询的结果传递给参数化标记/参数?

4

1 回答 1

2

关于帮助程序如何从 DB 读取测试值或如何调用该帮助程序以pytest.mark.parameterize()生成一次),然后您可以将帮助程序本身设置为固定装置并多次调用它,对于 @pytest.mark.parametrize() 装饰中列出的每个测试用例一次。假设数据库在 DB 行中有每个测试用例,并且您通过某个“测试 ID”列对其进行索引。

@pytest.fixture
def test_case(request,table_name):
# this is the get-test-case helper, note it is a fixture,
# so it can have table_name as an argument
# request.param will be our test ID here, see the mark.parametrize below
    return query("select * from %s where test_id = %s",
                 (table_name, request.param))

@pytest.mark.parametrize("test_case,p1,p2",
    [ ("TstID1", 1, 2), ("TstID2", 3, 3) ], indirect=["test_case"])
def test_function(test_case, p1, p2):
    # test_case here will be the query result from the call to the test_case() fixture! p1 and p2 will come directly from the parameterize mark.

注意常规参数 p1 和 p2 如何按原样传递,但标记为间接的参数通过夹具(这也确保在实际运行测试而不是在 pytest 时执行查询数据库的“昂贵”操作运行“收集阶段”并准备要运行的测试列表。

于 2018-06-27T22:26:37.103 回答