关于python:有没有办法指定从文件运行哪些pytest测试?

Is there a way to specify which pytest tests to run from a file?

是否有方法从文件中选择要运行的pytest测试?例如,文件foo.txt包含要执行的测试列表:

1
2
tests_directory/foo.py::test_001
tests_directory/bar.py::test_some_other_test

或有没有一种方法可以从使用pytest的不同目录中选择多个测试,测试名称中没有通用模式?

py.test -k 允许单一模式。

一个选项是对每个测试使用pytest.mark,但我的要求是从不同的文件运行不同的测试组合。

是否有方法为每个模式指定多个模式和一个测试文件名?或者,有没有一种方法可以在文件中指定精确的测试路径,并将该文件作为pytest的输入进行馈送?或是否有可用于此目的的挂钩功能?


您可以使用-k选项运行具有不同模式的测试用例:

1
py.test tests_directory/foo.py tests_directory/bar.py -k 'test_001 or test_some_other_test'

这将运行名为test_001的测试用例,并测试一些其他的测试,取消选择其余的测试用例。

Note: This will select any test case starting with test_001 or test_some_other_test. For example, if you have test case test_0012 it will also be selected.


指定测试/选择测试

pytest支持几种方法来运行和从命令行中选择测试。

在模块中运行测试

pytest test_mod.py

在目录中运行测试

pytest testing/

按关键字表达式运行测试

pytest -k"MyClass and not method"

这将运行包含与给定字符串表达式匹配的名称的测试,其中可以包括使用文件名、类名和函数名作为变量的python操作符。上面的示例将运行TestMyClass.test_something,但不运行TestMyClass.test_method_simple

按节点ID运行测试

每个收集到的测试都被分配一个唯一的nodeid,它由模块文件名和诸如类名、函数名以及参数化参数等说明符组成,用::字符分隔。

在模块内运行特定测试:

pytest test_mod.py::test_func

在命令行中指定测试方法的另一个示例:

pytest test_mod.py::TestClass::test_method

按标记表达式运行测试

pytest -m slow

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

有关更多信息,请参见标记。

从包运行测试

pytest --pyargs pkg.testing

这将导入pkg.testing,并使用其文件系统位置查找和运行测试。

来源:https://docs.pytest.org/en/latest/usage.html指定测试选择测试


这里有一个可能的部分答案,因为它只允许选择测试脚本,而不允许在这些脚本中选择单个测试。

而且它也受到了我使用遗留兼容模式和unittest脚本的限制,因此不能保证它可以与本机pytest一起工作。

下面是:

  • 创建一个新的口述,比如说subset_tests_directory
  • ln -s tests_directory/foo.py
  • ln -s tests_directory/bar.py

  • 对于隐式假定文件在test_directory中的导入要小心。我不得不通过运行python foo.py,从subset_tests_directory内部运行python foo.py,并根据需要进行纠正来修复其中的一些问题。

  • 一旦测试脚本正确执行,只有cd subset_tests_directorypytest在那里。pytest将只获取它看到的脚本。

  • 另一种可能是在当前的测试目录中进行符号链接,比如说ln -s foo.py subset_foo.py,然后是pytest subset*.py。这样可以避免调整导入,但在删除符号链接之前,它会使事情变得杂乱无章。也为我工作。


    也许使用pytest_collect_file()钩子,您可以解析.txto .yaml文件中指定测试的内容,并将它们返回到pytest核心。

    Pytest文档中显示了一个很好的示例。我想你在找什么。