Karate 空手道:尝试让全局标题工作

Karate 空手道:尝试让全局标题工作,karate,Karate,我正在尝试设置一个框架来运行Graphql调用,并创建和运行E2E环境 到目前为止,我已经完成了以下设置,但我似乎无法使标题部分正常工作。我已经成功地为每个请求设置了身份验证,但当它为每个请求登录时,它并没有真正按照预期工作 我想执行以下步骤: 运行登录测试(不同用户名有效/无效) 运行注销测试(确保令牌已删除) 然后使用正确的用户登录并提取“set cookie”头(全局用于所有未来请求) 我试图使用以下方法: Karate-config.js karate.callSingle('cla

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

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

我想执行以下步骤:

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

Karate-config.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
}
通用标题功能

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 == $
我可以正确登录并获得设置的cookie令牌,但这不会传递到feature-file.feature,并且我在响应中收到一个错误,说“not logged in”


感谢您的帮助!我可能认为这完全是错误的,我已经尽可能多地遵循共享范围,但在中无法理解。

请进行此更改,希望它能起作用

headers["set-cookie"] = karate.get('sessionAccessId');
此处解释原因:(仔细阅读整个章节)

编辑:还有一个建议:

var temp = karate.callSingle('classpath:com/Auth/common-headers.feature', config);
karate.configure('headers', { 'set-cookie': temp.sessionAccessId });
一些额外建议: 如果您刚刚开始学习空手道-根据您的问题,我建议您首先在单个
场景中使用一个流程,而不使用
调用
,并且在
Karate config.js中不使用任何内容。对所有内容进行硬编码,并首先使其工作。使用设置所需的任何标题。我还看到您正在尝试设置
set cookie
标题(这可能有效),但空手道有一个标题

甚至不要想
callSingle()
开头:)

一旦第一个“硬编码”流开始工作,然后尝试
configureheaders
,最后才尝试做“框架”工作。你似乎直接跳到了超级复杂的环境中,却没有掌握基本的知识

请阅读另一个答案,因为我怀疑您或您团队中的某个人正试图介绍我所说的“过度重复使用”:-尽量不要这样做


还要注意的是,你的问题太复杂了,我无法理解,所以下次请问一个更简单或更具体的问题。如果您仍然被卡住,请按照以下流程操作:

请进行此更改,并希望它能起作用

headers["set-cookie"] = karate.get('sessionAccessId');
此处解释原因:(仔细阅读整个章节)

编辑:还有一个建议:

var temp = karate.callSingle('classpath:com/Auth/common-headers.feature', config);
karate.configure('headers', { 'set-cookie': temp.sessionAccessId });
一些额外建议: 如果您刚刚开始学习空手道-根据您的问题,我建议您首先在单个
场景中使用一个流程,而不使用
调用
,并且在
Karate config.js中不使用任何内容。对所有内容进行硬编码,并首先使其工作。使用设置所需的任何标题。我还看到您正在尝试设置
set cookie
标题(这可能有效),但空手道有一个标题

甚至不要想
callSingle()
开头:)

一旦第一个“硬编码”流开始工作,然后尝试
configureheaders
,最后才尝试做“框架”工作。你似乎直接跳到了超级复杂的环境中,却没有掌握基本的知识

请阅读另一个答案,因为我怀疑您或您团队中的某个人正试图介绍我所说的“过度重复使用”:-尽量不要这样做


还要注意的是,你的问题太复杂了,我无法理解,所以下次请问一个更简单或更具体的问题。如果您仍然被卡住,请遵循以下流程:

嗨,Peter,谢谢您的回复。这不起作用:(因此,添加了更多信息。我的单一流程运行得很好,我也运行得很好,因此我可以从后台获取标题,所有功能文件都可以使用标题cookie,而无需登录每个功能。基本上,我在这里试图实现的是一个全局设置的登录标题。我使用上述代码得到的是:1.所有参数设置正确,2.调用单个公共头文件执行、登录并获取cookie,3.此时,下一个调用进入并失败,因为cookie是empty@Duality我没有什么要补充的了。试着按照我最后一个链接中的说明来做,否则你就只能靠自己了,或者你可以和一个朋友或同事配对这个程序在我看来,上面的流程中有一个帮助-->karate-config.js-->调用header.feature file-->调用header.js(根据您的示例对其进行全局设置)-->然后该功能文件运行-->并使用现有的headers设置(该设置不起作用)那么,我的headers.js文件是否没有全局设置标题,或者它实际上正在这样做anything@Duality读这本书让我头疼。上一次尝试-我又做了一次编辑。阅读它并将文档放在手边。如果它不起作用,也没有意义-就不要使用
callSingle()
,只要让
*调用read即可('classpath:com/Auth/common headers.feature')
在每个功能的
背景中。祝您一切顺利!嗨,Peter,谢谢您的回复。这不起作用:(因此,添加了更多信息。我的单一流程运行得很好,我也运行得很好,因此我可以从后台获取标题,所有功能文件都可以使用标题cookie,而无需登录每个功能。基本上,我在这里试图实现的是一个全局设置的登录标题。我使用上述代码得到的是:1.所有参数设置正确,2.调用单个公共头文件执行、登录并获取cookie,3.此时,下一个调用进入并失败,因为cookie是empty@Duality我没有什么要补充的了。试着按照我最后一个链接中的说明来做,否则你就只能靠自己了,或者你可以和一个朋友或同事配对这个程序弗洛的助手