如何通过JMH Jar文件仅运行指定的部分基准测试方法?
JMH指定运行部分基准测试方法失败的解决办法
问题场景
已有包含3个基准测试方法的JMH测试类:
@BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.NANOSECONDS) @Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) @Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) @Fork(1) @State(Scope.Benchmark) public class TestBenchmark { private CW cw; @Param({"C:data.csv"}) public String fileName; @Param({"100"}) public int id; @Setup public void setup() { cw = new CW(fileName); } @Benchmark public void method1() { cw.method1(id); } @Benchmark public void method2() { cw.method2(id); } @Benchmark public void method3() { cw.method3(id); } }
已执行mvn clean install编译得到benchmark.jar,希望仅运行method1和method2,但执行命令java -jar benchmark.jar -f "method1|method2"时出现错误:
Error parsing command line: Cannot parse argument 'method1|method2' of option f
原因分析
-f是--forks参数的缩写,作用是指定JVM fork的次数,并非用来过滤要运行的测试方法,因此传入方法名会触发参数解析错误。
解决方案
JMH提供多种方式指定要运行的测试方法,以下是几种可行的命令:
方式1:直接传入方法名匹配正则
java -jar benchmark.jar "method1|method2"
方式2:用逗号分隔多个方法名
java -jar benchmark.jar method1,method2
方式3:使用-include参数明确指定匹配规则
java -jar benchmark.jar -include "method1|method2"
如果存在同名方法的其他测试类,也可以指定完整的方法签名来避免冲突:
java -jar benchmark.jar "TestBenchmark.method1|TestBenchmark.method2"
内容的提问来源于stack exchange,提问作者one-hand-octopus
相关产品推荐
相关产品推荐

