java - E2E 测试预期结果应该硬编码还是计算?

标签 java cucumber e2e-testing playwright end-to-end

我是一名 BE 工程师,在 BE 单元测试方面也有经验,但最近开始使用 Playwright 和 Cucumber 进行 FE 端到端测试。场景的预期结果应该是硬编码示例还是应该作为测试的一部分进行计算?

为了简单起见,假设我正在尝试编写一个电子商务网站折扣测试,并且我正在编写一个测试来验证折扣金额是否正确。它将用户的购物篮总额作为输入,并执行客户端计算以应用固定的 12% 折扣,并将结果返回给用户。 我应该在测试的步骤定义中计算 12% 吗?或者我应该硬编码预期结果? 如果我对预期结果进行硬编码,功能文件将如下所示:

Scenario: Verify discount amount is correct
Given  the shopping basket total is 60.00
When  I click "Calculate Discount"
Then  the reduction should be 7.20

或者应该更改最后一行来计算它,例如然后减少应该如预期并且步骤定义文件执行类似的操作

@Then("the reduction should be as expected")
public void theReductionShouldBe() {
    double actual = getReductionDisplayedToUser();
    double expected = basketTotal * 0.12;
    assertEquals(expected, actual);
}

实际上,我正在测试的工具的计算比仅仅算出 12% 更复杂(有多个输入,而不是只有一个),所以我对后者的问题是,我复制了我的程序中的所有逻辑。 e2e 测试仓库。但有一种观点认为,如果逻辑发生变化,我不需要修改我的特征文件,只需更新计算中的逻辑即可。我个人更喜欢前者,因为它类似于我的 BE 单元测试的测试风格,但不确定这是否是 E2E 测试的最佳实践。

另一位同事建议我对输入实现随机性(并且这只适用于计算结果),但从理论上讲,如果逻辑中存在错误,测试有时会失败,有时会通过,这对我来说似乎很奇怪,使维护变得更加困难,例如在测试失败后检查错误是否已修复。

Scenario: Verify discount amount is correct
Given  the shopping basket total is a random amount between 0.00 and 1000.00
When  I click "Calculate Discount"
Then  the reduction should be as expected

正如我所说,我对端到端测试有点陌生,我不确定是否有任何标准或最佳实践。有什么想法吗?

最佳答案

如果你遵循cucumber官方场景示例文档“Writing better Gherkin”,他们已经在Then条件中写入了期望值

Official Cucumber document for Writing better Gherkin

您还可以按照场景大纲来测试多个条件

Scenario Outline Example

    Scenario Outline: Verify discount amount is correct
    Given  the shopping basket total is <total>
    When  I click "Calculate Discount"
    Then  the reduction should be <expected>

 Examples:
    | total  | expected |
    | 60.00  |   7.20   |
    | -1     |   0      |

然后您可以在不同的示例中进行游戏

关于java - E2E 测试预期结果应该硬编码还是计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77230662/

相关文章:

Java、Cucumber 和 Selenium : Problems with navigate(). to()

javascript - 这是什么错误 ERROR Cannot prepare tests due to an error.类型错误 : Cannot read property 'Date' of undefined?

java - Java 微服务之间的签名 JWT

java - 为什么我在POST请求中收到不允许的HTTP 405方法?

java - 将 ArrayList 添加到另一个 ArrayList 中

java - 调用 getResources().openRawResource() 时出错

java - 如何将场景大纲中的字符串列表转换为对象

ruby-on-rails - 尝试使用 Capybara、Cucumber、RSpec 和 Devise 登录时重定向到 example.com

typescript - 带有 typescript 自​​定义命令的 Cypress 类型错误

angularjs - 手动安装 Selenium Server 以使用古巴的 Protractor (AngularJS)