Cypress Gherkin 不应在 afterEach-hook 中出现错误时停止套件执行

Cypress Gherkin should not stop suite execution on error in afterEach-hook

提问人:Ben_R 提问时间:10/30/2023 最后编辑:Aladin SpazBen_R 更新时间:10/31/2023 访问量:36

问:

上下文: 我有一个使用 cypress-cucumber-preprocessor 的 Cypress 项目。在功能文件中,我定义了多个方案。每个方案在受测页面上执行一个操作,并截取屏幕截图(有时是多个屏幕截图)。然后,我使用afterEach钩子将场景中拍摄的所有屏幕截图与各自的基础图像进行比较。

Feature: Example
Scenario 1
Given logged user
When goes to homepage
Then take a screenshot
# Now a hook compares the screenshot to the base

Scenario 2
Given logged user
When user makes a deposit
Then take a screenshot
# Now a hook compares the screenshot to the base

Scenario 3
... etc. ...

钩子在文件中实现,其中实现了不同视觉验证的所有后续步骤。

Example:
Then('Then take a screenshot', () => {...})
Then('Then take a screenshot of element xyz and blackout the background', () => {...})

// The hook is implemented in this same file
afterEach(() => {
    cy.checkVisualResults();
});

预期行为: 如果上一个方案失败,我需要 Cypress 继续执行功能文件中的下一个方案。

观察到的行为: 如果在其中一个场景后将屏幕截图与其基本图像进行比较失败,则 Cypress 将停止执行“套件”(表示功能文件)。错误是这样的:在每个之后。Because this error occurred during a hook we are skipping the remaining tests in the current suite

也许我需要把钩子放在另一个地方。据我观察,它是在每个场景之后执行的,而不是在拍摄每个屏幕截图之后执行的。我还有其他功能文件,它们不使用场景,只是截取多个屏幕截图。在我添加钩子之前,Cypress 会直接将当前映像与基础映像进行比较,并停止运行这些功能文件中的其余步骤。钩子就位并且捕获和比较分开后,我看到对于这些类型的功能文件,它可以工作。我现在需要的是调整它以使其适用于使用方案的功能文件。

柏树 小黄瓜 cypress-cucumber-preprocessor

评论


答:

2赞 Aladin Spaz 10/30/2023 #1

你能再迈出一步而不是使用钩子吗?afterEach()

Feature: Example
Scenario 1
Given logged user
When goes to homepage
Then take a screenshot
Then compare the screenshot to the base

Then('Then compare the screenshot to the base', () => {
  cy.checkVisualResults()
})

或合并到屏幕截图步骤中

Then('Then take a screenshot', () => {
  cy.screenshot()
  cy.checkVisualResults()
})

这两种方法都应将失败与特定的失败测试隔离开来。


替换黄瓜 After()

After() 钩子在失败时表现不同 - 文档在这里

方案挂钩

Before() 和 After() 类似于 Cypress 的 beforeEach() 和 afterEach(),但可以根据每个场景的标签选择它们有条件地运行,如下所示。

此外,这些钩子中的失败不会导致跳过剩余的测试。这与 Cypress 的 beforeEach 和 afterEach 相反。

评论

0赞 Ben_R 10/30/2023
将比较与屏幕截图的捕获相结合是我迄今为止所遵循的方法。这样做的问题是,如果发生故障,它会停止套件。我需要它来拍摄套件中的所有屏幕截图,即使出现故障也是如此。原因是如果我需要重置基础映像,我必须多次运行测试以验证屏幕截图,这会浪费时间和资源。我还尝试了 after hook 而不是 afterEach hook,但随后测试报告显示所有测试都已通过,只有最后一个测试失败,这是不正确且具有误导性的。
0赞 Aladin Spaz 10/31/2023
另一种方法是在它自己的上下文中隔离,但我不清楚为什么需要。afterEach()afterEach()
0赞 Aladin Spaz 10/31/2023
或者尝试黄瓜专用版本,请参阅更新。After()