JUnit测试类超时后,如何通过Bazel获取单个测试方法耗时
通过Bazel获取JUnit单个测试方法执行耗时的方案
方法1:启用Bazel的详细超时警告日志
直接在运行测试时添加--test_verbose_timeout_warnings参数,当测试类超时后,Bazel会额外输出已完成测试方法的执行时间,你可以从这些日志里定位耗时最长的方法:
bazel test //your/test/target:test_class --test_timeout=300 --test_verbose_timeout_warnings
输出中会包含类似这样的关键信息:
Test case com.example.YourTest.testMethodA took 120s
Test case com.example.YourTest.testMethodB took 90s
方法2:生成JUnit XML测试报告
Bazel支持生成标准JUnit XML报告,里面会记录每个测试方法的精确执行耗时——即使测试类最终超时,已完成的方法数据也会被完整写入:
bazel test //your/test/target:test_class --test_timeout=300 --test_output=xml --xml_test_output=test_results.xml
打开生成的test_results.xml文件,每个<testcase>标签的time属性就是对应方法的执行耗时(单位:秒),示例如下:
<testcase classname="com.example.YourTest" name="testMethodA" time="120.5"/> <testcase classname="com.example.YourTest" name="testMethodB" time="90.2"/>
方法3:自定义JUnit监听器记录耗时
如果需要更灵活的日志输出,可以编写一个JUnit监听器,在每个测试方法开始和结束时记录时间,Bazel会捕获这些日志并输出:
import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.api.extension.TestWatcher; import java.util.Optional; public class TimingExtension implements TestWatcher { private long startTime; @Override public void testStarted(ExtensionContext context) { startTime = System.currentTimeMillis(); } @Override public void testSuccessful(ExtensionContext context) { long duration = System.currentTimeMillis() - startTime; System.out.printf("方法[%s]执行耗时:%d ms%n", context.getDisplayName(), duration); } }
然后在测试类上注册这个监听器:
import org.junit.jupiter.api.extension.ExtendWith; @ExtendWith(TimingExtension.class) public class YourTest { // 测试方法实现 }
运行测试时添加--test_output=streamed参数,实时查看每个方法的耗时日志:
bazel test //your/test/target:test_class --test_timeout=300 --test_output=streamed
内容的提问来源于stack exchange,提问作者Binary_Beast
相关产品推荐
相关产品推荐

