BDD场景中的断言

Assertions in BDD scenario

我正在尝试了解如何正确创建我的 BDD REST 测试场景。

根据我在网上阅读的内容,我们应该只有一对 WHEN-THEN 并且断言应该在 THEN 步骤中完成。

如果我们遇到

这样的情况怎么办

鉴于 用户搜索航班

用户选座

并且用户将行李添加到航班

用户购买机票时

然后航班预订成功

如果我们在尝试将行李添加到航班时收到 500 状态错误,会发生什么情况。我们至少应该在所有步骤中进行基本断言吗?

您可以在所有步骤中添加断言。

From what I have read online, we should have only one WHEN-THEN pair and the assertions should be done in the THEN step

场景的主要断言可以在Then步完成。下面的示例来自我当前的项目,您可以看到我是如何编写步骤的,

@TC_CUE_Search_for_all_templates_and_validate_particular_template_response
Scenario: Validate json details for given template
Given Get template key and Application key from db
And Load Datasheet for Iteration
And Execute the request to fetch all the templates of an application
Then Get and verify the response of given template from template result list
Given Get template key and Application key from db

我验证数据库是否返回有效响应。如果我收到有效的回复,那么我会从数据库中获取所需的详细信息并将其写入 excel.

And Load Datasheet for Iteration

读取 excel sheet。

And Execute the request to fetch all the templates of an application

GET 请求将被执行,我验证响应代码并存储结果。

Then Get and verify the response of given template from template result list

这里主要做验证。在前面的步骤中,它 returns 巨大的响应,我根据参数获取特定响应并验证所有必填字段。

此示例的目的是阐明如何自动化 REST 场景。

理想情况下,您在每个场景中只练习行为的一个方面。一个场景包含三个部分:

Given *a context*  
When *an event occurs*  
Then *an outcome should happen*

Given 是场景发生的上下文。就场景而言,我们如何到达那里并不重要。因此,例如,如果您的用户添加了包,那么无论是通过 Gui 还是通过将数据侵入后端都无关紧要。只要你分不出来,就没问题。您可以有多个 Givens,因为很多事情都可能适合上下文。

只有一个 When 是正常的,因为它是您尝试锻炼的行为的触发器。我发现的例外情况是发生交互时,例如与另一个人或与时间,并且您需要它们来正确展示行为。

Then 是该行为应产生的结果。您可以有多个 Then,因为可能有多个利益相关者或必须发生的不同事情 - 例如,当优步 driver 接受您的预订时,他们会成功确认接受,您会收到通知,优步会收到也想了解它。

因此,如果您想检查能够将行李添加到航班的行为,这本身应该是一个明确的场景。如果需要,您可以将其作为“何时”的一部分进行:

Given the user has selected flight B1234 LON-YYZ 22 Oct 2021 16:45
And the ticket costs 0
And extra bags cost 
And an exit row upgrade costs 
When they book the flight with 2 bags and an upgrade to the exit row
Then their ticket should show 2 bags and an upgrade to the exit row
And they should be charged 0.

请注意,我在此处列出了行为的两个方面:行李和出口行升级。我对此很务实,但如果由于任何原因它开始变得复杂,请将它们分开

重要的是,您会注意到它们最终都在 时得到锻炼。

如果您在设置 Given 时遇到 500 错误,那实际上不是这种情况的一部分。但是,您可以选择 运行 更长的测试,例如冒烟测试或客户旅程。严格来说,这些不是 BDD 场景,但我发现通常有一些场景是值得的(真的,他们需要很长时间才能 运行 所以保持小的数量!)

你最终会得到这样的结构:

Given the user is on the flight search page
And Flight B12345 leaves LHR for YYZ at 16:59
When they search for a flight from LHR to YYZ on 22 Oct 2021
Then Flight B12345 should show up in the results
When they add an extra bag and an exit row seat to the booking
Then the bag and exit row seat should show in the checkout
When they checkout...

etc.

散布在整个客户旅程中的“Thens”正在寻找实现中期成果的地方;要么是客户可以保存以备后用的东西,要么是他们可以获得对刚刚完成的工作的反馈的地方。还是站在客户的角度;我们没有提到 500 错误。如果您收到 500 错误,它无论如何都会失败,但我们不想在代码库中乱放这些类型的检查,因此我们不倾向于将它们明确化。

部分原因是这些并不是真正的测试!他们是系统如何工作的活生生的例子,恰好提供了一个很好的测试 by-product。它们帮助开发人员了解系统并轻松更改代码;预防错误,而不是捕捉错误。

话虽如此,我有时确实会在任何可能失败的 Given 中加入断言。作为第一步的一部分,我可能会检查该网站是否正常运行。任何其他 web-based 问题我都允许在剩下的旅程中浮出水面。

您可能还会发现 this answer 对更长的客户旅程有用。