Karate中不使用标签批量运行指定场景失败,单个可运行如何解决?
问题:批量传入带行号的Feature路径时无场景执行
我需要实现从数据库读取存储了路径和行号的特定场景,将这些场景注入到TestRunner中执行。但运行代码时,传入多个带行号的路径列表没有任何场景执行,仅传入单个路径时可以正常运行。
测试代码
@Test @SuppressWarnings("unchecked") public void testParallel() { Assertions.assertThat(Runtime.version().feature()) .as("Java version should be 11").isEqualTo(11); // 模拟从数据库获取场景 List<String> paths = new ArrayList<>(); paths.add("src/test/java/feature/test.feature:4"); paths.add("src/test/java/feature/test.feature:12"); Builder runnerBuilder = new Builder(); runnerBuilder.path(paths); runnerBuilder.outputCucumberJson(true); runnerBuilder.outputJunitXml(true); runnerBuilder.hooks(getKarateHooks()); Results results = runnerBuilder.parallel(1); ... }
相关源码(Karate Runner类的path方法)
public T path(String... value) { this.path(Arrays.asList(value)); return this; } public T path(List<String> value) { if (value != null) { if (this.paths == null) { this.paths = new ArrayList(); } this.paths.addAll(value); } return this; }
解决方案
问题出在Karate对带行号路径的解析逻辑上:带行号的场景路径需要通过单独的path调用逐个传入,而不是一次性传入整个列表。
修改代码,通过循环逐个添加路径:
@Test @SuppressWarnings("unchecked") public void testParallel() { Assertions.assertThat(Runtime.version().feature()) .as("Java version should be 11").isEqualTo(11); // 模拟从数据库获取场景 List<String> paths = new ArrayList<>(); paths.add("src/test/java/feature/test.feature:4"); paths.add("src/test/java/feature/test.feature:12"); Builder runnerBuilder = new Builder(); // 逐个添加每个带行号的路径 for (String path : paths) { runnerBuilder.path(path); } runnerBuilder.outputCucumberJson(true); runnerBuilder.outputJunitXml(true); runnerBuilder.hooks(getKarateHooks()); Results results = runnerBuilder.parallel(1); ... }
原因说明
当你一次性传入包含多个带行号路径的列表时,Karate会将整个列表视为一组Feature文件路径,不会解析每个路径中的行号信息。而通过循环逐个调用path(String)方法,每个带行号的路径都会被单独解析为一个特定场景的定位,从而被正确执行。
内容的提问来源于stack exchange,提问作者mukti wibowo
相关产品推荐
相关产品推荐

