如何统计用pytest写的测试用例?

How to count test cases written with pytest?

我的objective是获取一个package/folder中的测试方法个数。我可以通过执行

来做到这一点

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

这显示测试计数为

collected 104 items

然而,这会多次计算参数化测试,例如如果一个方法有两组参数,单次测试将被计为2次。 有没有办法告诉pytest将它们算作单身?

怎么样

find . -type f -name 'test*.py' -exec grep -e 'def test_' '{}' \; | wc -l

ag 'def test_' | wc -l

还有一个解决方案:

egrep -e 'def test_' -r ./ | wc -l

希望对您有所帮助。

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

你应该 运行 pytest --collect-only 目标测试目录和 运行 grep 输出。

一个可能的解决方案是:

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

它将return在pytest --collect-only的输出中具有<Function<Class的行数。由于所有收集的测试都有这些词中的任何一个,因此它将给出正确的测试数量。

另一种查找测试次数的 hacky 方法是使用 -k 开关。它搜索表达式和 运行 匹配表达式的测试。

pytest -k "not test and not Test"

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

粗略地基于

计算所有测试

One-liner:

$ pytest --collect-only -q | head -n -2 | wc -l

说明

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

剩下的只是例行公事:head -n -2去掉信息行,wc -l计算行数。

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

$ pytest --collect-only -q -k "fizz" | head -n -2 | wc -l

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

$ pytest --collect-only -q buzz/ fuzz/ | head -n -2 | wc -l

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

计算每个测试模块的测试次数

如果您想了解每个模块中有多少个测试,请结合使用 --collect-only-qq:

$ pytest --collect-only -qq
test_eggs.py: 3
test_spam.py: 2

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

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

$ pytest --collect-only -q | head -n -2 | sed 's/\[.*\]$//' | sort | uniq | wc -l