是否有办法从文件中选择要运行的pytest测试?
例如,文件foo.txt包含要执行的测试列表:
tests_directory/foo.py::test_001
tests_directory/bar.py::test_some_other_test
或者,是否有一种方法可以从pytest的不同目录中选择多个测试,测试名称中没有公共模式?
Pytest -k <pattern>允许单个模式。
一种选择是做尿检。针对每个测试进行标记,但我的要求是运行来自不同文件的不同测试组合。
是否有办法为每个模式指定多个模式和一个测试文件名?
Or
是否有一种方法可以在文件中指定准确的测试路径,并将该文件作为输入提供给pytest?
Or
是否有可以用于此目的的钩子函数?
我的回答提供了一种在不同场景中运行测试子集的方法。
运行项目中的所有测试
pytest
在单个目录中运行测试
要从一个目录运行所有测试,请将该目录作为参数
pytest:
pytest tests/my-directory
在单个测试文件/模块中运行测试
要运行一个充满测试的文件,请将具有相对路径的文件作为pytest的参数列出:
pytest tests/my-directory/test_demo.py
运行一个测试函数
要运行单个测试函数,添加::和测试函数名:
pytest -v tests/my-directory/test_demo.py::test_specific_function
使用-v可以看到运行了哪个函数。
运行一个测试类
要只运行一个类,就像我们对函数所做的那样,添加::,然后将类名添加到文件形参中:
pytest -v tests/my-directory/test_demo.py::TestClassName
运行一个测试类的单个测试方法
如果不想运行一个测试类的所有部分,只运行一个方法,只需添加
另一个::和方法名:
pytest -v tests/my-directory/test_demo.py::TestClassName::test_specific_method
根据测试名称运行一组测试
-k选项使您可以传入一个表达式以运行具有的测试
表达式指定的某些名称作为测试名称的子字符串。
可以使用and、or和不创建复杂的表达式。
例如,要运行所有名称中包含_raise的函数:
pytest -v -k _raises
指定测试/选择测试
Pytest支持多种从命令行运行和选择测试的方法。
在模块中运行测试
pytest test_mod.py
在目录中运行测试
pytest测试/
按关键字表达式运行测试
pytest -k“MyClass而不是方法”
这将运行包含与给定字符串表达式匹配的名称的测试,其中可以包括使用文件名、类名和函数名作为变量的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慢
将运行所有带有@pytest.mark标记的测试。缓慢的装饰。
有关更多信息,请参阅标记。
从包中运行测试
Pytest——pyargs pkg.testing
这将导入pkg.testing,并使用它的文件系统位置来查找和运行测试。
来源:https://docs.pytest.org/en/latest/usage.html specifying-tests-selecting-tests
这是一个可能的部分答案,因为它只允许选择测试脚本,而不是那些脚本中的单个测试。
而且它也受到我使用遗留兼容模式与unittest脚本的限制,所以不能保证它可以与本机pytest一起工作。
是:
创建一个新目录,比如subset_tests_directory。
Ln -s tests_directory/foo.py
Ln -s tests_directory/bar.py
对于那些隐式假设文件在test_directory中的导入,要小心。我必须通过在subset_tests_directory中运行python foo.py来修复其中的几个问题,并根据需要进行纠正。
一旦测试脚本正确执行,只需cd subset_tests_directory和pytest即可。Pytest只会选取它看到的脚本。
另一种可能是在当前测试目录中进行符号链接,比如ln -s foo.py subset_foo.py然后pytest子集*.py。这将避免需要调整导入,但它会使事情变得混乱,直到您删除符号链接。对我来说也是如此。