在前端开发中,需要进行单元测试和集成测试,而 Pact 就是一款流行的契约测试框架。Pact 在进行测试过程中,根据契约规定了消费者和提供者应该遵守的协议,从而避免了接口的错误和不一致性。Pact 还通过 API 端点来检测所复制的运行状态,因此它非常适合于微服务架构。
在这篇文章中,我们将介绍 npm 包 @bhvr/pact-node 的使用教程,以帮助你更方便地进行 Pact 的单元测试和集成测试。
安装
首先,在你的代码根目录中运行下面的 npm 命令:
npm install @bhvr/pact-node --save-dev
这将会安装 @bhvr/pact-node 的最新版本到你的项目中。
准备工作
在你开始使用 @bhvr/pact-node 前,你需要先准备以下工作:
- 在 test 源代码目录下创建对应的生产者和消费者目录,如下:
my-app/ |- test/ |- consumer/ |- provider/
- 在每个目录下创建 package.json 文件和相关代码。
- 生产者在 package.json 版本信息中添加
"pact": {"port": 1234}
,其中 1234 为你要使用的 Pact 服务器端口。这能够确保在测试时使用相同的端口。
{ "name": "my-app", "version": "0.0.1", "pact": { "port": 1234 } }
在这个例子中,我们将使用默认端口 1234。
创建 Consumer 契约测试
首先,我们需要编写一个消费者契约测试,这个测试用来检测消费者请求数据是否符合契约规定。假设我们要测试以下代码:
const axios = require('axios') class UserService { async getUser(id) { const response = await axios.get(`http://localhost:8080/users/${id}`) return response.data } }
首先,我们需要创建契约测试。在 test/consumer 目录下创建一个新的 JavaScript 文件,例如:user_consumer.test.js。
-- -------------------- ---- ------- ----- - -------- - - -------------------------- ----- ---- - --------------- ----- --------------- - ----------------------- ----------------------- -- -- - ---------- ------ ---- ------ ----- -- -- - ----- ---- - - --- -- ----- ----- ------ - -- ------- ----- ------ - ----- --- --------------------------- ---------------- --------- - ------------- -------------- ----------------------------------------------- -- -- -- ---------------------------- ------------------------------- -- --展开代码
在这个消费者契约测试中,我们使用了 @bhvr/pact-node 的 Verifier 类来验证我们的消费者是否遵守了契约规范。verifyProvider() 方法使用 Pact 服务器的记录,对生产者端点访问进行拦截,以验证消费者契约。
在生产者端,我们需要为其创建一个 Pact 契约来记录一些契约规定和提供者假设。在创建 Pact 契约之前,我们需要安装 @pact-foundation/pact-node 包。
npm install @pact-foundation/pact-node --save-dev
创建 Provider 契约测试
在 test/provider 目录下创建一个 JavaScript 文件,例如:user_service-provider.test.js。
-- -------------------- ---- ------- ----- ---- - --------------- ----- - ---- - - -------------------------------- ----- ----------- - ------------------------------ --------------------- ----- -- -- - --- -------- ------------- -- - -------- - --- ------ ----- ----- ---- --------------------------- ------- ------------ ---- --------------------------- --------- --------- ---------------- --------- --------------- -- -- ------------ -- -------------------- ------------- ------------ -- -- - ------------ ------------ -- - ------- -- ----- ------ ----- -- -- - ----- ---- - - --- -- ----- ----- ------ - ------------------------- -------------- -- ------- -- ----- - ------ ------------ - ------- ------ ----- ----------- -- ---------------- - ------- ---- -------- - --------------- ------------------ -------------- -- ----- ----- -- -- ----- ----------- - --- ------------- ----- -------- - ----- ---------------------- ------------------------------ ----- ----------------- -- -- --展开代码
在生产者契约测试中,我们使用了 @pact-foundation/pact 软件包来创建一个 Pact 契约并添加一个互动以描述到提供者端点的请求。通过调用 provider.verify() 来结束契约测试。如果契约测试通过,则会创建相应的 Pact 文件,它定义你的消费者和提供者之间的规格。它还将验证您的消费者是否遵守这个规范。
现在,我们的测试集成完成了,只需要运行消费者契约测试:
npm run test-consumer
和生产者契约测试:
npm run test-provider
即可开始 Pact 框架的单元测试和集成测试。
完整示例代码:
Consumer 契约测试
-- -------------------- ---- ------- ----- - -------- - - -------------------------- ----- ---- - --------------- ----- --------------- - ----------------------- ----------------------- -- -- - ---------- ------ ---- ------ ----- -- -- - ----- ---- - - --- -- ----- ----- ------ - -- ------- ----- ------ - ----- --- --------------------------- ---------------- --------- - ------------- -------------- ----------------------------------------------- -- -- -- ---------------------------- ------------------------------- -- --展开代码
Provider 契约测试
-- -------------------- ---- ------- ----- ---- - --------------- ----- - ---- - - -------------------------------- ----- ----------- - ------------------------------ --------------------- ----- -- -- - --- -------- ------------- -- - -------- - --- ------ ----- ----- ---- --------------------------- ------- ------------ ---- --------------------------- --------- --------- ---------------- --------- --------------- -- -- ------------ -- -------------------- ------------- ------------ -- -- - ------------ ------------ -- - ------- -- ----- ------ ----- -- -- - ----- ---- - - --- -- ----- ----- ------ - ------------------------- -------------- -- ------- -- ----- - ------ ------------ - ------- ------ ----- ----------- -- ---------------- - ------- ---- -------- - --------------- ------------------ -------------- -- ----- ----- -- -- ----- ----------- - --- ------------- ----- -------- - ----- ---------------------- ------------------------------ ----- ----------------- -- -- --展开代码
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/103127