【问题标题】:Can't get pytest to understand command-line arguments on setups无法让 pytest 了解设置中的命令行参数
【发布时间】:2012-10-27 20:44:32
【问题描述】:

所以我一直在尝试让 pytest 根据一些命令行参数在不同的环境中运行 selenium 测试。但它一直抛出这个错误:

TypeError: setup_class() takes exactly 2 arguments (1 given)

似乎可以理解 setup_class 接受 2 个参数,但 host 没有被传递。这是setup_class的代码:

def setup_class(cls, host):
        cls.host = host

这里是 conftest.py 文件:

def pytest_addoption(parser):
    parser.addoption("--host", action="store", default='local',
        help="specify the host to run tests with. local|stage")

@pytest.fixture(scope='class')
def host(request):
    return request.config.option.host

奇怪的是 host 被函数看到了(所以如果我创建一个 test_function 并将 host 作为参数传递,它就可以了),只是 setup 固定装置不起作用.

我环顾四周发现了这个,pytest - use funcargs inside setup_module,但这似乎不起作用(自 2.3 以来它已经过时了。

有谁知道我做错了什么?使用 py.test 2.3.2。

谢谢

【问题讨论】:

    标签: python unit-testing testing command-line-arguments pytest


    【解决方案1】:

    要从设置函数内部访问命令行选项,您可以使用 pytest.config 对象。这是一个示例...根据需要进行调整。

    import pytest
    
    def setup_module(mod):
        print "Host is %s" % pytest.config.getoption('host')
    

    【讨论】:

    • 对于未来的访问者,只需跳过已接受的答案并使用它。这有效,并且比接受的答案采取的步骤更少。
    • 未来 ?:pytest.config 已在 5.0 版中删除。 docs.pytest.org/en/stable/…
    【解决方案2】:

    setup_module/class/method 和朋友不能直接使用 pytest 固定装置。 pytest-2.3 的等效方法是使用autouse fixtures。如果可以的话,最好将fixture 显式传递给测试函数或将usefixtures marker 放在类或模块上。

    【讨论】:

    • Here 它说“夹具的名称又是 smtp,您可以通过在任何测试或设置函数中将名称 smtp 作为输入参数列出来访问其结果”。所以我可以在设置等上使用它,不是吗? autouseuses 使所有测试都运行该代码,我只是希望设置能够做到这一点。
    • 我会给你答案。即使您没有回答我的具体答案,您也给了我一个解决方法。这很奇怪,文档说您可以做到,但似乎并非如此。无论如何,谢谢。
    • 你是对的,文档具有误导性。或者实际上是,我刚刚上传了一个用“fixture function”替换“setup function”的修复程序。对不起!
    猜你喜欢
    • 2020-11-27
    • 1970-01-01
    • 2017-05-25
    • 2022-10-21
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    相关资源
    最近更新 更多