Karate框架中如何比较不同响应的整数/字符串类型数值
Karate 兼容字符串/数字类型的数值比较方案
问题背景
我有两个响应对象,字段值可能是数字或字符串类型:
response1 = {a: 1, b: "1"} response2 = {a: 2, b: "2"}
需要实现数值比较,比如验证 (response1.a + 1) == response2.a,且方案要同时支持数字、字符串两种数据类型。
尝试过的失败方法
- 直接比较大小:
Then assert response1.a < response2.a
- 直接做加法后比较:
Then assert response1.a+1 == response2.a
实际测试场景代码
Scenario: Validate openCase count * def preResponse = call read('@CaseCount') * def createCaseResponse = karate.callSingle('CreateCase.feature@Create'); * def postResponse = call read('@CaseCount') Then assert preResponse.responseData.openCases < postResponse.responseData.openCases
实际响应示例
{ "responseData": { "openCases": 1, "closedCases": 0, "inProgressCases": 0, "onHoldCases": 0, "invalidCases": 0, "overDueCases": 0, "dueTodayCases": 0 }, "resultInfo": { "resultCodeId": "200", "resultCode": "SUCCESS", "resultStatus": "SUCCESS", "resultMsg": "S" }, "message": "SUCCESS" }
解决方案
核心是先将字段值转换为数值类型,再进行比较。Karate提供了karate.number()工具方法,能自动将数字或数字格式的字符串转为数值类型,兼容整数、浮点数场景:
针对示例需求的断言写法
Then assert karate.number(response1.a) + 1 == karate.number(response2.a)
针对实际测试场景的修改
将原断言改为:
Then assert karate.number(preResponse.responseData.openCases) < karate.number(postResponse.responseData.openCases) // 或者验证加1后相等的场景 Then assert karate.number(preResponse.responseData.openCases) + 1 == karate.number(postResponse.responseData.openCases)
原理说明
如果字段是字符串类型,直接进行+运算会触发字符串拼接(如"1"+1得到"11"),直接比较大小会按字符ASCII码顺序判断(如"10"<"2"会返回true),导致逻辑错误。通过karate.number()转换后,所有值统一为数值类型,就能正确执行数学运算和数值比较。
内容的提问来源于stack exchange,提问作者R Singh
相关产品推荐
相关产品推荐

