任何人都可以告诉我如何通过maven-surefire
将单个测试类中的每个单元测试所花费的时间放在一个文件中?我看到我的target/surefire-report
每个测试都有文件。基本上我正在寻找一个总结了所有执行时间的文件。如果可能,还要按每次测试的执行时间对结果进行排序。
我正在使用maven 3.5&在MacOSX 10.12.6上的surefire-plugin 2.4.2。
答案 0 :(得分:4)
maven-surefire-plugin
目前不允许您这样做。它将所有结果写入单独的文件中。如果您觉得这是一个缺失的功能,可以在issue tracker中创建一个功能请求。
但是,您可以使用某些Linux命令将输出转换为您需要的输出。以下是一些将单独的XML文件转换为单个文件的命令:
grep testcase target/surefire-reports/TEST-*.xml |
sed 's/.* name="\(.*\)" classname="\(.*\)" time="\(.*\)".*/\2#\1() - \3ms/g' |
sort -n -k 3 > output.txt
更新:数字排序存在不同数量的分数问题
数字。使用下面的awk
版本来解决此问题。
同样的事情可以用awk
做得更短,更少隐秘:
grep -h testcase target/surefire-reports/TEST-*.xml |
awk -F '"' '{printf("%s#%s() - %.3fms\n", $4, $2, $6); }' |
sort -n -k 3 > output.txt
生成surefire-reports后,必须从maven项目的toplevel目录中执行这些命令。
如果你有多模块项目,请改用:
find . -name TEST-*.xml -exec grep -h testcase {} \; |
awk -F '"' '{printf("%s#%s() - %.3fms\n", $4, $2, $6); }' |
sort -n -k 3 > output.txt
生成的文件为output.txt
,其中包含以下格式的行:
<classname>#<methodname>() - <time>ms
结果按消耗时间排序。
答案 1 :(得分:0)
您可以使用surefire-report-plugin对结果进行汇总(但仍然无法对其进行排序)
mvn surefire-report:report -DlinkXRef=false -Daggregate=true
或
mvn surefire-report:report-only -DlinkXRef=false -Daggregate=true
如果您已经使用surefire插件构建项目。
这将在根目标目录中生成surefire-report.html,您可以在其中找到每个模块和每个测试套件的时间统计信息。
答案 2 :(得分:0)
我用Martin Höller的代码片段写了一个小的bash脚本,可以帮助某人:
#!/bin/bash
# This script goes through tests results in `target/surefire-reports` and sorts the results by the
# amount of time they took. This is helpful to identify slow tests.
set -e
# Make sure the surefire folder exists
if [ ! -d "target/surefire-reports" ]; then
echo "The folder 'target/surefire-reports' doesn't exists. Please run tests before using this script."
exit 1
fi
# Go through the surefire test reports and sort tests by time taken. Source for this snippet:
# https://stackoverflow.com/questions/45854277/execution-time-of-tests-in-unit-test-class-via-maven-surefire-report-in-a-single/45859700#45859700
grep -h testcase target/surefire-reports/TEST-*.xml |
awk -F '"' '{print $4 "#" $2 "() - " $6 "ms" }' |
sort -rn -k 3