我在conftetst.py中包含了我自己的命令行选项
def pytest_addoption(parser):
parser.addoption("--backend" , default="test_backend",
help="run testx for the given backend, default: test_backend")
和
def pytest_generate_tests(metafunc):
if 'backend' in metafunc.funcargnames:
if metafunc.config.option.backend:
backend = metafunc.config.option.backend
backend = backend.split(',')
backend = map(lambda x: string.lower(x), backend)
metafunc.parametrize("backend", backend)
如果我在模块内的普通函数中使用此命令行选项:
module: test_this.py;
def test_me(backend):
print backend
它按预期工作。
现在我想在一些测试之前包含setup_module函数来创建/复制一些东西:
def setup_module(backend):
import shutil
shutil.copy(backend, 'use_here')
...
不幸的是,我现在已经知道如何在setup_module函数中访问此命令行选项。 什么都行不通,我试过了。
感谢您的帮助,建议。
干杯
答案 0 :(得分:3)
正在讨论的API扩展允许在设置资源中使用funcargs,而您的用例就是一个很好的例子。请参阅此处了解正在讨论的V2草案:http://pytest.org/latest/resources.html
今天,您可以像这样解决问题::
# contest of conftest.py
import string
def pytest_addoption(parser):
parser.addoption("--backend" , default="test_backend",
help="run testx for the given backend, default: test_backend")
def pytest_generate_tests(metafunc):
if 'backend' in metafunc.funcargnames:
if metafunc.config.option.backend:
backend = metafunc.config.option.backend
backend = backend.split(',')
backend = map(lambda x: string.lower(x), backend)
metafunc.parametrize("backend", backend, indirect=True)
def setupmodule(backend):
print "copying for", backend
def pytest_funcarg__backend(request):
request.cached_setup(setup=lambda: setupmodule(request.param),
extrakey=request.param)
return request.param
给出一个带有两个测试的测试模块:
def test_me(backend):
print backend
def test_me2(backend):
print backend
然后您可以运行以检查事情是否按预期发生:
$ py.test -q -s --backend = x,y
收集了4个项目 复制x X .copying for y ÿ 。X .Y
4在0.02秒内通过
由于有两个正在测试的后端,您将获得四个测试,但模块设置仅在模块中使用的每个后端执行一次。