有没有办法从文件中选择要运行的 pytest
测试?例如,包含要执行的测试列表的文件 foo.txt
:
tests_directory/foo.py::test_001
tests_directory/bar.py::test_some_other_test
或者,有没有办法使用 pytest 从不同的目录中选择多个测试,在测试名称中没有共同的模式?
pytest -k <pattern>
允许单一模式。
一种选择是对每个测试都有一个 pytest.mark
,但我的要求是从不同的文件运行不同的测试组合。
有没有办法为每个模式指定多个模式和测试文件名?
或者
有没有办法在文件中指定确切的测试路径并将该文件作为输入提供给 pytest
?
或者
是否有可用于此目的的钩子函数?
您可以使用 -k
option 运行具有不同模式的测试用例:
py.test tests_directory/foo.py tests_directory/bar.py -k 'test_001 or test_some_other_test'
这将运行名为 test_001 和 test_some_other_test 的测试用例,取消选择其余的测试用例。
注意:这将选择以 test_001 或 test_some_other_test 开头的任何测试用例。例如,如果您有测试用例 test_0012,它也会被选中。
指定测试/选择测试
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
装饰器装饰的测试。
有关详细信息,请参阅 marks。
从包运行测试
pytest --pyargs pkg.testing
这将导入 pkg.testing
并使用其文件系统位置来查找和运行测试。
来源:https://docs.pytest.org/en/latest/usage.html#specifying-tests-selecting-tests
我的回答提供了一种在不同场景中运行测试子集的方法。
运行项目中的所有测试
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 和 not 来创建复杂的表达式。
例如,要运行名称中包含 _raises 的所有函数:
pytest -v -k _raises
test_demo.py::test_function[test_parameters_1]
运行,那么您可以在命令行上给出它来运行这个参数实例。
方法1:随机选择测试。又长又丑。
python -m pytest test/stress/test_performance.py::TestPerformance::test_continuous_trigger test/integration/test_config.py::TestConfig::test_valid_config
方法 2:使用关键字表达式。
注意:我正在按测试用例名称搜索。同样适用于 TestClass 名称。
案例1:以下将运行找到的任何一个。由于我们使用了 'OR' 。
python -m pytest -k 'test_password_valid or test_no_configuration'
假设上面两个实际上是正确的,将运行 2 个测试。
案例 2:现在一个不正确的名称和另一个正确的名称。
python -m pytest -k 'test_password_validzzzzzz or test_no_configuration'
只有一个被发现并运行。
案例 3:如果您想运行提到的所有测试或无,则使用 AND
python -m pytest -k 'test_password_valid and test_no_configuration'
如果正确或不正确,两者都将运行。
案例 4:仅在一个文件夹中运行测试:
python -m pytest test/project1/integration -k 'test_password_valid or test_no_configuration'
案例 5:仅从一个文件运行测试。
python -m pytest test/integration/test_authentication.py -k 'test_password_expiry or test_incorrect_password'
案例 6:运行除匹配项之外的所有测试。
python -m pytest test/integration/test_authentication.py -k 'not test_incorrect_password'
如果您在两个不同的类中具有相同的方法名称,并且只想运行其中一个,则可以使用:
pytest tests.py -k "TestClassName and test_method_name"
根据有关按节点ID运行测试的文档
因为您在 foo.txt 中拥有所有节点 ID,所以只需运行
pytest $(tr '\n' ' ' <foo.txt)
这与以下命令相同(问题中有文件内容)
pytest tests_directory/foo.py::test_001 tests_directory/bar.py::test_some_other_test
也许使用 pytest_collect_file()
钩子,您可以解析 .txt
o .yaml
文件的内容,其中指定了您想要的测试,并将它们返回给 pytest 核心。
pytest documentation 中显示了一个很好的示例。我想你在找什么。
尝试:
pytest path/file_test.py::test_name
像其他人建议的那样使用 -k
将匹配具有该子字符串的任何测试,而不仅仅是特定测试。
这是一个可能的部分答案,因为它只允许选择测试脚本,而不是这些脚本中的单个测试。
而且它还受到我使用旧版兼容模式与 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 subset*.py
。这将避免需要调整您的导入,但在您删除符号链接之前它会使事情变得混乱。也为我工作。
例如,假设您有一个名为 test.py
的文件。在此文件中,您有一个名为 TestSomeService
的类。该类有 2 个函数,即 test_service1
和 test_service2
。
现在要运行特定的功能测试,您可以这样做
pytest test.py::TestSomeService::test_service1
pytest test.py::TestSomeService::test_service2
运行特定的类
pytest test.py::TestSomeService
假设测试名称是唯一的,您必须删除测试文件的名称:
cut -d : -f 3 foo.txt > FAILED_TESTS.txt
正如其他人指出的那样使用 -k
,但您必须将文件的内容(即测试名称列表)作为单个字符串传递:
pytest -k "$(awk '$1=$1' RS= OFS=' or ' FAILED_TESTS.txt)"
awk
将用分隔符 or
替换新行,以便以 pytest 期望的格式连接测试名称。
py.test path/to/test/file.py -k function_name_test