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

前言

在 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


猜你喜欢

  • 在 Angular 中使用 Service 来封装 HTTP 请求

    在 Angular 中使用 Service 来封装 HTTP 请求 在进行前端开发过程中,网络请求是不可避免的一个环节。为了更好地管理我们的网络请求,我们可以使用 Angular 提供的 Servic...

    1 年前
  • Server-Sent Events 事件流的格式及解析方法

    Server-Sent Events(服务器推送事件)是一种用于实时接收服务器发送的数据的Web API。它允许服务器通过 HTTP 连接向客户端推送事件,而不需要客户端不断地轮询服务器。

    1 年前
  • Kubernetes 中如何高效的管理 ConfigMap?

    Kubernetes 是一款广泛应用于云原生技术的容器集群管理平台。在 Kubernetes 中,ConfigMap 是一种存放配置信息的对象,可以用来存储应用程序的配置、环境变量等数据。

    1 年前
  • Promise 的优缺点以及场景

    在前端开发中,异步操作是一个非常常见的任务。异步操作完成之后,我们通常需要对异步结果进行一些操作。而在 Promise 的出现之前,处理异步结果是一件非常麻烦的事情。

    1 年前
  • 最佳实践:在 GraphQL 中使用 Union 类型

    GraphQL 是一种用于 API 的查询语言,它允许客户端指定希望从服务端获取的数据的结构。在 GraphQL 查询中,我们可以使用类型定义去描述查询和返回的数据结构。

    1 年前
  • 如何在 Deno 中使用 ES6 模块

    Deno 是一个新兴、现代的 JavaScript/TypeScript 运行时环境,它支持标准的 ES 模块 (ESM) 语法,因此我们可以在 Deno 中以 ES6 的方式来编写我们的应用。

    1 年前
  • 解决 SASS 编译出现 Mixin argument `$xxx` is not a variable 的方法

    在使用 SASS 进行前端开发过程中,可能会遇到 Mixin argument $xxx is not a variable 的编译错误。本文将介绍该错误的原因及解决方案。

    1 年前
  • React : 小心 setState 方法

    React 是当下最流行的前端库之一,它提供了许多方便的特性,包括可以在组件内部管理状态,使用 render() 函数可实现声明式 UI,等等。在 React 中,我们经常使用 setState() ...

    1 年前
  • 如何解决 ESLint 报错 "no-unused-vars" 但是变量已经定义了?

    问题描述 在编写代码时,我们经常会用到变量,有时候会发现 ESLint 报错 "no-unused-vars",但实际上变量已经定义了。造成这个问题的原因是什么?如何解决这个问题呢? 问题原因 这个问...

    1 年前
  • 解析 ES6, ES12,以及它们在 JavaScript 中的应用

    JavaScript 是一个常用的脚本语言,在前端开发中扮演着重要角色。ES6 和 ES12 是 JavaScript 的重要版本,提供了更加强大和方便的语言特性。

    1 年前
  • Vue SPA 应用实现全局 Loading 效果的方法

    在 Vue 单页面应用 (SPA) 开发过程中,为了提升应用的用户体验,我们可以采用全局 Loading 效果来提示用户当前页面正在加载数据。本文将介绍如何在 Vue SPA 应用中实现全局 Load...

    1 年前
  • 如何在 Hapi.js 中实现 Websocket 的 SSL 加密

    Websocket(网络套接字)是一种全双工通信协议,它在HTTP的基础上实现了持久连接和实时数据传输。Hapi.js是一款功能强大的开源Web应用程序框架,可以用于快速构建高性能和可扩展性的 Web...

    1 年前
  • Koa2 如何处理 Promise 中的错误

    前言 Koa2 是一个高效、灵活、可扩展的 Node.js Web 框架。它使用了 ECMAScript 2017 的 async/await 特性,使编写异步代码更加方便。

    1 年前
  • Redux 异步数据处理妙招解析

    Redux 是一个强大的状态管理库,它提供了一种非常方便、可维护的方式来管理应用程序的状态。在实际应用开发中,异步数据请求已经成为不可或缺的一部分。本文将深入探讨如何利用 Redux 处理异步数据请求...

    1 年前
  • Sequelize 如何实现数据的模糊搜索?

    在数据库中做搜索操作时,经常会遇到需要查询一些包含特定关键词的记录,这时就需要用到模糊搜索。 Sequelize 是一款流行的 Node.js ORM 框架,它提供了多种方法来实现数据的模糊搜索。

    1 年前
  • 在 Node.js 项目中使用 Mocha 和 chai-http 进行 API 接口测试的实践

    前言 随着互联网的快速发展,各种类型的 WEB APP 无处不在。在这个过程中,前端开发的良好体验是至关重要的。而对于复杂的 WEB APP,我们通常会使用后端 API 来提供数据支持。

    1 年前
  • 如何在 Ionic 项目中使用 ES9 语法

    ES9 是 ECMAScript 的第九个版本,也称为 ECMAScript 2018。它引入了一些新特性和语言改进,其中包括异步迭代、rest 和 spread 属性、正则表达式相关扩展以及 Pro...

    1 年前
  • Headless CMS 实现自动化测试的技巧及步骤

    前言 Headless CMS 是一种以 API 形式提供内容管理的 CMS (Content Management System),相较于传统的 CMS,可以更灵活地管理内容。

    1 年前
  • 如何在 Webpack 中配置 alias 解决路径问题

    前端开发中经常遇到路径问题,特别是当项目结构较为复杂时。为了减少路径相关问题带来的困扰,我们可以使用 alias 在 Webpack 中配置路径别名。 什么是 alias alias 即别名,是 We...

    1 年前
  • 如何使用 Chai 和 Karma 来进行跨浏览器测试?

    随着前端技术的发展,越来越多的项目采用了前后端分离的架构,前端成为了项目中不可或缺的部分。而随之而来的是项目规模的不断扩大,代码也越来越复杂,因此在完成开发后对代码进行测试显得尤为重要。

    1 年前

相关推荐

    暂无文章