重用功能/场景响应

时间:2019-07-15 08:34:50

标签: karate

我有一个架构问题,因为我想知道如何构造特征。我将举一个我想实现的示例,而无需代码重复。

-scenarios
--directoryA
---feature1
----scenario1
----scenario2
--directoryB
---feature2
----scenario3
Feature1: Users

@create_user
Scenario1: Create a User
* url 'someUrl'
Given request `somerequest`
When method post
Then status 201
And match response == { id: #uuid }
* def userId = response.id

@create_user_key
Scenario2: Create a User key
* url 'someUrl'
* def createUser = call read('this:users.feature@create_user')
Given path 'userId', 'keys'
When method post
Then status 201
And match response == { key: #string }
* def userKey = response.key
Feature2: Tokens

Scenario3: Create token
* url 'someUrl'
* def createUser = call read('classpath:scenarios/directoryA/feature1.feature@create_user_key')
* def userHeader =
"""
function() {
   return "Bearer " + userKey
}
"""

Given path 'userId', 'tokens'
And header Authorization = userHeader
When method post
Then status 201

据我所知,建议Scenario1和Scenario2放在单独的文件中。这是我的问题:

我需要Scenario1和Scenario2才能执行Scenario3(需要userId和userKey)。如果我调用Scenario2,应该在哪里存储值以避免代码重复?

我知道场景不会存储值,但是当它们存储在另一个功能中时,我不想在Feature2中使用Scenario1和Scenario2创建背景。每种功能是一个场景还是更多场景都没关系。

谢谢

1 个答案:

答案 0 :(得分:1)

花些时间仔细阅读文档的这一部分:https://github.com/intuit/karate#calling-other-feature-files-然后阅读“共享范围”部分。

简短答案-您可以从调用的功能中“返回”变量。我没看到问题,在通话之后-您可以像这样从createUser开始使用变量(或直接通过路径引用它):

* def userId = createUser.userId

所有这一切-我将警告您,您似乎已陷入尝试“过多重用”的陷阱-这是团队进行测试自动化的常见问题。是的,有时候“重用是不好的”-如果您不相信我也可以-但这需要说。例如,请阅读以下答案:https://stackoverflow.com/a/54126724/143475