【问题标题】:Dynamically set a XML tag value while building payload在构建有效负载时动态设置 XML 标记值
【发布时间】:2018-02-27 19:45:17
【问题描述】:

我正在尝试使用空手道进行自动化测试。

我有一个 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

汽车功能

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();似乎 DOMParser 无法使用。有没有办法让它可用?

【问题讨论】:

    标签: testing automation karate


    【解决方案1】:

    我认为,如果您仔细阅读此示例,它将回答您所有的问题:

    https://github.com/intuit/karate/blob/master/karate-junit4/src/test/java/com/intuit/karate/junit4/xml/xml.feature

    例如,您可以通过以下方式替换值,以及使用 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 等,您将能够通过空手道语法做任何您需要的事情。

    【讨论】:

    • 非常感谢。我将添加解决方案作为答案
    【解决方案2】:

    感谢 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 方法。

    【讨论】:

    • 很高兴这对您有用。我不确定这是不是最好的解决方案,也许字符串替换就足够了,但是嘿:)
    • 您能否将自己的答案标记为“已接受”,这会提高 Stack Overflow 的整体评分,谢谢。
    • 谢谢彼得。我想到了使用字符串替换。在我的情况下,我将相同的有效负载用于快乐路径,并且还希望用于仅替换某些标记值的负面测试用例。因此想要动态替换某些标签和值并期望错误代码响应。
    猜你喜欢
    • 2020-12-26
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多