如何计算用pytest编写的测试用例?

pr4*_*4sh 3 command-line file-search pytest

我的目标是获得包装/文件夹中的测试方法数量。我可以通过执行

py.test <folder> --collect-only|grep collected

这显示测试计数为

collected 104 items

但是,这将对参数化测试进行多次计数,例如,如果某个方法具有两组参数,则一次测试将被计数2次。有什么方法可以告诉pytest将它们视为单个?

Mis*_*dze 6

怎么样

find . -type f -name 'test*.py' -exec grep -e 'def test_' '{}' \; | wc -l
Run Code Online (Sandbox Code Playgroud)

要么

ag 'def test_' | wc -l
Run Code Online (Sandbox Code Playgroud)


Sil*_*Guy 6

如果您在pytest中的测试使用自定义测试收集方法或使用参数化,则常规grepping将无济于事。常规grepping只能为您提供测试功能和测试类。如果您对该数字感兴趣,那么这里的其他答案应该对您有用。如果您想知道收集的测试总数,请遵循。

您应该运行pytest --collect-only目标测试目录,并在输出上运行grep。

一种可能的解决方案是:

pytest --collect-only | grep "<Function\|<Class" -c

它将返回具有<Function<Class输出的行数pytest --collect-only。由于所有收集的测试都有这两个词之一,因此它将给出正确数量的测试。

查找测试数量的另一种方法是使用-kswitch。它搜索表达式并运行与表达式匹配的测试。

pytest -k "not test and not Test"

这将为您提供所有测试的数量。它所做的是收集所有测试,并尝试查找test测试名称中没有的测试。由于所有测试均具有test名称,因此将取消选择所有测试,您将获得测试总数。此方法适用于参数化。


hoe*_*ing 6

粗略地基于我的其他答案

计算所有测试

单线:

$ pytest --collect-only -q | head -n -2 | wc -l
Run Code Online (Sandbox Code Playgroud)

解释

--collect-only结合-q每行输出一个测试,带有尾随信息行。例子:

$ pytest --collect-only -q
test_eggs.py::test_bacon[1]
test_eggs.py::test_bacon[2]
test_eggs.py::test_bacon[3]
test_spam.py::test_foo
test_spam.py::test_bar

no tests ran in 0.00 seconds
Run Code Online (Sandbox Code Playgroud)

其余的只是例行公事:head -n -2剥离信息行,wc -l计算行数。

像往常一样应用进一步的过滤工作,例如

$ pytest --collect-only -q -k "fizz" | head -n -2 | wc -l
Run Code Online (Sandbox Code Playgroud)

将只计算fizz名称中包含的测试,

$ pytest --collect-only -q buzz/ fuzz/ | head -n -2 | wc -l
Run Code Online (Sandbox Code Playgroud)

将只计算内部buzzfuzz目录等的测试。

每个测试模块的测试计数

如果您想获取有关每个模块中有多少测试的信息,请--collect-only结合使用-qq

$ pytest --collect-only -qq
test_eggs.py: 3
test_spam.py: 2
Run Code Online (Sandbox Code Playgroud)

计数唯一测试(测试参数化计为单个测试)

OP 最初要求的内容。这是对上述命令的修改,它从测试名称中去除参数化并在计数之前删除重复的行:

$ pytest --collect-only -q | head -n -2 | sed 's/\[.*\]$//' | sort | uniq | wc -l
Run Code Online (Sandbox Code Playgroud)