Cucumber-js: 之前/之后的功能挂钩和黑客

创建于 2017-08-23  ·  10评论  ·  资料来源: cucumber/cucumber-js

我理解没有 BeforeFeature/AfterFeature 功能挂钩的原因。 理想情况下,测试应该是隔离的。 但是,出于实际性能原因,最好为每个功能设置一次数据库固定装置之类的东西。

#614 中指定的解决方法是不充分的,因为:

  1. 当连续特征具有相同标签时,它不会调用 After。
  2. 如果标记的功能是构建中的最后一个测试,它将不会调用 After。

在 3.0.0 之前,可以使用作为 registerHandler('BeforeFeatures') 的第一个参数传递的上下文来破解此功能。

关于接受此功能的 PR,或在 3.0 中提供类似的上下文以至少使黑客再次成为可能的任何想法?

最有用的评论

+1 用于 BeforeFeature/AfterFeature 挂钩
我同意平衡性能与测试隔离的需要。 目前构建框架的方式,除了重复的背景步骤外,几乎没有将场景连接到单个功能中。 在某些情况下,我们可能不希望重复后台步骤,而是让它们在功能开始时发生一次,并且仅在所有场景完成后才被拆除。

所有10条评论

当连续特征具有相同标签时,它不会调用 After。

我不明白。 您能否提供更多详细信息? 您可以创建一个特定于标签是否存在的After挂钩。 请注意,自从给出了解决方法以来,标签语法已经改变。

如果标记的功能是构建中的最后一个测试,它将不会调用 After。

再次,我不明白这一点,请解释更多。 您应该能够使用 After 挂钩,但您确实会丢失这是否是最后一个挂钩的上下文。 理想情况下,您不需要在这里进行任何拆解。


此外,您正在尝试连接不鼓励的场景。 我会建议以下之一:

  • 断开场景
  • 多次执行 cucumber-js 加载不同的支持文件并使用 BeforeAll / AfterAll

需要明确的是,我指的解决方法是:

this.Before({ tags: ['<strong i="6">@featurehook</strong>'] }, function () {
  // log user in (if needed)
})

this.Before({ tags: ['~<strong i="7">@featurehook</strong>'] }, function () {
  // log user out (if needed)
})

考虑一些特征:

<strong i="11">@featurehook</strong>
Feature: feature 1
   Scenario: scenario 1

<strong i="12">@featurehook</strong>
Feature: feature 2
   Scenario: scenario 2

Feature: feature 3
   Scenario: scenario 3

<strong i="13">@featurehook</strong>
Feature: feature 4
   Scenario: scenario 4

如果它们按上述顺序运行,则在功能 1 和功能 2 之间不会发生拆卸。在功能 4 之后也不会发生拆卸,因为不会有其他测试匹配 ~ @featurehook (诚然,这可以用毕竟)。

我并不是想将场景连接起来,对我来说,可以自由地决定隔离和性能之间的权衡。

以设置具有不同配置的测试 SMTP 服务器的测试为例:

<strong i="20">@smtpConfig1</strong>
Feature: ....

<strong i="21">@smtpConfig2</strong>
Feature: ....

如果不将其拆除,可能会在场景之间产生副作用,但在这种情况下,纯度和性能之间的权衡可能是值得的。

对不起,但这不是我认为应该支持的东西。 能够在所有场景和涵盖绝大多数情况的单个场景中共享状态。 您在最后一条评论中的示例(使用@featurehook)无论如何都不能通过使用 BeforeFeature / AfterFeature 来解决。

+1 用于 BeforeFeature/AfterFeature 挂钩
我同意平衡性能与测试隔离的需要。 目前构建框架的方式,除了重复的背景步骤外,几乎没有将场景连接到单个功能中。 在某些情况下,我们可能不希望重复后台步骤,而是让它们在功能开始时发生一次,并且仅在所有场景完成后才被拆除。

由于我使用像 Browserstack 这样的服务,使用起来总是很慢而且很痛苦(Saucelabs 等其他远程服务器提供商也是如此),我通常使用 BeforeFeature 和 AfterFeature 事件处理程序来设置 selenium 会话和每个功能文件的拆卸。

因此,与我的文件中提到的该功能相关的场景一起运行,并重新开始发布每个场景,我刷新浏览器屏幕并刷新我的应用程序状态以进行测试。 所以在某种程度上它们是孤立的,也不会影响测试性能。

这应该被视为将之前/之后功能挂钩重新使用而不是按照上面建议的每个功能文件执行 cucumberjs 的情况。

BeforeFeature/AfterFeature钩子对于 e2e/uat/bdd/call-it-whatever-you-want 测试黄瓜是必不可少的。

Cucumber 的主要“竞争对手”支持这一点(例如 JBehave、RobotFramework),并且没有任何 hack; 这是框架的一个适当特性。

这个问题绝对是使用 Cucumber 的障碍。

嗨...我面临与此相关的问题。 就我而言,我使用标记的 Before 和 After 挂钩来创建/删除将用于测试 UI 的数据。 在 Before 钩子中,我点击了一个 API 端点并创建了数据,在 After 钩子中,我点击了另一个 API 端点来删除它(我保存了在创建响应中返回的对象的 id,然后我用这些 id 构建了删除有效负载)

问题是,当使用该数据(并触发挂钩)的场景是最后一个被执行的场景时,后挂钩永远不会被触发......

有什么办法可以解决这个问题??

谢谢

+1 之前和之后的功能。
我们的用例是这样的:我们发现某些浏览器中没有出现在其他浏览器中的错误。

我们想像这样标记一个特征:

@ie-8-only
Business Need: IE8 should have limited functionality, but what is displayed, should be displayed correctly

@no-access @ssl-insecurity <strong i="8">@security</strong> @BUG-1876
Scenario: No access
   Given I am on the home page
   When I see that my browser is not supported
   Then I should not be able to access the core site functionality

@formatting-issue <strong i="9">@bugs</strong> @BUG-1210
Scenario: The menu should not be formatted like a staircase
   For the users to be able to navigate to the about us / contact us area of the site, the site navigation should be active
   Given I am on the home page
   When I see the menu
   Then it should be displayed in a line

这将允许我们关闭浏览器并在 BeforeFeature 挂钩中打开 IE,并在 AfterFeature 挂钩中重新打开我们用于套件其余部分的浏览器。 当您为每个场景执行此操作时,关闭和重新打开浏览器会花费大量时间,这将使其成为一个很棒的功能。

笔记:
我知道有一些涉及世界对象的替代方案(在那里设置当前浏览器,并且只有在浏览器不是我们在 beforeAll Hook 中需要的浏览器时才关闭),但这样做似乎更简单,而且必须是已经完成了一个钩子,或者 Selenium 决定它会在一半的时间里发出嘶嘶声。

在其他时候,您可能希望在 BeforeFeature Hook 中将文本作为附加描述附加到 Feature,这是另一个有用的示例

我认为在某些类型的测试中,功能挂钩之前/之后也会很有用。 例如 Specflow,.NET 的 Cucumber 库,实现了这些:
https://specflow.org/documentation/Hooks/

该线程已被自动锁定,因为它关闭后没有任何最近的活动。 请针对相关错误打开一个新问题。

此页面是否有帮助?
0 / 5 - 0 等级