我的目标是获取包/文件夹中测试方法的数量。我可以通过执行来做到这一点
py.test <folder> --collect-only|grep collected
这将测试计数显示为
collected 104 items
但是,这会多次计算参数化测试,例如,如果一个方法有两组参数,单个测试将被计算 2 次。有没有办法告诉 pytest 将它们算作单身?
我的目标是获取包/文件夹中测试方法的数量。我可以通过执行来做到这一点
py.test <folder> --collect-only|grep collected
这将测试计数显示为
collected 104 items
但是,这会多次计算参数化测试,例如,如果一个方法有两组参数,单个测试将被计算 2 次。有没有办法告诉 pytest 将它们算作单身?
如果您在 pytest 中的测试使用自定义测试收集方法或使用参数化,则常规 grepping 将无济于事。常规 grepping 只能为您提供测试功能和测试类。如果您对该号码感兴趣,这里的其他答案应该适合您。如果您想知道收集的测试总数,请继续。
您应该pytest --collect-only
针对目标测试目录运行并在输出上运行 grep。
一种可能的解决方案是:
pytest --collect-only | grep "<Function\|<Class" -c
它将返回具有<Function
或<Class
在输出中的行数pytest --collect-only
。由于所有收集的测试都有这些词中的任何一个,因此它将给出正确数量的测试。
查找测试数量的另一种方法是使用-k
switch。它搜索表达式并运行与表达式匹配的测试。
pytest -k "not test and not Test"
这将为您提供所有测试的数量。它所做的是收集所有测试并尝试找到测试名称中没有test
的测试。由于test
名称中包含所有测试,因此将取消选择所有测试,您将获得测试总数。此方法适用于参数化。
松散地基于我的其他答案。
单线:
$ 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
将仅计算内部buzz
和fuzz
目录等的测试。
如果您想获取有关每个模块中有多少测试的信息,请--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
怎么样
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
希望它可以提供帮助。