随着现代应用程序的开发越来越依赖于 RESTful API,我们需要一种可靠的方式来测试这些API,并且需要能够集成到我们的CI/CD流程中。 Cypress是一个开源的JavaScript端到端测试框架,它的主要优势是简单易用、可靠的测试脚本以及直观的测试结果。因此,Cypress是一个非常适合测试RESTful API的工具。在这篇文章中,我们将探讨如何使用Cypress测试RESTful API以及一些实用的技巧和经验。
准备
在开始之前,我们需要新建一个基本的 Cypress 项目。首先,我们需要做一些必要的安装和配置:
安装 Cypress
在你的项目根目录中,运行以下命令安装 Cypress:
npm install cypress --save-dev
我们也可以使用Yarn来安装:
yarn add cypress --dev
设置配置文件
在根目录中新建一个 cypress.json
文件,用来设置相关配置。
下面是一个 cypress.json
配置文件的示例:
-- -------------------- ---- ------- - ---------- -------------------------- --------------- ----------------- -------------------- ---------------------- ----------------- ----- ------------------------ ------ ----------------- ---- ---------------- ---- -展开代码
这里我们设置了 Cypress 的一些参数,这些参数都非常重要。
baseUrl
:这是你要测试的API的根url。videosFolder
: 设置存放视频文件的目录路径。screenshotsFolder
: 设置存放截图的目录路径。videoRecording
: 如果设置为true
,则 Cypress 将录制所有测试用例的视频。defaultCommandTimeout
: 设置命令超时时间,以毫秒为单位,如果一个命令超过该时间,则将被视为超时,从而提前停止执行。viewportHeight
和viewportWidth
: 设置浏览器的宽度和高度。
请注意,这些配置选项只是 Cypress 中的一些基础配置。如果需要,可以添加其他配置项。
创建测试文件
在Cypress的测试目录cypress/integration
中,我们需要创建一个新的测试文件 api.spec.js
。 这将是我们编写测试用例的主要文件。
使用 eslint 和 prettier 等工具来格式化代码,这样代码会更易读和易于维护。
编写测试用例
我们来看一个简单的 API 测试用例:
-- -------------------- ---- ------- ----------------- -- -- - ----- ------- - ------------------------- ------------ -- -- - ------------ ------- ------ ---- ------------------- ------------------ -- - ---------------------------------- --------------------------------------- -- -- --展开代码
在这个测试用例中,我们使用 cy.request
方法发送 GET /users
请求,然后使用 expect
断言来验证请求的响应是否如预期。
这里是一个完整的测试用例,也就是我们在对 API 进行测试时,通常会编写的代码:
-- -------------------- ---- ------- ----------------- -- -- - ----- ------- - ------------------------- ----- ------- - - ---------------- ------- --------- --------------- ------------------ - ----- ----- - - ------ -------- ------ --------------------- ------ -------- ------ --------------------- ------ -------- ------ -------------------- - --- ------ ------------ -- -- - ------------ ------- ------ ---- ------------------- -------- ------- ------------------ -- - ---------------------------------- --------------------------------------- -- -- ----------- -- -- - ------------ ------- ------- ---- ------------------- -------- -------- ----- -------- ------------------ -- - ---------------------------------- -------------------------------------------- ------ - ---------------- -- -- -------------- -- -- - ------------ ------- ------ ---- ----------------------------- -------- -------- ------------------ -- - ---------------------------------- --------------------------------------------- -- -- ------------ -- -- - ------------- - --------- ------------ ------- ------ ---- ----------------------------- -------- -------- ----- -------- ------------------ -- - ---------------------------------- -- -- -------------- -- -- - ------------ ------- --------- ---- ----------------------------- -------- -------- ------------------ -- - ---------------------------------- -- -- --展开代码
在这个案例中,我们完成了四个测试用例来测试 /users 的 API:
获取所有用户
创建新用户
获取新创建的用户
更新用户信息
删除新创建的用户
每个测试用例中,我们都使用 cy.request
方法来执行 HTTP请求。我们还使用了 expect
断言方法,对响应进行了校验。
Cypress API
使用 Cypress 进行 API 测试的最大优点之一就是它提供了灵活的API来模拟各种HTTP请求。
cy.request()
:发送 HTTP请求并获取响应对象。cy.route()
:模拟服务器响应、捕捉请求并在测试中断言。cy.intercept()
:拦截请求或响应,并修改或结果。cy.stub()
:创建一个 PostgREST路由的代码存根。
在我们的测试用例中,我们使用 cy.request
方法来发送HTTP请求。下面,我们会介绍一些其他的方法。
模拟HTTP请求
在一些情况下,我们需要手动模拟HTTP请求,并自己处理响应。Cyress提供了自己的HTTP库,使我们能够简单、直观的做到这一点。
-- -------------------- ---- ------- ---------------- -- -- - ----------- -- ------- ---------- ------- ------ ---- ----------- -- -------- --------- ----- -- ----- --------- -- ---- -- -------------------------------------- -- - ----------------------------------------------- -- --展开代码
在这个测试用例中,我们用 cy.server()
启用了虚拟服务器,然后使用 cy.route
方法给一个GET /users/* 请求匹配响应。
拦截HTTP请求
我们可以使用 cy.intercept()
方法来拦截HTTP请求,并修改或结果。这样我们就可以模拟真实的网络环境,从而更加真实的测试我们的API。
下面是一个拦截HTTP请求的例子:
-- -------------------- ---- ------- -------------- -- -- - ---------------------------------- ----- -- - ------------- - --------- ------------------- ------------ ------- -------- ---- --------------------- -------- -------- ----- - ------ ---------------------- - -- ------------------------------------------ -- - ------------------------------------------------------- --------------------------------------------------- ---------------------------------------------------------------------- -- --展开代码
在这个案例中,我们使用 cy.intercept()
拦截了 PATCH
/users/1 请求,并将请求中的 name
参数修改为 newName
。然后我们发送该请求,并断言修改结果是否正确。
定制请求头部
有时我们需要在API请求中添加一个或多个自定义标头。Cypress提供了一个选项来处理请求头部。
下面是如何使用定制请求头的例子:
-- -------------------- ---- ------- ----------- -- -- - ------------ ------- ------ ---- --------------------- -------- - ---------------- ------- --------- ---------------- -------------- - ------------------ -- - ---------------------------------- -- --展开代码
在这个案例中,我们使用了 headers
选项来定制请求头。我们将使用两个自定义标头 Authorization 和 Custom-Header。
使用别名
在我们的测试用例中,我们可以使用 as()
方法为任何命令设置别名,也可以通过 cy.wait()
方法等待该命令获得结果。
比如说,我们可以使用 as()
为一个请求命名:
it("使用别名等待命令完成", () => { cy.request(`${baseUrl}/users/1`).as('getUser') cy.wait('@getUser').then((response) => { expect(response.status).to.eq(200) }) })
小结
在这篇文章中,我们学习了如何使用Cypress测试RESTful API以及一些实用的技巧和经验。 Cypress是一个非常易于使用的框架,可以让我们轻松地测试API,并集成到我们的CI/CD流程中。 使用 Cypress 需要遵循一些基本规则,例如设置正确的配置文件、使用正确的API方法以及编写清晰的测试代码。希望这篇文章能帮助前端开发人员更好的理解并学习这方面的知识。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67b9844e306f20b3a67f17f8