Python Pytest:取消选择测试

Python Pytest:取消选择测试,python,pytest,Python,Pytest,使用pytest,可以使用装饰器标记测试 @pytest.mark.slow def some_slow_test(): pass 然后,从命令行可以告诉pytest跳过标记为“slow”的测试 如果我有一个附加标签: @pytest.mark.long def some_long_test() pass 我希望能够跳过长测试和慢测试。我试过这个: pytest -k-slow -k-long 这是: pytest -k-slow,long 这两种方法似乎都不管用 在命令

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

@pytest.mark.slow
def some_slow_test():
    pass
然后,从命令行可以告诉pytest跳过标记为“slow”的测试

如果我有一个附加标签:

@pytest.mark.long
def some_long_test()
    pass
我希望能够跳过长测试和慢测试。我试过这个:

pytest -k-slow -k-long
这是:

pytest -k-slow,long
这两种方法似乎都不管用


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

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

pytest -k "-slow -long"

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

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

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

在这里,“-m”选项接受一个表达式,该表达式可以将标记用作布尔值(如果测试函数中不存在标记,则其值为False,如果存在,则为True)

也可以堆叠标记装饰器

@pytest.mark.slow
@pytest.mark.main
def test_myfunction():
    pass
然后我调用了
py.test-m“slow and main”
,只调用了两个装饰器的测试


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

如果您试图从python文件内部运行测试,也就是说,您通过调用

$ python testfile.py
里面有内容

导入pytest
pytest.main()
您想知道如何将CLI标志传递到
pytest.main
,答案是:

pytest.main([“-m”,“不慢”)

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

你的测试写对了吗?通常,测试从
测试开始?
但无论如何,这取决于您尝试过滤的内容,您可以使用
-k“不慢且不长”
通过名称或使用
-m“不慢且不长”
通过标记来过滤这些测试

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

通过标记表达式运行测试
-m
: 将运行使用
@pytest.mark.slow
装饰器装饰的所有测试

有关更多文档信息,请访问:
  • 或者执行:
    pytest--help

也许API已经改变了。我尝试了
pytest-k“-slow-long”
并返回了
py。test:error:argument-k:期望有一个参数
,这里的重要部分是理解
-m
-k
之间的区别
-m
用于筛选标记,而
-k
用于筛选测试名称。
$ python testfile.py