pytest:是不是可以从代码中启用标记?

Posted

技术标签:

【中文标题】pytest:是不是可以从代码中启用标记?【英文标题】:pytest: is it possible to enable a marker from code?pytest:是否可以从代码中启用标记? 【发布时间】:2021-05-27 01:08:07 【问题描述】:

在调用 pytest 时可以使用-m 参数只运行由某个标记标记的测试。

例如pytest -m testsubset_a.

我想知道...是否也可以从代码内部启用这些标记之一?例如在pytest_collection_modifyitems() 期间的某个地方?

我问的原因是因为我正在开发一个测试工具,它将使用 pytest 标记来启用特定的测试子集,但过去没有这样做。由于我们希望向后兼容,因此我想在未给出 -m 参数时启用默认子集(标记)。

【问题讨论】:

@MrBeanBremen 这不是我要问的。我知道您可以将_marker 添加到测试中,我们已经在代码中这样做了。我要问的是你是否可以从代码内部“启用”一个标记(就像它是从 shell 传递给 pytest 一样)。 你需要一个例子来说明这一点吗?是的,我相当肯定这个钩子是可能的 @gold_cy:如果可能的话,当然可以。那会很有帮助!但要明确一点:我不是在谈论item.add_marker()。我知道该怎么做。 @Opifex 正确,即使该人排除了 -m 标志,您也只想运行某些标记,这是期望的行为吗? @gold_cy 是的,例如我有marker_amarker_b;然后用户可以将这两个作为参数传递给-m。但是,如果用户不使用-m,它应该默认为marker_a 【参考方案1】:

您可以使用config.option.markerexpr 轻松地从代码内部访问传递给-m 的标记。

所以...在未传递任何选项时默认设置就像

一样简单
def pytest_collection_modifyitems(config):
    if config.option.markerexpr == "":
        config.option.markerexpr == "mydefaultmarker"

【讨论】:

如果这对你有用,那么这就是你应该做的,显然我给出的例子没有考虑到不同类型的场景。我删除了我的其他答案,因为它不适用,但很高兴您找到了适合您的解决方案。 @gold_cy 实际上,我会赞成您的答案(也许在代码示例中进行了小幅更正之后),因为它也是相关的有用信息。但上面的代码更直接,更不“hacky”。​​ 我不想让那些来到这个页面并试图找到解决方案的人感到困惑。我会赞成你的答案,因为它解决了手头的问题,让未来的读者更容易看到。

以上是关于pytest:是不是可以从代码中启用标记?的主要内容,如果未能解决你的问题,请参考以下文章

接口测试 | 25 requests + pytest测试实例

标记一个 Pytest 夹具而不是使用该夹具的所有测试

pytest完整

pytest-15-自定义标记mark

基于fixture的自动pytest.mark装饰

13-pytest-自定义mark标记