是否有方法指定从文件中运行哪些pytest测试?

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

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

或者,是否有一种方法可以从pytest的不同目录中选择多个测试,测试名称中没有公共模式?

pytest -k <pattern>允许使用单一模式。

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

是否有办法为每个模式指定多个模式和一个测试文件名?

是否有一种方法可以在文件中指定准确的测试路径,并将该文件作为pytest的输入?

是否有可以用于此目的的钩子函数?

423030 次浏览

你可以使用# EYZ0选项来运行不同模式的测试用例:

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

这将运行名称为test_001test_some_other_test的测试用例,取消选择其余的测试用例。

注意:这将选择任何以Test_001或test_some_other_test开头的测试用例。例如,如果您有测试用例test_0012,它也会被选中。

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

pytest文档中显示了一个很好的示例。我想这就是你要找的。

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

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

是:

  1. 创建一个新目录,比如subset_tests_directory
  2. # EYZ0
  3. # EYZ0

  4. 对于那些隐式假设文件在test_directory中的导入,要小心。我必须通过在subset_tests_directory中运行python foo.py来修复其中的几个问题,并根据需要进行纠正。

  5. 一旦测试脚本正确执行,只需要cd subset_tests_directorypytest即可。Pytest只会选取它看到的脚本。

另一种可能是在当前测试目录中进行符号链接,例如ln -s foo.py subset_foo.pypytest subset*.py。这将避免需要调整导入,但它会使事情变得混乱,直到您删除符号链接。对我来说也是如此。

指定测试/选择测试

Pytest支持多种从命令行运行和选择测试的方法。

在模块中运行测试

# EYZ0

在目录中运行测试

# EYZ0

按关键字表达式运行测试

# EYZ0

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

按节点id运行测试

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

在一个模块中运行一个特定的测试:

# EYZ0

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

# EYZ0

通过标记表达式运行测试

# EYZ0

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

更多信息请参见标志着

从包中运行测试

# EYZ0

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

来源:# EYZ0

如果你在两个不同的类中有相同的方法名,你只想运行其中一个,这是可行的:

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

方法1:随机选择测试。又长又丑。

python -m pytest test/stress/test_performance.py::TestPerformance::test_continuous_trigger test/integration/test_config.py::TestConfig::test_valid_config

方法二:使用关键字表达式。

我正在通过测试用例名称搜索。同样适用于TestClass名称。

下面将运行找到的任何一个。因为我们已经使用了'OR'。

python -m pytest -k 'test_password_valid or test_no_configuration'

假设上面两个实际上是正确的,将运行2个测试。

现在是一个错误的名称和另一个正确的名称。

python -m pytest -k 'test_password_validzzzzzz or test_no_configuration'

只有一个被找到并运行。

案例3:如果你想运行所有提到的测试,或者None,那么使用AND

python -m pytest -k 'test_password_valid and test_no_configuration'

如果正确或不正确,两者都将运行。

只在一个文件夹中运行测试:

python -m pytest test/project1/integration -k 'test_password_valid or test_no_configuration'

只从一个文件运行测试。

python -m pytest test/integration/test_authentication.py -k 'test_password_expiry or test_incorrect_password'

运行除匹配之外的所有测试。

python -m pytest test/integration/test_authentication.py -k 'not  test_incorrect_password'

我的回答提供了一种在不同场景中运行测试子集的方法。

运行项目中的所有测试

pytest

在单个目录中运行测试

要从一个目录运行所有测试,请使用该目录作为参数 # EYZ0: < / p >

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选项使您可以传入一个表达式以运行具有的测试 表达式指定的某些名称作为测试名称的子字符串。 可以使用而且来创建复杂的表达式

例如,要运行所有名称中包含_raise的函数:

pytest -v -k _raises

假设测试名称是唯一的,你必须删除测试文件的名称:

cut -d : -f 3 foo.txt > FAILED_TESTS.txt

正如其他人指出的那样,使用-k,但是您必须将文件的内容(即测试名称列表)作为单个字符串传递:

pytest -k "$(awk '$1=$1' RS= OFS=' or '  FAILED_TESTS.txt)"

awk将用分隔符 or 替换新行,以便测试名称以pytest期望的格式连接。

试一试:

pytest path/file_test.py::test_name

像其他人建议的那样使用-k将匹配任何带有该子字符串的测试,而不仅仅是特定的测试。

例如,您有一个名为test.py的文件。在这个文件中,有一个名为TestSomeService的类。这个类有两个函数,分别是test_service1test_service2

  1. 现在要运行特定的功能测试,您可以这样做
  • # EYZ0
  • # EYZ0
  1. 运行特定的类
  • # EYZ0