当被调用的功能在空手道框架中发出soap请求时,无法访问被调用的功能响应值

当被调用的功能在空手道框架中发出soap请求时,无法访问被调用的功能响应值,soap,karate,Soap,Karate,我有一个公共特性,用于通过替换request.xml中的字段来发出所有soap请求 Feature: Common Soap Feature Background: * url 'http://XXX.XXX.XXX.XXX:8080/soap/GetTransaction' Scenario: * def soap = read('request.xml') * replace soap | token | va

我有一个公共特性,用于通过替换request.xml中的字段来发出所有soap请求

Feature: Common Soap Feature

  Background:
    * url 'http://XXX.XXX.XXX.XXX:8080/soap/GetTransaction'

  Scenario:
    * def soap = read('request.xml')
    * replace soap
      | token                  | value              |
      | @@MTID@@               | MTID               |
      | @@MCC_Code@@           | MCC_Code           |
      | @@Token@@              | Token              |
      | @@Trans_link@@         | Trans_link         |
      | @@traceid_lifecycle@@  | traceid_lifecycle  |
      | @@TXn_ID@@             | TXn_ID             |
      | @@Txn_Type@@           | Txn_Type           |
      | @@Bill_Amt@@           | Bill_Amt           |
      | @@Bill_Ccy@@           | Bill_Ccy           |
      | @@Settle_Amt@@         | Settle_Amt         |
      | @@Settle_Ccy@@         | Settle_Ccy         |
      | @@Fx_Fee_Fixed@@       | Fx_Fee_Fixed       |
      | @@Fx_Fee_Rate@@        | Fx_Fee_Rate        |
      | @@FX_Pad@@             | FX_Pad             |
      | @@MCC_Pad@@            | MCC_Pad            |
      | @@Txn_Amt@@            | Txn_Amt            |
      | @@Txn_CCy@@            | Txn_CCy            |
      | @@Txn_Ctry@@           | Txn_Ctry           |
      | @@Txn_GPS_Date@@       | Txn_GPS_Date       |
      | @@GPS_POS_Data@@       | GPS_POS_Data       |
      | @@GPS_POS_Capability@@ | GPS_POS_Capability |
      | @@Proc_Code@@          | Proc_Code          |
      | @@Authorised_by_GPS@@  | Authorised_by_GPS  |
      | @@Txn_Stat_Code@@      | Txn_Stat_Code      |
    Given request soap
    When soap action
    Then status 200
通过调用方特性,我可以如下调用上述通用soap特性,它可以成功地工作,但我无法访问soap请求的responseTime或其他响应值

Feature: Caller Feature

  Background:
    * def soap = read('soap.feature')
    * def config = { username: 'XXX', password:'XXX', url: 'jdbc:mysql://XXX.XXX.XXX.XXX:32231/XXX', driverClassName: 'com.mysql.jdbc.Driver' }
    * def DbUtils = Java.type('com.XXX.XXX.utils.DbUtils')
    * def db = new DbUtils(config)
    * def result = db.readRows('SELECT public_token FROM card where status="ACTIVE" and type="PHYSICAL" order by id desc limit 1')
    * def publicToken = result[0].public_token
    * def SampleUtils = Java.type('com.XXX.XXX.utils.SampleUtils')
    * def traceIdLifecycle = SampleUtils.randomTraceId()
    * def transactionLink = SampleUtils.randomId()

  Scenario:
    * def transactionId = SampleUtils.randomId()
    * def gpsDateTime = SampleUtils.now()
    * table parameters
      | MTID   | MCC_Code | Token       | Trans_link      | traceid_lifecycle | TXn_ID        | Txn_Type | Bill_Amt | Bill_Ccy | Settle_Amt | Settle_Ccy | Fx_Fee_Fixed | Fx_Fee_Rate | FX_Pad | MCC_Pad | Txn_Amt  | Txn_CCy | Txn_Ctry | Txn_GPS_Date | GPS_POS_Data      | GPS_POS_Capability                                   | Proc_Code | Authorised_by_GPS | Txn_Stat_Code |
      | '0100' | '6011'   | publicToken | transactionLink | traceIdLifecycle  | transactionId | 'A'      | '-6.95'  | '826'    | '0.00'     | ''         | '0.20'       | '0.30'      | '0.00' | '0.00'  | '0.0000' | '949'   | 'TUR'    | gpsDateTime  | '0051000300000Nx' | '00001001000100000000000010010000000000000012230041' | '010000'  | 'N'               | 'A'           |

    * def caller = call soap parameters
    * assert caller.responseTime < 400
功能:调用者功能
背景:
*def soap=read('soap.feature')
*def config={username:'XXX',password:'XXX',url:'jdbc:mysql://XXX.XXX.XXX.XXX:32231/XXX,driverClassName:'com.mysql.jdbc.Driver'}
*def DbUtils=Java.type('com.XXX.XXX.utils.DbUtils'))
*def db=新的DbUtils(配置)
*def result=db.readRows('从卡中选择公共令牌,其中status=“ACTIVE”和type=“PHYSICAL”order by id desc limit 1')
*def publicToken=result[0]。公共令牌
*def SampleUtils=Java.type('com.XXX.XXX.utils.SampleUtils')
*def traceIdLifecycle=SampleUtils.randomTraceId()
*def transactionLink=SampleUtils.randomId()
脚本:
*def transactionId=SampleUtils.randomId()
*def gpsDateTime=SampleUtils.now()
*表参数
|TXn+ID TXXN)TXn)TXn+ID TXn+TXn)TXn+TTXN+ID TTXN)TXn类型学学学学学学元钱钱,学元元钱,学元钱,学元,学元,学元,学元,学元,学元,码码码码码码码码码码码码码码码码码,码码码码,码码码,码码码,码码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,码,能力|程序代码|由全球定位系统授权||Txn_统计代码|
|“0100”——“6011”——“publicToken”——“transactionLink”——“traceIdLifecycle”——“transactionId”——“A”——“6.95”——“0.00”——“0.20”——“0.30”——“0.00”——“0.0000”——“949”——“TUR”——“gpsDateTime”——“0000300000NX”——“100000000000101000000000 1000000000|“A”|
*def caller=调用soap参数
*断言caller.responseTime<400
但是使用被称为FeatureResponseTime的断言不起作用


如何访问所谓的soap功能响应字段?

看起来您做的一切都是对的!一些建议:

  • 这是空手道的最新版本吗
  • 尝试在同一功能中临时拨打第二个电话
  • 作为一种解决方法,您可以使用
    System.currentTimeMillis()

如果您认为存在问题,请按照以下过程进行操作:

要访问的数据在变量“caller”中,但caller是一个数组。

所有常用脚本参数都在其中,请求、响应、头和响应时间等

要访问时间,请执行以下操作:

断言调用方[0]。响应时间>10

要访问和验证响应,请执行以下操作:

* xml soapResponseXml = caller[0].response
* match soapResponseXml /Envelope/Body/AddResponse/AddResult == 4
这里有一个有效的例子。调用者功能:

Feature: Caller Feature

Background: 
  * def soap = read('common.feature')

Scenario: soap 1.2
  * table parameters
    | param_a   | param_b | 
    | 1         | 3       | 

  * def caller = call soap parameters
  * print caller
  * xml soapResponseXml = caller[0].response
  * match soapResponseXml /Envelope/Body/AddResponse/AddResult == 4
  * assert caller[0].responseTime > 10
其共同特点是:

Feature: Common Soap Feature

Background: 
  * url 'http://www.dneonline.com/calculator.asmx'

Scenario: 
  * def soap = read('request.xml')
  * replace soap
    | token | value   |
    | @@a@@ | param_a |
    | @@b@@ | param_b |
  Given request soap
  When soap action 'http://tempuri.org/Add'
  Then status 200
以及请求XML模板:

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
  <Add xmlns="http://tempuri.org/">
    <intA>@@a@@</intA>
    <intB>@@b@@</intB>
  </Add>
</soap12:Body>

另一种方法是只调用公共脚本,而不将结果分配给变量

然后在公共脚本中定义将在调用者范围内的变量

例如:

Feature: Caller Feature

  Background: 
    * def soap = read('common.feature')

  Scenario: soap 1.2
    * table parameters
      | param_a   | param_b | 
      | 1         | 3       | 

    * call soap parameters
    * match soapResponseXml /Envelope/Body/AddResponse/AddResult == 4
    * assert soapReponseTime > 10


它是版本0.7.0,但我用最新版本0.8.0再次尝试了该示例,但没有任何更改。问题不仅仅是从调用方功能获取响应时间。我想访问其他字段,如响应xml内容。@MeteAlpaslanKATIRCIOGLU我不知道。请参阅我发布的链接。最好的。顺便说一句,当我打印调用者的内容如下:“*打印调用者”我可以看到responseTime或response在那里。我认为这些字段没有分配上下文,因此我不能将它们与assert一起使用。同时,如果它是REST,我可以轻松访问被调用的功能响应字段,如responseHeaders。我没有更多的帮助
Feature: Caller Feature

  Background: 
    * def soap = read('common.feature')

  Scenario: soap 1.2
    * table parameters
      | param_a   | param_b | 
      | 1         | 3       | 

    * call soap parameters
    * match soapResponseXml /Envelope/Body/AddResponse/AddResult == 4
    * assert soapReponseTime > 10
Feature: Common Soap Feature

  Background: 
    * url 'http://www.dneonline.com/calculator.asmx'

  Scenario: 
    * def soap = read('request.xml')
    * replace soap
      | token | value   |
      | @@a@@ | param_a |
      | @@b@@ | param_b |
    Given request soap
    When soap action 'http://tempuri.org/Add'
    Then status 200
    * xml soapResponseXml = response
    * def soapReponseTime = responseTime
    * def soapResponseStatus = responseStatus