Cucumber-js: 场景结果未传递给前/后挂钩

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

最有用的评论

而不是onFailedTestStep ,为什么不定义一个名为AfterStep的钩子? Cucumber-Ruby 已经有很长一段时间了,正如你所知 - 一致性很重要。

所有19条评论

被这个咬了因此,我们暂停了在 Cucumber pro 上升级到 3 的过程。

https://github.com/cucumber/cucumber-js/blob/fbff6b0fae54d2e341ee247addc60a9f05753f1d/src/runtime/test_case_runner.js#L109是罪魁祸首吗?

究竟需要哪一部分? 你只使用状态谓词吗? 这似乎是围绕此的文档中唯一使用的内容

我们目前使用scenarioResult.statusscenarioResult.scenario.uriscenarioResult.scenario.line

@jbpro您的用例是否遵循我们目前围绕此的示例(在场景失败时保存屏幕截图)? 我一直认为将场景传递到钩子中真的很奇怪,并希望找到一种不同的处理方式。

目前,我认为我们添加了一个新的支持代码函数: onFailedTestStep ,它可以让您设置要在测试步骤失败时调用的函数。 它将使用与失败步骤相同的世界参数调用,因此您可以附加图像或类似的东西。 我们可以创建一个专用模块来解析事件协议格式化程序中的附件并将它们复制到一个文件夹中。

作为修补匠用户,我希望任何此类函数/处理程序/对象都具有尽可能多的上下文。 即使没有像整个过去和未来运行树(https://github.com/cucumber/cucumber-js/issues/875)那样宏伟的东西,了解当前的步骤和场景是非常有用的每一次失败。
例如,这允许我根据标签控制回滚过程,或者只是查看在失败之前执行的其他步骤。

如果这是您想要的解决方案,我会敦促您考虑将这些传递给onFailedTestStep

Hook Docs 也需要更新——第一段指向ScenarioResult的链接是 404。

而不是onFailedTestStep ,为什么不定义一个名为AfterStep的钩子? Cucumber-Ruby 已经有很长一段时间了,正如你所知 - 一致性很重要。

@aslakhellesoy我想专注于用例,并确保我们以正确的方式解决它。

一致性很重要,但这并不意味着我们应该复制所有内容,因为它存在于其他地方。 当我们确定更好的处理方式时,我们应该不断发展

您或@mattwynne或 ruby​​ 团队的某个人能否

我不是 ruby​​ 团队的,所以我不知道AfterStep是为了什么而构建的,但我个人使用AfterStep来执行各种操作。 这里有些例子:

  1. 截屏并输出浏览器登录失败的场景
  2. 为某个项目做额外的日志记录,不管它是否失败
  3. 清理

对我们来说,无论如何我们都需要将场景和结果传递给AfterStep以进行额外的日志记录。 我确信在AfterStep还有其他用例需要它们,我们甚至没有考虑过。

这意味着如果有onFailedTestStep ,我们将有不止一种方法来实现相同的目标:一种使用AfterStep ,另一种使用onFailedTestStep

这也可能导致项目内的不一致,具体取决于谁实现了钩子; 有些可能使用AfterStep而其他人可能使用onFailedTestStep 。 我认为这两者都不是可取的。

@查理鲁道夫

我想了解你来自哪里。 你介意详细说明你为什么这么想吗?

一直觉得把场景传到hooks里真的很奇怪

我从来没有真正喜欢两种范式的混合。 前/后挂钩与实际运行测试的设置/拆卸有关。 将它用于报告似乎应该单独处理

截屏并输出浏览器登录失败的场景

如果您在 AfterStep 中执行此操作,则会针对失败的步骤而不是失败的场景执行此操作。 这就是 repo 中所有示例都使用场景对象的原因,这就是为什么我想为这个特定用例创建一个新的钩子。 我还没有听说过任何其他令人信服的用例。

为某个项目做额外的日志记录,不管它是否失败

您执行什么类型的附加日志记录?

清理

一步后需要清理什么?

对我们来说,无论如何我们都需要将场景和结果传递给 AfterStep 以进行额外的日志记录。 我确信在 AfterStep 中还有其他用例需要它们,我们甚至没有考虑过。

我正在尝试收集这些用例。 有时人们可能会在有其他方法来使用它时使用它,或者作为我们可以构建更好支持的解决方法。

这意味着如果有像 onFailedTestStep 这样的东西,我们将有不止一种方法来实现同样的事情:一种使用 AfterStep,另一种使用 onFailedTestStep。

Cucumber-js 目前没有AfterStep ,我不打算同时实现。

我正在尝试在protractor-cucumber-framework 中获得 Cucumber 3 支持,我真的可以使用AfterStep 。 我意识到将其他两个库粘合在一起的库并不是最常见的用例,但它会使它变得更简单。 我试图弄清楚如何使用新的事件协议内容来实现它,但是在任何*-finished事件中都没有得到任何功能/场景/步骤上下文。 我们使用功能、场景和步骤中的名称、URI 和行号向量角器报告,并为 IDE 集成 (Intellij) 提供一些内容以在其树中显示和导航。 反正我的 0.02 美元。

只是提到所有讨论的功能(以及更多)都可以用setDefinitionFunctionWrapper来完成。
您可以使用前/后操作包装所有步骤,这不仅允许您对步骤的输入和输出做出反应,甚至可以改变它们。

因此,例如,我使用它来实现“下一步应该失败并出现错误 XYZ”步骤,这使我能够快速实现深度否定检查和错误模拟,而无需在每个步骤中实现重复的否定步骤或特殊的可翻转错误处理.

我认为没有什么AfterStep钩子可以做到setDefinitionFunctionWrapper不能做到的。

有任何更新吗? 在工作中尝试从 2.0.0 升级到 3.0.0,但仍然未定义场景结果

@paul-phillips-ark 是的,见 #905。 如果你想帮助推进它,你可以分支并提交一个新的 pr 来解决@charlierudolph的评论。

当我 console.log(scenarioResult) 我仍然在 Before 和 After 函数中都未定义? 我错过了什么吗? 如果上述评论听起来很密集,请道歉。

我的用例目前如下:

在每个场景之前,我请求填充我的数据库进行测试的夹具。 每个功能都有它自己所需的一组固定装置。 服务器上的夹具路径重复功能路径,所以我也需要uri选项:

Before({ timeout: 60 * 1000 }, scenarioResult => {
    ...
    const file = scenarioResult.scenario.feature.uri;
    ...
});

After钩子上,我们中的许多人我做了一个截图:

After(scenarioResult => {
    if (scenarioResult.status === 'failed') {
      driverUtils.takeScreenShot(scenarioResult.scenario.name);
    }
});

@charlierudolph你能用拉取请求 #905 作为临时解决方案吗? 它允许我们完成从 v2 到 v3 的过渡——由于这种回归/变化,目前它被卡住了。 您提议的重构可能会进入另一个拉取请求。

#905 存在一些问题,但我会尝试修复并在本周末发布。

由于关闭后没有任何近期活动,因此该线程已自动锁定。 请为相关错误打开一个新问题。

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