构建负载时动态设置 XML 标签值
Dynamically set a XML tag value while building payload
我正在尝试使用空手道进行自动化测试。
我有一个 XML 负载。
我有一个静态 XML 负载,我正在从一个文件中准备它,我想循环调用我的服务。
对于每次调用,我都想动态替换标签名称的值。
我该如何实现?
例如
下面是我的主要功能,它在循环中调用我的常用功能
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 脚本方法来替换标记值或一个小的 java class ,它使用 DOMParser 或 SAXParser 来执行相同的操作.
但是我想知道是否有空手道的构建方式可以执行相同的操作。
如果我正在使用 var parser = new DOMParser();,同时使用 java 脚本方法替换标签值;并且 DOMParser 似乎无法使用。有没有办法让它可用?
我想如果你仔细阅读这个示例,它会回答你所有的问题:
例如,这是替换值的方式,以及使用 set
关键字替换整块 XML(可以包含标签):
Scenario: set xml chunks using xpath
* def req = read('envelope1.xml')
* def phone = '123456'
* def search =
"""
<acc:getAccountByPhoneNumber>
<acc:phoneNumber>#(phone)</acc:phoneNumber>
</acc:getAccountByPhoneNumber>
"""
* set req /Envelope/Body = search
* match req ==
"""
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:acc="http://foo/bar">
<soapenv:Header />
<soapenv:Body>
<acc:getAccountByPhoneNumber>
<acc:phoneNumber>123456</acc:phoneNumber>
</acc:getAccountByPhoneNumber>
</soapenv:Body>
</soapenv:Envelope>
"""
并且请不要考虑使用 DOMParser 等,您将能够通过空手道语法做任何您需要的事情。
感谢 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
注意:我必须升级空手道 0.7.0 版本才能使用 karate.setXml 方法。
我正在尝试使用空手道进行自动化测试。
我有一个 XML 负载。
我有一个静态 XML 负载,我正在从一个文件中准备它,我想循环调用我的服务。
对于每次调用,我都想动态替换标签名称的值。
我该如何实现?
例如
下面是我的主要功能,它在循环中调用我的常用功能
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 脚本方法来替换标记值或一个小的 java class ,它使用 DOMParser 或 SAXParser 来执行相同的操作.
但是我想知道是否有空手道的构建方式可以执行相同的操作。
如果我正在使用 var parser = new DOMParser();,同时使用 java 脚本方法替换标签值;并且 DOMParser 似乎无法使用。有没有办法让它可用?
我想如果你仔细阅读这个示例,它会回答你所有的问题:
例如,这是替换值的方式,以及使用 set
关键字替换整块 XML(可以包含标签):
Scenario: set xml chunks using xpath
* def req = read('envelope1.xml')
* def phone = '123456'
* def search =
"""
<acc:getAccountByPhoneNumber>
<acc:phoneNumber>#(phone)</acc:phoneNumber>
</acc:getAccountByPhoneNumber>
"""
* set req /Envelope/Body = search
* match req ==
"""
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:acc="http://foo/bar">
<soapenv:Header />
<soapenv:Body>
<acc:getAccountByPhoneNumber>
<acc:phoneNumber>123456</acc:phoneNumber>
</acc:getAccountByPhoneNumber>
</soapenv:Body>
</soapenv:Envelope>
"""
并且请不要考虑使用 DOMParser 等,您将能够通过空手道语法做任何您需要的事情。
感谢 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
注意:我必须升级空手道 0.7.0 版本才能使用 karate.setXml 方法。