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

时间:2016-04-06 16:25:46

标签: python pytest

有没有办法选择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的输入提供? 要么 是否有可用于此目的的钩子函数?

7 个答案:

答案 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

按节点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

答案 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一起使用。

在这里:

  1. 创建一个新的字典,例如subset_tests_directory
  2. ln -s tests_directory/foo.py
  3. ln -s tests_directory/bar.py

  4. 请注意有关隐式假定文件位于test_directory中的导入操作。我不得不通过在python foo.py内部运行subset_tests_directory并根据需要进行更正来修复其中的一些问题。

  5. 测试脚本一旦正确执行,就在那里cd subset_tests_directorypytest。 Pytest只会选择它看到的脚本。

另一种可能性是在您当前的测试目录中进行符号链接,依次命名为ln -s foo.py subset_foo.pypytest subset*.py。这样可以避免调整导入,但是在您删除符号链接之前,事情会变得很混乱。也为我工作。