如何通过代码在Karate UI中运行多个feature文件?
解决Karate UI通过代码运行多个Feature文件的问题
我之前也碰到过一模一样的问题——Karate UI的app.run()确实没法直接传入多个Feature,而且多次调用只会执行第一个。这是因为每次调用app.run()都会初始化一个全新的UI测试会话,第一个会话启动后,后续的调用要么被阻塞要么直接被忽略。不过有两个很实用的解决方案能搞定这个需求:
方法1:用主Feature文件统一调度
这是最灵活的方案,你可以创建一个主Feature文件,通过call关键字按顺序调用所有需要执行的UI Feature,还能给每个Feature单独传递参数。
举个例子,先创建main-ui-tests.feature:
Feature: 批量执行UI测试集合 Scenario: 按顺序运行多个UI Feature # 调用第一个Feature并传入指定参数 * call read('classpath:path/to/feature1.feature') { arg1: 'your-test-value-1' } # 调用第二个Feature并传入对应参数 * call read('classpath:path/to/feature2.feature') { arg2: 'your-test-value-2' } # 可以继续添加更多Feature的调用
然后在代码里只需要调用这个主Feature即可:
app.run("classpath:main-ui-tests.feature");
这样Karate UI就会严格按顺序执行feature1和feature2,每个Feature都能拿到对应的参数。
方法2:用Karate Runner类批量执行
如果你不想额外创建主Feature,也可以用Karate的Runner类来指定多个Feature路径,同时开启UI模式,注意把并行数设为1来保证顺序执行:
import com.intuit.karate.Runner; public class UiTestRunner { public static void main(String[] args) { Runner.path( "classpath:path/to/feature1.feature", "classpath:path/to/feature2.feature" ) .configProperty("karate.ui", "true") // 启用UI模式 .parallel(1); // 并行数设为1,确保Feature依次执行 } }
这种方式适合不需要给每个Feature单独传复杂参数的场景,配置起来更简洁。
补充说明:为什么多次调用app.run()不行?
本质上app.run()的设计是启动一个独立的UI测试会话,第一次调用启动后,后续的调用会因为会话冲突或者线程阻塞无法正常触发,所以只会运行第一个Feature。
内容的提问来源于stack exchange,提问作者Ranjan Gupta
相关产品推荐
相关产品推荐

