You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Karate框架如何将多个测试步骤封装为单个自定义测试语句

该需求完全可以实现,Karate原生支持将多步测试操作封装为单条可调用语句,以下是两种落地性最强的实现方式:

方案1:JS函数封装(轻量场景首选)

这是Karate官方推荐的复用方式,不需要额外写Java代码,直接在feature文件中即可完成定义,适合绝大多数常规封装场景。

  1. 你可以把封装逻辑写在公共通用feature文件中(比如common.feature),供所有业务测试用例复用:
Feature: 公共测试步骤库
  Background:
    # 封装GET请求+200状态校验逻辑,入参为请求体对象
    * def sendGetAndCheckOk =
      """
      function(req) {
        // 对应原步骤 And request Req
        karate.set('request', req);
        // 对应原步骤 When method get
        karate.method('get');
        // 对应原步骤 Then status 200
        karate.status(200);
      }
      """
  1. 在业务测试用例中引入公共步骤库后,即可单语句调用:
Feature: 用户信息查询接口测试
  # 引入公共封装步骤
  * call read('classpath:common.feature')

  Scenario: 正常查询用户信息返回200
    # 构造请求参数
    * def Req = { userId: 1001, channel: 'app' }
    # 单语句完成原3步操作
    * sendGetAndCheckOk(Req)

如果不需要跨用例复用,你也可以直接在当前测试feature的Background块中定义封装函数,不需要单独抽公共文件。

方案2:Java自定义关键字(复杂逻辑场景适用)

如果封装逻辑中涉及复杂运算、第三方工具调用等JS不好实现的逻辑,可以通过Java实现自定义关键字:

  • 新建Java类实现Karate的Kw接口,写入多步操作逻辑
  • 在karate-config.js中完成关键字注册
  • 后续即可在feature中像原生Karate语句一样直接调用

示例代码如下:

package com.test.karate;
import com.intuit.karate.core.Kw;
import com.intuit.karate.core.ScenarioRuntime;

public class GetRequestKw implements Kw {
    @Override
    public Object execute(ScenarioRuntime sr, Object... args) {
        Object requestParams = args[0];
        sr.set("request", requestParams);
        sr.method("get");
        sr.status(200);
        return null;
    }
}

在karate-config.js中注册关键字:

function fn() {
  // 注册自定义关键字
  karate.registerKeyword('sendGetAndCheckOk', new (Java.type('com.test.karate.GetRequestKw'))());
  // 其余原有配置逻辑
  return config;
}

注册完成后,在feature中直接调用即可:

* def Req = { userId: 1001 }
* sendGetAndCheckOk(Req)

小提示:如果你的请求体、预期状态码都是固定值不需要动态传参,封装函数/方法可以去掉入参,调用时直接执行* sendGetAndCheckOk()即可。

内容的提问来源于stack exchange,提问作者kadir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 21:01:23