我的python测试代码中有几个标记:
@pytest.mark.slowtest
@pytest.mark.webtest
@pytest.mark.stagingtest
我能够使用例如pytest -m slowtest
如何在不诉诸pytest -m "not (slowtest or webtest or stagingtest)"
的情况下运行无标记的测试?
您可以想象,我们将来可能会使用其他标记......
答案 0 :(得分:0)
pytest-unmarked plugin旨在完成此任务。
PyPi到项目主页的链接已断开。这是正确的链接https://github.com/alyssabarela/pytest-unmarked
有关在https://docs.pytest.org/en/latest/plugins.html使用插件的更多信息
答案 1 :(得分:0)
您可以在顶级conftest.py中使用以下代码段。
def pytest_runtest_setup(item):
envmarker = item.get_marker()
if envmarker:
pytest.skip("Skipping as the test has a marker")
请记住,参数化也是一个标记。如果您正在使用参数化,则可以在envmarker中进行检查并有条件地跳过。
如果您想使用命令行参数跳过所有未标记的测试,则可能需要在此处https://github.com/pytest-dev/pytest/blob/5d2d64c19063c177f91d9b4a6d85ac7d092e2da8/src/_pytest/mark/legacy.py#L70中找到一个计算结果为True的表达式。 如您所见,它使用python eval方法,您可以给python表达式执行该比赛。
答案 2 :(得分:0)
在conftest中添加以下内容将为所有未标记的测试添加特定的标记,从而为您解决此问题,这样您就可以运行类似pytest -m unmarked
的东西
def pytest_collection_modifyitems(items, config):
for item in items:
if not any(item.iter_markers()):
item.add_marker("unmarked")
与pytest-unmarked相比,它具有优势,因为您仍然可以指定其他标记,例如pytest -m 'webtest or unmarked'
。 pytest-unmarked看上去也没有维护,并发出警告。
答案 3 :(得分:0)
我发现另一个有用的选项是使用pytest.ini
添加默认选项。我们显式地编写要跳过的标记。它需要使pytest.ini
中跳过的标记列表成为主流。换句话说,不是OP要求的100%,但这是我在查找默认标记时发现的最佳SO问题。希望这可以帮助其他人。
来自docs:
addopts
Add the specified OPTS to the set of command line arguments as if they had been specified by the user. Example: if you have this ini file content:
# content of pytest.ini
[pytest]
addopts = --maxfail=2 -rf # exit after 2 failures, report fail info
issuing pytest test_hello.py actually means:
pytest --maxfail=2 -rf test_hello.py
Default is to add no options.
我添加到pytest.ini中的内容
[pytest]
addopts = -m "not slow"
markers =
slow: marks tests as slow (deselect with '-m "not slow"')
使用
﮸$ grep 'mark.slow' tests/*.py | wc -l
3
$ pytest -s
======================================================= test session starts ========================================================
platform linux -- Python 3.8.2, pytest-6.0.1, py-1.9.0, pluggy-0.13.1
rootdir: /tests, configfile: pytest.ini
collected 66 items / 3 deselected / 63 selected
../tests/test_app.py ...............................................................
================================================= 63 passed, 3 deselected in 8.70s =================================================