如何将参数传递给pytest测试?

时间:2019-06-26 06:42:33

标签: python pytest

说我在tests.py中有此测试

def test_user(username='defaultuser'):

案例1

我想通过命令行传递用户名以进行测试,例如

$ pytest tests.py::test_user user1  # could be --username=user1

我该怎么做?

案例2

我想传递用户名列表进行测试,例如

$ pytest tests.py::test_user "user1, user2, user3"

我想实现类似的目标

@pytest.mark.parametrize("username", tokenize_and_validate(external_param))
def test_user(username):
    pass

def tokenize_and_validate(val):
    if not val:
        return 'defaultuser'
    return val.split(',')

我该怎么做?

谢谢

2 个答案:

答案 0 :(得分:1)

首先从命令行传递参数时,您需要创建一个生成器方法以从命令行获取值,该方法将运行每个测试。

def pytest_generate_tests(metafunc):
    # This is called for every test. Only get/set command line arguments
    # if the argument is specified in the list of test "fixturenames".
    option_value = metafunc.config.option.name
    if 'name' in metafunc.fixturenames and option_value is not None:
        metafunc.parametrize("name", [option_value])

然后,您可以使用命令行参数从命令行运行:

pytest -s tests/my_test_module.py --name abc

Follow the link for more details

答案 1 :(得分:0)

要模拟数据,可以使用fixtures或使用内置的unittest模拟。

from unittest import mock

@mock.patch(func_to_mock, side_effect=func_to_replace)
def test_sth(*args):
    pass

命令行options也可用。