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

如何在Karate框架中实现循环API调用:批量创建客户及交易

Karate框架批量测试场景实现求助

我是Karate框架新手,已编写以下可运行的示例API测试代码:

Feature: Sample API Tests

  Background:
    * def request_headers = {apikey: "#(apikey)", Content-Type: 'application/json'}
    * configure headers = request_headers

  Scenario: Create Customer

    * def requestPayload = read('classpath:payload/customerdetails.json')
    * def RandomDataGenerator = Java.type('utils.RandomDataGenerator')

    Given url testurl+'/customers'
    And request requestPayload
    * requestPayload.firstName = RandomDataGenerator.generateRandomFirstName()
    * requestPayload.lastName = RandomDataGenerator.generateRandomLastName()
    * requestPayload.mobileNumber = RandomDataGenerator.generateRandomMobileNumber()
    * requestPayload.emailAddress = RandomDataGenerator.generateRandomEmailAddress()
    When method post
    Then status 200

    And def customerId = response.id
    
    # Create An Account for the customer
    * def createAccountPayload = read('classpath:payload/accountdetails.json')

    Given url testurl+'/accounts/createCreditAccount'
    And request createAccountPayload
    * createAccountPayload.customerId = customerId
    When method post
    Then status 200

    And def accountId = response.id

  # Perform a Transaction
    * def debitTransactionPayload = read('classpath:payload/transaction.json')

    Given url testurl+'/accounts/createDebitTransaction'
    And request debitTransactionPayload
    * debitTransactionPayload.accountId = accountId
    When method post
    Then status 200

现需实现以下测试场景:

  • 创建100个客户(并对应创建100个账户);
  • 完成500笔交易(每个客户对应5笔)。

我尝试使用repeat及循环选项,但未能成功,恳请指导如何实现该需求?


解决方案

步骤1:封装单客户-账户创建逻辑为可调用Feature

把单个客户创建、账户创建的逻辑抽成独立Feature,方便批量调用:

Feature: Create Single Customer and Account

  Background:
    * def request_headers = {apikey: "#(apikey)", Content-Type: 'application/json'}
    * configure headers = request_headers
    * def RandomDataGenerator = Java.type('utils.RandomDataGenerator')

  Scenario: Generate Customer and Account
    * def requestPayload = read('classpath:payload/customerdetails.json')
    * requestPayload.firstName = RandomDataGenerator.generateRandomFirstName()
    * requestPayload.lastName = RandomDataGenerator.generateRandomLastName()
    * requestPayload.mobileNumber = RandomDataGenerator.generateRandomMobileNumber()
    * requestPayload.emailAddress = RandomDataGenerator.generateRandomEmailAddress()
    
    Given url testurl+'/customers'
    And request requestPayload
    When method post
    Then status 200
    * def customerId = response.id

    # 创建账户
    * def createAccountPayload = read('classpath:payload/accountdetails.json')
    * createAccountPayload.customerId = customerId
    Given url testurl+'/accounts/createCreditAccount'
    And request createAccountPayload
    When method post
    Then status 200

    # 返回客户ID和账户ID,供后续交易使用
    * def result = { customerId: customerId, accountId: response.id }
    * return result

步骤2:批量创建100个客户及账户

在主Feature中使用karate.repeat()循环调用上述Feature,收集账户ID列表:

Feature: Batch API Tests

  Background:
    * def request_headers = {apikey: "#(apikey)", Content-Type: 'application/json'}
    * configure headers = request_headers
    * def createCustomerAndAccount = call read('classpath:features/CreateCustomerAndAccount.feature')

  Scenario: Batch Create 100 Customers and Accounts
    # 初始化账户列表
    * def accountList = []
    # 循环100次创建客户和账户,存入列表
    * karate.repeat(100, function(i){
        var result = createCustomerAndAccount();
        accountList.push(result.accountId);
      })
    # 将账户列表存入全局变量,供交易场景调用
    * karate.set('accountList', accountList)

步骤3:批量生成500笔交易(每个账户5笔)

先封装单交易逻辑为独立Feature:

Feature: Create Single Transaction

  Background:
    * def request_headers = {apikey: "#(apikey)", Content-Type: 'application/json'}
    * configure headers = request_headers

  Scenario: Generate Debit Transaction
    # 接收外部传入的accountId参数
    * def accountId = accountId
    * def debitTransactionPayload = read('classpath:payload/transaction.json')
    * debitTransactionPayload.accountId = accountId
    
    Given url testurl+'/accounts/createDebitTransaction'
    And request debitTransactionPayload
    When method post
    Then status 200

再在主场景中遍历账户列表,每个账户执行5次交易:

Scenario: Batch Create 500 Transactions
    * def createTransaction = call read('classpath:features/CreateTransaction.feature')
    # 遍历账户列表,每个账户循环5次创建交易
    * karate.forEach(accountList, function(accountId){
        karate.repeat(5, function(){
            createTransaction({ accountId: accountId });
          })
      })

补充说明

  • karate.repeat()比Gherkin原生* repeat更灵活,支持匿名函数处理逻辑和数据收集
  • 拆分独立Feature可提升代码复用性,也方便单独调试单个流程
  • 如果需要提升测试速度,可在configure中设置parallel: true开启并行执行,注意匹配API服务的并发承载能力

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 03:13:23