如何在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
相关产品推荐
相关产品推荐

