有没有办法选择pytest测试从文件运行? 例如,包含要执行的测试列表的文件foo.txt:
tests_directory/foo.py::test_001
tests_directory/bar.py::test_some_other_test
或者 有没有办法从pytest的不同目录中选择多个测试,测试名称中没有共同的模式?
py.test -k <pattern>
允许单一模式。
一个选项是对每个测试都有一个pytest.mark,但我的要求是从不同的文件中运行不同的测试组合。
有没有办法为每个模式指定多个模式和测试文件名? 或者有没有办法在文件中指定确切的测试路径并将该文件作为pytest的输入提供? 要么 是否有可用于此目的的钩子函数?
答案 0 :(得分:31)
我的答案提供了一种在不同情况下运行测试子集的方法。
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
选项,您可以传递表达式以运行具有以下内容的测试:
表达式指定为测试名称的子字符串的某些名称。
可以使用和,或和 not 创建复杂的表达式。
例如,要运行所有名称中带有_raises的函数:
pytest -v -k _raises
答案 1 :(得分:24)
Pytest支持多种从命令行运行和选择测试的方法。
pytest test_mod.py
pytest testing/
pytest -k "MyClass and not method"
这将运行包含与给定字符串表达式匹配的名称的测试,其中可以包括将文件名,类名和函数名用作变量的Python运算符。上面的示例将运行TestMyClass.test_something
,但不会运行TestMyClass.test_method_simple
。
为每个收集的测试分配一个唯一的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
答案 2 :(得分:11)
方法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'
答案 3 :(得分:1)
如果在两个不同的类中具有相同的方法名称,而您只想运行其中一个,则可以:
pytest tests.py -k 'TestClassName and test_method_name'
答案 4 :(得分:1)
根据有关按节点ID运行测试的文档
由于您在foo.txt中具有所有节点ID,因此只需运行
pytest `cat foo.txt | tr '\n' ' '`
这与以下命令相同(问题中包含文件内容)
pytest tests_directory/foo.py::test_001 tests_directory/bar.py::test_some_other_test
答案 5 :(得分:0)
也许使用pytest_collect_file()
挂钩,您可以解析.txt
o .yaml
文件的内容,并根据需要指定测试,并将它们返回到pytest核心。
pytest documentation中显示了一个很好的例子。我想你在寻找什么。
答案 6 :(得分:0)
这里可能是部分答案,因为它仅允许选择测试脚本,而不能选择这些脚本中的单个测试。
它也受我使用旧版兼容模式与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
并根据需要进行更正来修复其中的一些问题。
测试脚本一旦正确执行,就在那里cd subset_tests_directory
和pytest
。 Pytest只会选择它看到的脚本。
另一种可能性是在您当前的测试目录中进行符号链接,依次命名为ln -s foo.py subset_foo.py
和pytest subset*.py
。这样可以避免调整导入,但是在您删除符号链接之前,事情会变得很混乱。也为我工作。