如何统计用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
将只计算 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
我的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
将只计算 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