Pytest:取消选择测试

59 投票
5 回答
31569 浏览
提问于 2025-04-17 02:09

在使用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跳过那些既慢又长的测试呢?

5 个回答

10

你还可以把标记装饰器叠加在一起使用。

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

然后我运行了 py.test -m "slow and main",结果只有同时带有这两个装饰器的测试被执行。

而运行 py.test -m "not (slow and main)" 时,其他的测试就会被执行。

14

查看了一下pytest的代码(mark.py),还有一些实验后发现,下面的方法似乎有效:

pytest -k "-slow -long"

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

79

另外,最近新增的“-m”命令行选项让你可以这样写:

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

换句话说,“-m”选项接受一个表达式,这个表达式可以把标记当作布尔值来使用(如果在测试函数中没有这个标记,它的值就是假;如果有这个标记,它的值就是真)。

撰写回答