当前位置: 首页 > 知识库问答 >
问题:

空手道API测试-在同一特性文件中重用不同场景中的变量

葛浩阔
2023-03-14

空手道是否支持这样一个特性:您可以在一个场景中定义一个变量,并在同一个特性文件中在其他场景中重用它。我试着做同样的事,但得到一个错误。在同一个特性文件中重用变量的最佳方法是什么?

Scenario: Get the request Id
    * url baseUrl
    Given path 'eam'
    When method get
    Then status 200
    And def reqId = response.teams[0]resourceRequestId

Scenario: Use the above generated Id
   * url baseUrl
   * print 'From the previous Scenario: ' + reqId

错误:

Caused by: javax.script.ScriptException: ReferenceError: "reqId" is not defined in <eval> at line number 1

共有1个答案

陆俊捷
2023-03-14

请使用background:部分。这里有一个例子。

编辑:background:中的变量if将为每个场景重新初始化,这是标准测试框架“设置”行为。如果希望初始化只发生一次,可以使用CallOnce之类的钩子。

如果您试图修改一个场景中的变量,并期望它在下一个场景启动时具有修改后的值,则您误解了场景的概念。只需将您的步骤组合到一个场景中,因为想想看:那就是您试图测试的“流”。

每个方案都应该能够独立运行。将来,scenario-s的执行顺序甚至可以是随机的或并行运行的。

解释这一点的另一种方法是--如果注释掉一个scenaria,其他的应该继续工作。

请不要认为场景是“文档化”测试重要部分的一种方式。您可以始终使用注释(例如#foo bar)。有些团队假设每个HTTP“endpoint”都应该生活在一个单独的场景中--但绝对不建议这样做。看看Hello World示例本身,它特意显示了2个调用,一个post和一个get

您可以使用call轻松地重用代码,因此您不应该担心代码重复是否会成为一个问题。

另外,如果代码重复可以使流程更容易阅读,那么也可以。详见此答案--也请阅读谷歌的这篇文章。

编辑:如果您想阅读回答类似问题的另一个答案:https://stackoverflow.com/a/559433600/143475

 类似资料:
  • 这是这里提到的一个问题的后续 假设我们实现的服务器v1和v2响应如下 类似地,我们定义v1和v2的客户机模式如下 我们在通用场景中实现模式验证,如下所示。我们可以很容易地使用v1Response/v2Response设置“response”,使用v1Schema/v2Schema设置“schema”,具体取决于我们的环境。 只要我们针对v1客户机测试v1服务器,或者针对v2客户机测试v2服务器,上

  • 真希望有人能帮上忙。 在cucumber的“示例”中是否可以使用两个不同的外部数据文件?如下所示: @play_movie 场景概述:在网站上播放视频 在这个场景中有一个数据文件,但是如果我想在这个场景中使用两个或更多不同的数据文件呢。有可能用cucumber做吗? 我使用Java作为编码语言。 谢谢

  • 我正在使用两种不同的环境进行测试-Dev env没有身份验证(因此我们不必传递头),QA env托管在API网关上。我试图设计测试,使测试能够在两种环境中运行。 以下是我所做的: > 在karate-config.js中定义客户端机密和客户端Id。将dev的这两个变量设置为null。 功能:获取令牌 任何关于如何在同一个项目上运行带有和不带有身份验证的测试的指针都将受到赞赏。

  • 我正在为我的QA项目做研究,我想知道空手道是否能够处理某些用例。基本上,我需要为不同的环境(本地、临时、生产)运行测试。我从文档中了解到,这不是一个问题,因为有了karate-config.js和karate-config-env.js。 问题从执行本身开始。每个环境对于3个不同的国家都有不同的URL,所以实际上总共有9个URL。此外,由于开发过程的原因,某些功能并不是在所有国家同时部署的。所以我

  • 我有2个功能文件,正在尝试执行下面的操作 calling.feature feature:通过调用特性文件进行测试循环 feature feature:空手道框架中的测试循环 当我在“calling.feature”中使用read调用“called.feature”时,我希望它将在两个功能文件中的所有示例中迭代使用 但是空手道一旦发现失败就会退出,在本例中,当参数“hello”从calling.f

  • 我正在做java fx,我陷入了将变量传递到不同的FXML场景中。因此在第一个场景控制器上,LoginController与login.fxml相关联 当新场景打开时,我需要根据包含用户输入的username变量设置标签。这意味着我们需要通过controoler将变量从login.fxml传递到mainscreen.fxml。我如何实现这一点?