55

使用 pytest,可以使用装饰器标记测试

@pytest.mark.slow
def some_slow_test():
    pass

然后,从命令行,可以告诉 pytest 跳过标记为“慢”的测试

pytest -k-slow

如果我有一个额外的标签:

@pytest.mark.long
def some_long_test()
    pass

我希望能够跳过长测试和慢测试。我试过这个:

pytest -k-slow -k-long

还有这个:

pytest -k-slow,long

而且似乎都不起作用。

在命令行中,我如何告诉 pytest 跳过慢速测试和长时间测试?

4

5 回答 5

72

此外,通过最近添加的“-m”命令行选项,您应该能够编写:

py.test -m "not (slow or long)"

IOW,“-m”选项接受可以将标记用作布尔值的表达式(如果标记在测试函数上不存在,则其值为 False,如果存在,则为 True)。

于 2012-02-02T17:53:46.723 回答
14

查看pytest代码 ( mark.py) 和进一步的实验表明以下似乎有效:

pytest -k "-slow -long"

(使用该--collect-only选项可加快实验速度)

于 2011-09-13T18:41:10.660 回答
8

也可以堆叠标记装饰器。

@pytest.mark.slow
@pytest.mark.main
def test_myfunction():
    pass

然后我打电话py.test -m "slow and main",只调用了两个装饰器的测试。

py.test -m "not (slow and main)"导致其他测试运行

于 2015-11-08T22:13:26.307 回答
1

如果您尝试从 python 文件中运行测试,也就是说,您可以通过调用

$ python testfile.py

其中有内容

import pytest

pytest.main()

并且您想知道如何将 CLI 标志传递给pytest.main,答案是:

pytest.main(["-m", "not slow"])

PS - 是的,以这种方式调用测试是有正当理由的。祈祷你永远不必学习它们。

于 2020-02-08T01:28:51.730 回答
0

你的测试写对了吗?通常,测试以test_? 但无论如何,这取决于您尝试过滤的内容,您可以使用名称-k "not slow and not long"标签过滤-m "not slow and not long"这些测试。

通过关键字表达式运行测试

-k:这将运行包含与给定字符串表达式匹配的名称(不区分大小写)的测试,其中可以包括使用文件名、类名和函数名作为变量的 Python 运算符。

通过标记表达式运行测试

-m:将运行所有用@pytest.mark.slow装饰器装饰的测试。

更多文档信息可以在以下位置找到:

于 2020-05-01T15:13:20.507 回答