Cypress 框架结合 Pact 进行合同测试

阅读时长 13 分钟读完

前言

在 Web 前端领域,测试是一项极其重要的工作,但是不同的测试方式也有各自的优缺点。前端一般包括单元测试、集成测试、端到端测试等,其中端到端测试往往可以检测更多的问题,但是也更难、更耗时、更不稳定。在 VUCA 时代,产品和技术变化迅速,传统的测试方式显然难以适应这种变化,我们需要更为敏捷快速的测试方式。测试合同是其中一种让我们在多个服务之间更快速、稳定、安全地进行 API 和 UI 测试的方式。

Pact 是一种实现对合作 API 的合同测试的方法。它定义了一系列约束来规定 API 的使用方式,并提供了一种测试方式,通过测试生产者和消费者(两个或多个Web应用程序)之间的接口定义,将它们集成。 Cypress 则是一个非常流行的端到端测试框架。它是一个快速、简单、基于 JavaScript 的自动化测试框架,可以进行 UI 和 API 两种测试,适用于企业环境和开源社区。在此文章中,我们将分享如何将 Cypress 框架和 Pact 结合使用,在端到端测试中增强测试合同。

Pact 的基本概念

在 Pact 中,我们会定义 API 生产者和消费者。 生产者指的是生成提供 API 的应用程序或服务的团队或个人;而消费者指的是使用同一 API 的应用程序或服务的团队或个人。

Pact 的另外一个特点是它专注于约束,而不是规范。我们可以根据自己的需求选择 JSON 或 Yaml,甚至二进制格式(支持 Ruby)来编写 Pact 文件。Pact 模拟库会提供一系列 API 来运行 Pact 测试,可以在生产者和消费者之间创建模拟。

Pact 测试套件包含了如下几个概念:

  1. Provider: 要测试 API 的生产者。
  2. Consumer: 要测试 API 的消费者。
  3. Interaction: 一种 API 操作和响应的组合。
  4. Pact: Consumer 和 Producer 之间的 API 响应的协议。

Cypress 框架基本概念

在 Cypress 中,我们可以利用大量的 Cypress API 进行 UI 和 API 测试,在此不作过多展开。相关 API 可以在 Cypress 官方文档中查询。

结合 Cypress 和 Pact 进行合同测试

接下来,我们展示如何将 Cypress 和 Pact 库结合使用来进行合同测试。下面是一个包含生产者和消费者的最简 Pact 测试套件:

-- -------------------- ---- -------
- ----------------------------------
-
  ----------- -
    ------- -------------
  --
  ----------- -
    ------- -------------
  --
  --------------- -
    -
      -------------- ---- ----------- -----------
      ---------- -
        --------- ------
        ------- -----------
      --
      ----------- -
        --------- ----
        ---------- -
          --------------- ------------------
        --
        ------- -
          -
            ----- --
            ------- -----------
          -
        -
      -
    -
  -
-

这个测试套件定义了一条 API 的操作和响应的组合,是 my_consumer 和 my_provider 之间的协议(Pact)。这条合同表示当 my_consumer 请求 /products 时,my_provider 会响应一个包含 ID 为 1 的产品信息的 JSON 数据。这个 Pact 定义了 API 的使用约束和期待结果,然后在 Pact 模拟库下可以轻松模拟这个 API。

在基于 Cypress 的端到端测试中,我们可以利用 Pact 模拟库来代替真实的生产者,进行测试消费者与生产者之间的 API 协议是否一致。

为了使 Pact 和 Cypress 框架结合使用,我们需要以下依赖库:pactpact-cypresspact 包用于在测试中使用 Pact,而 pact-cypress 包用于在 Cypress 中使用 Pact。

相应的,配置文件如下:

-- -------------------- ---- -------
-- ------------------------
----- ---- - ----------------
----- ------------ - -------------------------
----- ------ - --------------------------
----- - ----- - - ---------------------------------
----- - -------- - - ------------

--- ---------------

-------------- - ---- -- -
  ---------- -
    ----------------- -
      -------------- - -------------------
        -------
        --------------------- ----------------------------
        - ---- -------------------- ----------------- --
      --

      -------------------------------------------
      -------------------------------------------

      ---------------- ------
    --
  ---

  -- --------- --- ------- -
    ----- ---- - -----
    ----- ---- - -
      -----
      ----- -----
      ---- --------------------------- ---------
      ---- --------------------------- ------- ------------
      --------- -------
      ----- --
      ------------------ ---------
    --

    ------ ------------------- -- -
      ---------- -
        -------------- -
          ------ --- ----------------- ------- -- -
            ----- ---- - -
              ---------------- ---------------------------
              ---------------- ---------------------------- ----------
              ----------- ------------------
              ------------------- -----------------------
              ------------------- -----------------------
              ----- ---------- ------- ------
              --------- --------
            --

            ---------
              -------------------
              -------- -- -
                ------------------ --------- ----------------
                ----------
              --
              ---------- -- -
                ------------------ ------ -- -----------
                ---------------
                ----------
              ---
          ---
        --
      ---
    ---
  -
--

cypress/plugins/index.js 文件是 Cypress 中的插件文件,其中包含了 Pact 合同测试相关的配置文件。

在这个例子中,我们使用了 node-external 模块来生成一个在测试中可见的后端测试服务器。这个服务器将作为需要检查的消费者和生产者之间的代理。为了启动这个服务器,我们需要在配置文件 pact.js 中加上相应的代码。具体如下:

-- -------------------- ---- -------
-- ------------------------
----- ---- - ----------------
----- ---- - ----------------
----- - -------- ---- - - ------------------------------
----- - ------ - - ------------------

----------------- ---- ------ -- -- -
  --- ---------

  --------- -- -
    ----- ---- - -----
    ----- --------------- - ---------------------------

    -------- - ------
      ----- -----
      ---- --------------------------- ------- ------------------
      ---- --------------------------- ---------
      ----- --
      ------------------ ---------
      --------- -----
      --------- --------------
      --------- -------
    ---

    ------ ----------------
      -------- -- -
        ------ -------------------------
          ------ --- --- - ------- ---- -- ---
          -------------- -- ------- --- ----------
          ------------ -
            ------- ------
            ----- ------------
            -------- -
              ------- -------------------
            --
          --
          ---------------- -
            ------- ----
            -------- -
              --------------- ------------------ ---------------
            --
            ----- -
              -
                --- --
                ----- ------------
              --
            --
          --
        ---
      --
      -------- -- ----------------- ----------
      -------- -- -------------------
      -------- -- -
        ----------------
          ------------------------ ------
          ---- -
            ----------------
          --
        ---
      ---
  ---

  -------- -- -
    --------
      -----------
      -------- -- ----------------- -----------
  ---
---

其中,我们首先设置了用于 mock 操作的 provider 实例,它可以在测试期间使用 Pact 生成一个模拟的提供程序。实例化后,我们在测试套件中为生产者加载了一个预定义的合同。这是因为如果合同无法访问,则使用 Pact 测试套件无法正常工作。

最后,在 after 钩子函数中监听生产者。

有了这些设置,我们就可以启动 Cypress ,并且实现消费者与生产者之间的 API 协议测试了。

-- -------------------- ---- -------
-- -----------------------------------
------------ ------ -- -- -
  --------- -- -
    -----------------------
  --

  -------- -- -
    -- ---------------- -
      ----------------------
      -------------- - -----
    -
  ---

  ---------------- ------- -- -- -
    --------------
    --------------- --------------------------------
  ---

  ----------- -------- ---- -------- ----- -- -- -
    --------------
    ---------------------- -- -- -
      ----- -------- - ----- ----------------- ----------------------------------
      -----------------------------------
      -------------------------------------------------
    ---
  ---

  -------- -- -
    ------------------------
  ---
--

要进行 Pact 测试, 我们可以在 my_test_spec.js 中调用 Cypress 的 cy.request() 方法,获取 Pact 测试套件中制定的合同预期响应数据。

至此,我们已经通过结合 Cypress 和 Pact,成功地实现了消费者与生产者之间的 API 协议测试。在这个过程的实现和结合中,您可以掌握如下技术点:

  1. Pact API 测试的基础知识以及 Pact 套件的编写方法。
  2. Cypress 测试框架的基本概念以及 Cypress API 的具体使用方法。
  3. Pact 测试与 Cypress 结合的实现方法。

总结

Pact 和 Cypress 是两个非常优秀的测试框架,在后端 API 和前端 UI 的测试中都有广泛的应用。结合两个框架,可以使得我们更快速、稳定、安全地进行合同测试,避免了各种传统测试方式的繁琐操作和不适应 VUCA 环境下的缓慢变化。我们在此文章中展示了结合 Pact 和 Cypress 进行接口测试的方法和实现。当然,在实际运用中,我们也要具体应用具体分析。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64df49e7f6b2d6eab3a7dfd8

纠错
反馈