【发布时间】:2018-03-22 05:45:34
【问题描述】:
我在技术上已经解决了我正在解决的问题,但我不禁觉得我的解决方案很丑:
我有一个 pytest 套件,我可以在两种模式下运行:本地模式(用于开发测试;一切都通过 Chrome 在我的开发盒上运行)和 Seriousface 回归测试模式(用于 CI;套件在无数的浏览器和操作系统)。我有一个命令行标志可以在两种模式之间切换,--test-local。如果它在那里,我以本地模式运行。如果它不存在,我会以严肃的方式运行。这是我的做法:
# contents of conftest.py
import pytest
def pytest_addoption(parser):
parser.addoption("--test-local", action="store_true", default=False, help="run locally instead of in seriousface mode")
def pytest_generate_tests(metafunc):
if "dummy" in metafunc.fixturenames:
if metafunc.config.getoption("--test-local"):
driverParams = [(True, None)]
else:
driverParams = [(False, "seriousface setting 1"), (False, "seriousface setting 2")]
metafunc.parameterize("dummy", driverParams)
@pytest.fixture(scope="function")
def driver(dummy):
_driver = makeDriverStuff(dummy[0], dummy[1])
yield _driver
_driver.cleanup()
@pytest.fixture
def dummy():
pass
问题是,dummy 固定装置很可怕。我试过让pytest_generate_tests 直接参数化driver 夹具,但它最终替换 夹具,而不是仅仅向其中输入东西,所以cleanup() 在测试完成时永远不会被调用。使用 dummy 可以让我用参数元组替换 dummy,以便将其传递到 driver()。
但是,重申一下,我所拥有的确实有效,感觉就像是一个笨拙的黑客。
【问题讨论】:
标签: python command-line-arguments pytest fixtures parameterization