如何在Karate的Background中通过afterFeature钩子调用指定Scenario?
问题描述
我有一个包含公共API调用的feature文件,内容如下:
Feature: common user api calls Background: Given url userUrl @createUser @ignore Scenario: Create user And match karate.get('name') != null And def requestBody = read('classpath:user/json/request.json') And request requestBody When method post Then status 201
在karate-config.js中,我定义了全局函数:
config.userCommon = function(tag){ return karate.read("classpath:user/userCommon.feature" + tag) };
目前我能在其他Scenario中正常调用@createUser场景:
Feature: User Tests Scenario: Create user test And def name = 'aa' And call userCommon('@createUser') { "name": '#(name)' }
但我想在Background的afterFeature钩子中调用该@createUser场景,尝试了以下方法却无效,求正确实现方式:
Feature: User Tests Background: * configure afterFeature = """ function(){ var create = userCommon('@createUser'); karate.call(create, { name: 'aa' }); } """
正确实现方式
问题出在afterFeature钩子的执行上下文特性上,直接调用userCommon返回的对象再用karate.call的方式不兼容,以下是两种可行的解决方法:
方法一:直接指定feature路径+标签调用
不需要依赖userCommon函数,直接在钩子中传入完整的feature路径和标签字符串:
Feature: User Tests Background: * configure afterFeature = """ function(){ karate.call('classpath:user/userCommon.feature@createUser', { name: 'aa' }); } """
方法二:适配userCommon函数的调用方式
如果要保留userCommon函数,直接传入它返回的路径字符串给karate.call即可:
Feature: User Tests Background: * configure afterFeature = """ function(){ karate.call(userCommon('@createUser'), { name: 'aa' }); } """
关键说明
afterFeature属于全局钩子,执行上下文和普通Scenario不同,直接传递完整的feature路径+标签字符串是最稳妥的调用方式。- 要确保
userUrl在钩子执行时已完成初始化,避免因变量未定义导致调用失败。
内容的提问来源于stack exchange,提问作者Marek Mašek
相关产品推荐
相关产品推荐

