前言
在 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 测试套件包含了如下几个概念:
- Provider: 要测试 API 的生产者。
- Consumer: 要测试 API 的消费者。
- Interaction: 一种 API 操作和响应的组合。
- 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 框架结合使用,我们需要以下依赖库:pact
和 pact-cypress
。pact
包用于在测试中使用 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 协议测试。在这个过程的实现和结合中,您可以掌握如下技术点:
- Pact API 测试的基础知识以及 Pact 套件的编写方法。
- Cypress 测试框架的基本概念以及 Cypress API 的具体使用方法。
- Pact 测试与 Cypress 结合的实现方法。
总结
Pact 和 Cypress 是两个非常优秀的测试框架,在后端 API 和前端 UI 的测试中都有广泛的应用。结合两个框架,可以使得我们更快速、稳定、安全地进行合同测试,避免了各种传统测试方式的繁琐操作和不适应 VUCA 环境下的缓慢变化。我们在此文章中展示了结合 Pact 和 Cypress 进行接口测试的方法和实现。当然,在实际运用中,我们也要具体应用具体分析。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64df49e7f6b2d6eab3a7dfd8