Karate API测试中call与callonce的具体区别是什么?
Karate框架
call与callonce关键字功能差异 两个关键字都是Karate中用来复用特性文件、JS函数、工具方法的核心语法,核心差异主要体现在执行逻辑、适用场景两方面:
1. 执行逻辑差异
call:每次调用时都会完整执行一次目标内容,不管之前有没有调用过相同的目标,不存在结果缓存机制。
示例用法:// 每次调用都会重新执行get-temp-token.feature,获取全新的临时令牌 * def reqToken = call read('get-temp-token.feature') { userType: 'normal' }callonce:同一测试套件的全生命周期内,相同目标+相同入参组合只会执行1次,后续所有同条件调用都会直接复用第一次执行的返回结果,不会重复运行目标内容。
示例用法:// 整个测试运行过程中只会执行1次init-global-config.feature,后续调用直接返回缓存的配置结果 * def globalConfig = callonce read('init-global-config.feature') { env: 'test' }
2. 适用场景差异
call适合每次调用需要获取动态新结果的场景:单次接口请求的签名生成、每个用例独立的临时参数构造、随请求上下文变化的依赖逻辑。不适合用来初始化全局不变的公共配置、创建高耗时且不需要重复生成的全局测试资源。callonce适合全测试套件通用的一次性逻辑:全局测试环境配置初始化、高耗时的公共测试资源创建、全流程通用的静态依赖准备。不适合用来生成需要动态更新的请求参数、每个用例需要独立状态的依赖逻辑。
额外注意点
如果调用时传入的参数不同,就算是同一个目标文件/函数,callonce也会重新执行目标内容,缓存是和「目标路径+入参」绑定的。
内容的提问来源于stack exchange,提问作者Kundan Balse
相关产品推荐
相关产品推荐

