空手道-在单个场景中有多个“何时”

时间:2019-01-06 09:05:07

标签: cucumber karate

我有一个场景,其中有多个步骤/需要运行REST操作才能完成一个过程。

每个REST操作都需要具有授权用户名和密码。我在背景会话中提供了此功能。这就是我当前功能的样子。

Feature: Adding to cart

  Background: 
    * url 'https://soa-mp-rmsk-someurl.com'
    * header agent_uid = 'AUTO_TST'
    * configure ssl = true
    * header Authorization = call read('classpath:Project/JSFiles/auth.js') { username: 'ABC', password: '123' }
    * configure logPrettyResponse = true
    * configure logPrettyRequest = true

  Scenario: Find available mobiles
    Given path '/v1/available-mobiles'
    When method get
    Then status 200
    * def mobile = response.iPhoneXSMax

  # Add a mobile to cart
    Given path '/v1/mobiles/'+mobile+'/add
    And request {name: 'iPhoneXSMax'}
    When method put
    Then status 200

现在,这引发了错误,说"faultstring": "Authentication challenge issued"

我可以将它们分为不同的场景,以便它们每次都调用header authorization,从而成功运行;我也尝试过。为我工作。但是我认为将这些步骤组合在不同的场景中不是一个好习惯,因为它们实际上是一个场景。我该如何克服这个错误?还是应该在不同的情况下分发它们?

https://automationpanda.com/2018/02/03/are-gherkin-scenarios-with-multiple-when-then-pairs-okay/

EDIT-1 这就是我尝试为授权详细信息添加配置标头的方式;我无法完全理解这一点,请您帮忙?

headers.js

function fn() {
      var username = karate.get('username');
      var password = karate.get('password');
      if (username && password) {
        return { 
            Authorization: username + password
        };
      } else {
        return {};
      }
    }

我在专题背景中这样称呼它;但没有用。

* configure headers = read('classpath:headers.js')
* def username = 'ABC'
* def password = '123'

2 个答案:

答案 0 :(得分:2)

我认为您完全错过了基于标头的身份验证-空手道具有全局性的钩子-这是大多数团队使用的钩子。请参阅文档以获取configure headers

答案 1 :(得分:1)

只是想说一下,对于 EDIT-1 ,我设法获得了解决方案。这就是我编写具有BASE64格式转换的headers.js文件的方式。

如果我能以更好的方式增强它,请告诉我。

function fn() {
      var username = karate.get('username');
      var password = karate.get('password');

      if (username && password) {
      var temp = username + ':' + password;
      var Base64 = Java.type('java.util.Base64');
      var encoded = Base64.getEncoder().encodeToString(temp.bytes)
        return { 
            Authorization: 'Basic ' + encoded
        };
      } else {
        return {};
      }
    }