大家好!
我写这篇文章的灵感来自于我的学生和学员。我经常建议他们在熟悉JavaScript上的测试自动化过程后立即学习TypeScript 。让我们看看在 REST API 测试方面,在测试自动化框架中使用 TypeScript 的特点是什么……
您可以在此处找到测试项目的完整代码。
我们不要太深入地了解TypeScript是什么以及它与JavaScript有何不同,并声明重要的事情 -
TypeScript作为Node.js包呈现,因此我将其视为具有一些很酷功能的JavaScript 。
要了解有关该语言本身及其功能的更多信息 - 请访问官方网站,同时我们将讨论其在测试自动化方面的功能......
让我们回顾一下TypeScript上的测试自动化项目创建过程:
创建一个Node.js项目。
npm init -y
安装TypeScript包。
npm i typescript
为项目生成默认的TypeScript配置 - tsconfig.json
。
npx tsc --init
上面的命令将生成一个默认配置文件,但我建议将其缩短很多,如下所示:
{ "compilerOptions": { "baseUrl": "./", "module": "esnext", "target": "esnext", "sourceMap": false, "moduleResolution": "node", "allowJs": true, "skipLibCheck": true, "resolveJsonModule": true, "allowSyntheticDefaultImports": true, "paths": { "*": ["./*"] } } }
此配置包含所需的最低配置:
您可以使用官方文档扩展您的配置。
您可以使用Node.js生态系统提供的任何工具,但根据我的经验 - 大多数 使用TypeScript 的工程师选择Jest有几个很好的理由:
以前,我很喜欢使用Mocha + Chai来设置项目的核心,但现在我也坚持使用Jest ,因为它包含测试运行器和断言库。
Axios似乎是最流行的 HTTP 客户端,所以我建议您也选择它。
不能说您被迫在设置中使用它,但我是说,当您查看项目时,这是常见的事情。
现在,只需安装这些包作为依赖项:
npm i jest axios
有些包(如Axios )内部包含TypeScript类型,但Jest和Mocha不包含。此外, Jest需要ts-jest包和@types/jest才能正常工作 - 第一个包启用TypeScript功能,第二个包允许您使用IntelliSense 。
因此请记住 - 如果您在尝试使用某些包时没有自动完成功能 - 您可能缺少类型声明。
让我们也安装TypeScript相关的扩展(包):
npm i ts-jest @types/jest
Jest需要ts-jest配置预设,因此您必须在配置(或package.json )文件中声明它:
{ "jest": { "preset": "ts-jest" } }
如果您计划在项目中使用绝对路径,则还需要调整您的配置:
{ "jest": { "preset": "ts-jest", "moduleDirectories": [ "node_modules", "<rootDir>" ] } }
此配置允许您使用简单的命令运行测试... jest
因此,将package.json中的测试脚本配置为:
{ "scripts": { "test": "jest" } }
然后随时使用npm test
或npm run test
命令运行测试。
如果您是Visual Studio Code用户,我还建议您安装Jest Runner 扩展- 它允许您只需单击一下即可运行/调试所需的测试/套件。在WebStorm 中,这是一个内置功能。
TypeScript引入 REST API 测试的主要功能是......
您可以声明您的请求和响应正文应该是什么样子,即
让我们以Paysis服务器为例 - 我们可以将/auth
端点的请求正文有效负载写为类型:
export type AuthRequestBody = { login: string password: string }
响应正文也是如此 - 服务器应该向我们的请求发送什么:
export type AuthResponseBody = { token?: string message?: string }
由于成功/失败场景会有不同的有效负载 - 您可以通过“ ?”将键标记为“可选”特点。
完成后 - 您可以使用这些类型在测试中组成请求和验证......
在Axios中,您可以通过请求配置说出要发送的正文:
const payload: AxiosRequestConfig<AuthRequestBody> = { method: 'post', url: '/auth', data: { login: process.env.USERNAME, password: process.env.PASSWORD, }, }
AxiosRequestConfig<AuthRequestBody>
中的AuthRequestBody
正是这个意思☝️
这意味着您将被迫使用与data
对象中提供的AuthRequestBody
类型匹配的有效负载。如果您忘记设置一些必填字段或设置一些过多的字段 - 您将看到错误。
对于响应也可以做同样的事情:
const response: AxiosResponse<AuthResponseBody> = await client.request(payload)
它将自动完成功能添加到response.data
对象中,以便您能够访问response.data.token
或response.data.message
字段。
除了上面的简单内容之外,还可以从自定义类型生成 JSON 模式。它使您不必检查响应正文中的每个键来查看它是否与架构匹配,而是检查整个有效负载。
所以想法是:
非常酷的东西,但请记住,在这些更改之后,您的测试可能会变得不稳定 - 当出现一些其他字段时就会发生这种情况,因此您需要定期更新架构。
TypeScript设置可能会很棘手,特别是如果这是您第一次,但这是值得的!
如果您使用类型覆盖输入和输出数据,那么在解析这些对象时就不可能出现拼写错误或其他语法错误。它可以帮助您避免简单的错误,并让您可以在代码中直接查看请求的结构,因此您不必打开任何HTTP集合(如Postman )并查找所需的请求以查看它请求/响应的主体和。
让我知道您的经历以及您的想法。