【问题标题】:What is the best practice for writing e2e tests that need to run in a sequence?编写需要按​​顺序运行的 e2e 测试的最佳实践是什么?
【发布时间】:2020-10-29 13:12:04
【问题描述】:

我们正在使用 Cypress.io 为我们的 Angular 应用程序编写 e2e 测试。我们面临的问题是,即使我们知道测试不应该相互依赖,但实际上在现实世界的应用程序中似乎不可能实现这一点。假设用户需要执行以下操作

  1. 注册
  2. 登录
  3. 创建一个类别
  4. 创建子类别
  5. 在特定子类别中创建产品

现在,如果我们必须为这些场景编写测试,我们要么必须编写一个巨大的测试来一次性完成所有这些,要么找到一种方法让它们按顺序运行,也许每个下一个测试都取决于前一个留下的状态。我很好奇每个人是如何处理这种情况的,因为我觉得它应该经常出现在真正的企业应用程序中。

【问题讨论】:

    标签: angular integration-testing ui-automation cypress e2e-testing


    【解决方案1】:

    查看为演示赛普拉斯测试方法、模式、实践和工作流程的实际使用而创建的赛普拉斯真实世界应用程序。

    https://www.cypress.io/blog/2020/06/11/introducing-the-cypress-real-world-app/

    【讨论】:

      【解决方案2】:
      1. 注册
      2. 登录
      3. 创建一个类别
      4. 创建子类别
      5. 在特定子类别中创建产品

      基本上,当您编写 E2E 测试时,第一条经验法则是您的测试必须独立运行,并且不应依赖于以前的测试。 在这里您正在运行独立测试,但同时您正在调用 API 以完成您的 pre-req 步骤(在登录情况下,注册是通过 API 完成的)

      所以基本上你可以如下进行。

      1. 为注册功能编写测试。

      2. 现在进行登录测试,您将不再通过 UI 进行注册过程。因此,您只需调用 API 即可完成注册流程。
        原因:您的注册用户界面可能已损坏,但其余功能可以正常工作。所以你不会使用 UI 路由来做到这一点。所以进行 API 调用

      3. 如上所述,您将进行 API 调用以执行第 1 和第 2 个测试用例,以用于第 3 个测试用例

      4. 如上所述,您将进行 API 调用以执行第 1、2 和第 3 个测试用例,以用于第 4 个用例

      5. 如上所述,您将调用 API 来执行第 1、2、3 和 4 个测试用例,以用于第 5 个测试用例

      【讨论】:

        【解决方案3】:

        基本上我要做的是创建 5 个包含相应测试的测试文件。但是每个测试都有不同的先决条件。 在您的场景中,

        • 注册 - 没有依赖关系
        • 登录 - 需要注册用户
        • 创建类别 - 需要登录用户
        • 创建子类别 - 需要登录用户和创建的类别..等。

        我会做的是,

        • 按照页面对象模型来识别、存储和检索页面 元素
        • 有一个共同的地方来存储方法/函数

        那么如果我们为创建一个类别

        做测试用例

        作为先决条件(beforeeach)

        • 设置视口
        • 登录页面
        • 导航以创建类别页面/部分
        • 验证网址

        在测试用例中(它)

        • 将添加特定的测试场景、验证等作为特定于创建类别的测试用例。

        将测试脚本集群化的原因是,如果需要,可以很容易地单独检查组件。如果不是,测试文件会很大,并且很难更新,最重要的是,当您对 Create a sub-category 进行修改时,如果您运行自动化,cypress 将通过所有测试用例,即使它们不相关。

        正如我所说, 在特定子类别中创建产品

        作为预先请求,

        • 我们需要一个用户登录
        • 我们需要一个已创建的类别
        • 我们需要一个已创建的子类别

        在所有这些步骤中,要检查在特定子类别中创建产品的测试场景,我们不必进行登录验证、创建类别验证或创建子类别验证。我们只需要一个 VALID 登录、一个 VALID 类别和一个 VALID 子类别。很可能我们可以在运行测试之前让它们可用。

        我们会这样,

        使用有效登录导航登录,选择我们的类别和子类别(或者您可以创建新的),然后进行所有无效和有效的场景测试以检查在特定子类别中创建产品强>。因为当您需要检查创建产品功能时,运行所有登录验证是没有意义的。

        希望这会有所帮助, 干杯

        【讨论】:

        • 所以基本上当我们运行 create product 测试时,它基本上也会测试所有之前的测试,对吧?因为在创建产品时,您需要创建类别、子类别等?那么单独测试所有这些功能又有什么意义呢?
        • 当您测试克里特一个产品时,登录-创建一个类别-创建一个子类别将是您的先决条件。由于这里很难添加,让我编辑答案
        • 我编辑了答案的最后一部分,希望很清楚,基本上,注册或登录也会有多个有效和无效的测试场景,它甚至可以是大约 30 -40 个测试用例,具体取决于您的表单和登录方法,因此在您添加类别和子类别的情况下,我们可能会查看大约 60 - 100 个测试用例。想象一下,当您需要检查是否仅添加产品时,您会运行所有这些。这将花费你所有的时间。
        【解决方案4】:

        为将来偶然发现此问题并正在考虑使用 Cypress.io 编写 e2e 测试的任何其他人发布此内容。

        他们网站上的 blog post 总结了编写 e2e 测试的最佳实践。

        Brian Mann 的 excellent talk 展示了使用 Cypress.io 编写 e2e 测试的最佳实践

        基本上我们可以在 Cyprus 中使用命令来执行需要在每次测试之前运行的常见操作。

        Mudithra 的回答对于我的问题是完全有效的,它可以概括地解释我们应该如何处理测试是另一个测试的先决条件的情况。

        【讨论】:

          猜你喜欢
          • 2017-11-16
          • 2019-07-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-13
          相关资源
          最近更新 更多