pytest文件中的函数仅适用于硬编码的值



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

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}的硬编码值。我无法使用PARAMStest_scenario_run中的其他方法知道我如何将PARAMS也传递给这个函数吗?

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 ..."

相关内容

  • 没有找到相关文章

最新更新