如何为空手道功能使用动态值 [英] How to use dynamic values for Karate Features

查看:53
本文介绍了如何为空手道功能使用动态值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要在空手道测试的功能中使用动态值.

I've a need where I should use dynamic values in the features of my karate tests.

我遇到了一些这样的问题和答案:

I've came accross with some of the questions and answers like this: How to read input data from an excel spreadsheet and pass it JSON payload in karate framework?

但是,无论如何,我怎么努力,我都无法实现.我相信我应该分享我尝试使用的代码部分,以便可以开始讨论.

But no mather what how hard I try, I couln't make it happen. I believe I should share the code parts that I am trying to use, so that a discussion can start.

我有一个创建新用户的SOAP请求,如下所示:

I have a SOAP request for creating new users as below:

<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xxxxxx>
<soapenv:Header/>
<soapenv:Body>
    <int:createSubscriber soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
        <custBean xxxxx>
            <accountNumber xsi:type="xsd:string">#(accountNo)</accountNumber>
            <custName xsi:type="xsd:string" xs:type="type:string">Xbox</custName>
        </custBean>
        <addSubscriberBean xxxxx>7
            <subscriberID xsi:type="xsd:string">#(subsID)</subscriberID>
            <password xsi:type="xsd:string" xs:type="type:string">0</password>
            <areaID xsi:type="xsd:string" xs:type="type:string">1</areaID>
            <lineOfCredit xsi:type="xsd:int" xs:type="type:int"></lineOfCredit>
            <creditCycle xsi:type="xsd:int" xs:type="type:int"></creditCycle>
            <points xsi:type="xsd:int" xs:type="type:int"></points>
            <bandwidth xsi:type="xsd:int" xs:type="type:int"></bandwidth>
            <physicalPorts xsi:type="xsd:string" xs:type="type:string">8080</physicalPorts>
            <mobilePhoneNo xsi:type="xsd:string" xs:type="type:string">#(mobile)</mobilePhoneNo>
            <stbCount xsi:type="xsd:int" xs:type="type:int">5</stbCount>
            <oTTCount xsi:type="xsd:int" xs:type="type:int">10</oTTCount>
            <subscriptionType xsi:type="xsd:string" xs:type="type:string">#(subsType)</subscriptionType>
        </addSubscriberBean>
        <sequenceID xxxxx>1234567840123422700</sequenceID>
    </int:createSubscriber>
</soapenv:Body>

如您所见,我有一些要从外部给出的变量,它们是: accountNo subsID subsType 移动.

As you've seen, I have some variables which is going to be given from outside, and those are: accountNo, subsID, subsType and mobile.

不,我有一个功能文件,在其中使用上述文件来调用SOAP服务.我正在为请求的所有变量分配新值,以便可以随时创建新用户.

Nw, I have a feature file where I make a call to a SOAP service byusing above file. I am assigning new values to all variables of request, so that I can create new users all the time.

这里是示例:

Feature: Create Subscriber Feature End-To-End Scenario

Background:
* url SOAP_CREATE_SUBSCRIBER_HOST

* def accountNumber = '789'
* def subscriberID = '456'
* def userMsisdn = '123'
* def subscriptionType = 'ASD'

* def createUser = read('create-user-soap.xml') # This is the above one
* replace createUser
  | token              | value               |
  | #(accountNo)       | accountNumber       |
  | #(subsID)          | subscriberID        |
  | #(mobile)          | userMsisdn          |
  | #(subsType)        | subscriptionType    |

Scenario: Create Subscriber
Given request createUser
When soap action SOAP_CREATE_SUBSCRIBER_HOST
Then status 200

And match //returnCode == 0
And match //returnMessage == 'The operation succeeded.'

但是,我需要创建一堆用户,因此我需要使用动态变量来多次调用 .xml 文件.

However, I need to create bunch of users, so I need to use dynamic variables to call my .xml file too many times.

我检查了文档并在此处回答:

I checked the docs and answer here: How to read input data from an excel spreadsheet and pass it JSON payload in karate framework?

但是在我的情况下找不到它.

But couldn't locate it in my situation.

谢谢.

我知道这种情况,我需要使用表或json或csv或excel类型的数据持有人才能晚使用它,所以下面是我的users表.只是不知道如何将其实现到我的功能文件中,这样它才能创建太多用户.

I am aware of the situation that I need to use table or json or csv or excel kind of data holder to use it late, so below is my users table. Just don't know how to implement it to my feature file so that it can create too many users.

    * table userstable
  | accountNo   | subsID         | mobile       | subsType   |
  | '113888572' | '113985218890' | '1135288836' | 'asd'     |
  | '113888573' | '113985218891' | '1135288837' | 'qwe'     |
  | '113888582' | '113985218810' | '1135288846' | 'asd'     |
  | '883889572' | '883985219890' | '8835298836' | 'qwe'     |
  | '773888572' | '773985218890' | '7735288836' | 'asd'     |
  | '663888572' | '663985218890' | '6635288836' | 'qwe'     |
  | '553888572' | '553985218890' | '5535288836' | 'asd'     |
  | '443888572' | '443985218890' | '4435288836' | 'qwe'     |
  | '333888572' | '333985218890' | '3335288836' | 'asd'     |
  | '223888572' | '223985218890' | '2235288836' | 'qwe'     |
  | '165488572' | '175585218890' | '1114788836' | 'asd'     |

在深入研究了一些答案并阅读了许多文档之后,我遇到了以下解决方案.应该有一个 .feature 文件,您可以在其中放置创建方法来启动单个用户创建机制.看起来像这样:

EDIT 2: After a deep dive into the some answers and reading lots of docs, I've encounter with the solution below. There should be a .feature file where you place your create method to fire up the single user creation mechanism. It is going to look like this:

@ignore
Feature: re-usable feature to create a single user

Background:
* url SOAP_CREATE_SUBSCRIBER_HOST

Scenario: Create single user

* match __arg == bulkusers[__loop]
* def createUser = read('xxxx')

Given request createUser
When soap action SOAP_CREATE_SUBSCRIBER_HOST
And request { accountNo: '#(accountNo)', subsID: '#(subsID)', mobile: '#(mobile)', subsType: '#(subsType)' }
Then status 200

因此,上面的代码可以作为模板放置在您的脑海中.另一方面,我们需要另一个**.feature **文件来调用该模板.它看起来像这样:

So above code can be placed as a template in your mind. On the other hand, we need another**.feature** file to call that template. And it is going to look like this:

Feature: call template feature.

背景: *网址SOAP_CREATE_SUBSCRIBER_HOST

Background: * url SOAP_CREATE_SUBSCRIBER_HOST

场景:使用bulkusers表创建默认用户

Scenario: Use bulkusers table to create default users

* table bulkusers
  | accountNo   | subsID         | mobile       | subsType |
  | '131451715' | '133451789134' | '5335167897' | 'asd'   |
  | '122452715' | '123452789124' | '5334287897' | 'qwe'  |
  | '124453715' | '123453789114' | '5334367817' | 'asd'   |

* def result = call read('user-create.feature') bulkusers
* def created = $result[*].response

* match result[*].__loop == [0, 1, 2]
* match created[*].name == $bulkusers[*].name

* def createUser = read('xxx')

此代码实现的是,它使用 user-create.feature 打包了bulkusers表,因此,递归调用了 user-create.feature 模板类,直到表变量的数量以bulkusers变量结尾.

What this code achieve is, it is packing up the bulkusers table with user-create.feature, thus, user-create.feature template class being called recursively till the number of the table variables ends, with the bulkusers variables.

推荐答案

我在下面提供了一个简化的示例,但是请确保您可以在此处找到问题的答案.使用karate.set(varName, xPath, value) API在空手道中循环数据和构建XML很容易:

I am providing a simplified example below, but am sure you will find the answers to your questions here. It is easy to loop over data and build XML in Karate using the karate.set(varName, xPath, value) API:

* table users
  | accountNo   | subsID         | mobile       | subsType  |
  | '113888572' | '113985218890' | '1135288836' | 'asd'     |
  | '113888573' | '113985218891' | '1135288837' | 'qwe'     |
  | '113888582' | '113985218810' | '1135288846' | 'asd'     |

* def xml = <users></users>
* def fun =
"""
function(u, i) {
  var base = '/users/user[' + (i + 1) + ']/';
  karate.set('xml', base + 'account', u.accountNo);
  karate.set('xml', base + 'mobile', u.mobile);
  karate.set('xml', base + 'type', u.subsType);
}
"""
* eval karate.forEach(users, fun)
* match xml ==
"""
<users>
  <user>
    <account>113888572</account>
    <mobile>1135288836</mobile>
    <type>asd</type>
  </user>
  <user>
    <account>113888573</account>
    <mobile>1135288837</mobile>
    <type>qwe</type>
  </user>
  <user>
    <account>113888582</account>
    <mobile>1135288846</mobile>
    <type>asd</type>
  </user>
</users>
"""

这篇关于如何为空手道功能使用动态值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆