【问题标题】:Karate: Trying to get global headers working [duplicate]空手道:试图让全局标题工作[重复]
【发布时间】:2020-02-19 20:56:47
【问题描述】:

我正在尝试设置一个框架来运行 Graphql 调用并创建 E2E 环境。

到目前为止,我已经完成了以下设置,但我似乎无法让标题部分正常工作。我设法为每个请求设置了身份验证,并且一切正常,但是当它为每个请求登录时,它并没有真正按预期工作。

我想执行以下步骤:

  • 运行登录测试(不同的用户名有效/无效)
  • 运行注销测试(确保删除令牌)
  • 然后使用正确的用户登录并提取“set-cookie”标头(全局用于所有未来的请求)

我正在尝试使用以下内容:

空手道配置.js

karate.callSingle('classpath:com/Auth/common-headers.feature', config);

headers.js

function fn() {
    var headers = {}
    headers["set-cookie"] = sessionAccessId
    karate.log('Cookie Value: ', headers)

    return headers
}

common-headers.feature

Feature: Login to Application and extract header

Background:
    * url serverAuthenticateUri
    * header Accept = 'application/json'

Scenario: 'Login to the system given credentials'

Given request { username: '#(username)', password: '#(password)'}
When method post
Then status 200
And match $.success == '#(result)'
And def myResult = response

* def sessionAccessId = responseHeaders['set-cookie'][0]

* configure headers = read('classpath:headers.js')
* print 'headers:', karate.prevRequest.headers

feature-file.feature

Feature: sample test script

Background:
  * url serverBaseUri

  * def caseResp = call read('classpath:com/E2E/POC/CommonFeatures/CreateCaseRequest.feature')
  * def caseReqId = caseResp.response.data.createCaseAndRequest.siblings[0].id
  * def caseId = caseResp.response.data.createCaseAndRequest.siblings[0].forensicCaseId

  * def graphQlCallsPath = 'classpath:com/E2E/POC/GraphQl/intForensic/'
  * def commmonFiles = 'classpath:E2E/CommonFiles/'


Scenario: TC1a - Request Server Details from Config DB (1st Run):
          Should handle requesting Server Details Data from Config Database.

  * def queryFile = graphQlCallsPath + '20-TC1a_req_req_valid_id.graphql'
  * def responseFile = graphQlCallsPath + '20-TC1a_resp_req_valid_id.json'

  Given def query = read(queryFile)
  And replace query.reqId = caseReqId
  And request { query: '#(query)' }
  When method post
  Then status 200
  And json resp = read(responseFile)
  And replace resp.reqId = caseReqId
  And replace resp.caseID = caseId
  And match resp == $

我可以正确登录并获得 set-cookie 令牌,但这并未在 feature-file.feature 上传递,并且我在响应中收到错误消息“未登录”。

任何帮助表示赞赏!我可能完全看错了,我试图尽可能多地遵循共享范围,但无法理解。

【问题讨论】:

    标签: karate


    【解决方案1】:

    请进行此更改,希望它有效!

    headers["set-cookie"] = karate.get('sessionAccessId');
    

    为什么在这里解释:(仔细阅读整个部分)https://github.com/intuit/karate#configure-headers

    编辑:还有一个建议:

    var temp = karate.callSingle('classpath:com/Auth/common-headers.feature', config);
    karate.configure('headers', { 'set-cookie': temp.sessionAccessId });
    

    一些额外的建议:

    如果您刚刚开始使用空手道 - 根据您的问题,我建议您首先在单个 Scenario 中运行一个流程,而不使用 call,并且在 karate-config.js 中没有任何内容。对所有内容进行硬编码并使其首先工作。使用header keyword 设置您需要的任何标题。我还看到您正在尝试设置 set-cookie 标头(这可能有效),但空手道有 special keyword for cookie

    甚至不要考虑 callSingle() 开始 :)

    一旦你让第一个“硬编码”流程工作,然后尝试configure headers,然后最后才尝试做“框架”的东西。您似乎在没有正确掌握基础知识的情况下直接跳入了超级复杂的环境。

    请同时阅读其他答案,因为我怀疑您或您团队中的某个人正试图引入我所说的“重复使用过多”:https://stackoverflow.com/a/54126724/143475 - 尽量不要这样做。

    另外请注意,您的问题非常复杂,以至于我无法理解它,所以下次请提出一个更简单或更具体的问题。如果您仍然卡住,请按照以下流程操作:https://github.com/intuit/karate/wiki/How-to-Submit-an-Issue

    【讨论】:

    • 嗨彼得,感谢您的回复。那没有用:(所以添加了更多信息。我已经让单一流程工作得很好而且我已经让它工作了所以我从后台获取标题并且所有功能文件都可以使用标题cookie而无需登录对于每个功能。基本上,我在这里想要实现的是一个用于登录的全局设置头我用上面的代码得到的是:1.所有参数设置正确,2.调用单个通用头文件执行,登录并获取cookie,3.此时下一个调用进入并失败,因为cookie为空
    • @Duality 我没有什么要补充的了。尝试按照我上一个链接中的说明进行操作,否则您只能靠自己,或者您可以与可以提供帮助的朋友或同事结对编程
    • 我看到的上面的流程 ---> karate-config.js --> 调用 header.feature 文件 --> 调用 header.js (全局设置?根据您的示例)--> 功能文件然后运行--> 并使用现有的标头设置(不起作用)。我的 headers.js 文件也没有在全局范围内设置标头,还是它实际上在做任何事情
    • @Duality 读到这里我头疼。最后一次尝试 - 我又做了一次编辑。阅读它并将文档放在手边。如果它不起作用并且没有意义 - 只是不要使用callSingle(),而只是在每个功能的Background 中使用* call read('classpath:com/Auth/common-headers.feature')。万事如意!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    • 2019-11-17
    相关资源
    最近更新 更多