我正在尝试使用空手道进行自动化测试。
我有一个XML有效负载。
我有一个静态XML有效负载,我正在从一个文件中读取,我想在循环中调用我的服务。
对于每个调用,我想动态替换标记名称的值。
我将如何实现这一目标?
e.g。
以下是我的主要功能,它在循环中调用我的常用功能
Feature: Loop Call
Background:
* def common = call read('classpath:CommonFeatures.feature')
Scenario:
* table table
| payload_file | field_tag | field_value |
| 'HappyPath.xml' | 'car_fuel' | 'Gas' |
| 'HappyPath.xml' | 'car_color'| 'Red' |
* def response = call read('classpath:Car.feature') table
Car.feature
Feature: Common
Scenario:
* print payload_file
* print field_tag
* print field_value
* xml payload = read('classpath:/payload/'+payload_file)
* print payload
* set payload/$field_tag = field_value
这是设置field_tag值的问题。
我有其他选择这样做,比如编写一个小的java脚本方法来替换标记值或使用DOMParser或SAXParser来执行相同的小java类。
但是我想知道是否有任何空手道以构建方式执行相同的操作。
当我使用var parser = new DOMParser()时,还使用java脚本方法替换标记值;似乎DOMParser无法使用。有没有办法让它可用?
答案 0 :(得分:2)
我想如果您浏览此示例,它将回答您的所有问题:
例如,您可以使用READ_COMMITTED
关键字替换值,以及替换整个XML块(可以包含标记):
=QUERY(Data!A:C;"select B where A = date '"&TEXT(A2;"yyyy-mm-dd")&"'";0)
请不要想到使用DOMParser等,你可以通过空手道语法做任何你需要的事情。
答案 1 :(得分:1)
感谢Peter提供所有帮助和示例。
我觉得这是实现这一目标的最佳方式。
写了一个小的javascript函数
"""
* def replaceTag =
"""
function(x){
karate.setXml('temp', x.payload);
karate.pretty(karate.get('temp'));
if (x.field_tag) karate.set('temp', x.field_tag, x.field_value);
return karate.get('temp');
}
"""
并从下面的Car.feature中调用它,我得到动态替换的有效载荷。
Feature: Common
Scenario:
* print payload_file
* print field_tag
* print field_value
* xml payload = read('classpath:/payload/'+payload_file)
* print payload
* def args = { payload: #(payload), field_tag: #(field_tag), field_value: #
(field_value)}
* print args
* xml payload = call common.replaceTag args
注意:我必须升级Karate 0.7.0版本才能使用karate.setXml方法。