1

我有以下test_dss.py用于 pytest 的文件:

import dataikuapi

import pytest
 

def setup_list():

    client = dataikuapi.DSSClient("{DSS_URL}", "{APY_KEY}")

    client._session.verify = False

    project = client.get_project("{DSS_PROJECT}")

    # Check that there is at least one scenario TEST_XXXXX & that all test scenarios pass

    scenarios = project.list_scenarios()

    scenarios_filter = [obj for obj in scenarios if obj["name"].startswith("TEST")]

    return scenarios_filter

 
def test_check_scenario_exist():

    assert len(setup_list()) > 0, "You need at least one test scenario (name starts with 'TEST_')"

 
@pytest.mark.parametrize("scenario", setup_list())

def test_scenario_run(scenario, params):

    client = dataikuapi.DSSClient(params['host'], params['api'])

    client._session.verify = False

    project = client.get_project(params['project'])

    scenario_id = scenario["id"]

    print("Executing scenario ", scenario["name"])

    scenario_result = project.get_scenario(scenario_id).run_and_wait()

    assert scenario_result.get_details()["scenarioRun"]["result"]["outcome"] == "SUCCESS", "test " + scenario[

    "name"] + " failed"

我的问题是setup_list函数,它只能获取{DSS_URL}, {APY_KEY},的硬编码值{PROJECT}。我无法使用PARAMS或其他方法,例如test_scenario_run 我如何将PARAMS也传递给此函数?

4

1 回答 1

2

标记中的参数在mark.parametrize加载时读取,此时有关配置参数的信息尚不可用。因此,您必须在运行时对测试进行参数化,您可以在其中访问配置。

这可以在pytest_generate_tests(可以存在于您的测试模块中)完成:

@pytest.hookimpl
def pytest_generate_tests(metafunc):
    if "scenario" in metafunc.fixturenames:
        host = metafunc.config.getoption('--host')
        api = metafuc.config.getoption('--api')
        project = metafuc.config.getoption('--project')
        metafunc.parametrize("scenario", setup_list(host, api, project))

这意味着您的setup_list函数采用以下参数:

def setup_list(host, api, project):
    client = dataikuapi.DSSClient(host, api)
    client._session.verify = False
    project = client.get_project(project)
    ...

您的测试看起来像这样(没有parametrize标记,因为参数化现在在 中完成pytest_generate_tests):

def test_scenario_run(scenario, params):
    scenario_id = scenario["id"]
    ...

参数化现在在运行时完成,因此它的行为与您parametrize在测试中放置了一个标记相同。

现在测试的另一个测试setup_list也必须使用params夹具来获取所需的参数:

def test_check_scenario_exist(params):
    assert len(setup_list(params["host"], params["api"], params["project"])) > 0,
 "You need at least ..."
于 2021-01-12T18:44:11.233 回答