API 测试是软件测试的一种形式,涉及直接测试 API 并作为集成测试的一部分,以确定它们是否满足功能、可靠性、性能和安全性的预期。
先决条件:
API 代表应用程序编程接口。它是一组允许程序相互通信的规则。开发人员在服务器上创建 API 并允许客户端与其对话。
API 测试是一种软件测试,通过测试应用程序编程接口 (API) 来确定它们是否满足功能、可靠性、性能和安全性的预期。由于 API 缺乏 GUI,因此 API 测试是在消息层执行的。
API 测试对于发现其他测试级别难以检测的缺陷类型至关重要,例如与集成和功能相关的问题。
规划对于 API 测试至关重要。以下是规划时需要考虑的一些步骤:
为确保有效的 API 测试,请遵循以下最佳实践:
首先,我们将设置我们的项目。导航到您的项目目录并初始化一个新的 Node.js 项目:
npm init -y
接下来,我们需要安装jest
用于测试和axios
发出 HTTP 请求:
npm install --save-dev jest axios
为您的测试创建一个新文件,例如api.test.js
.
const axios = require('axios');
test('User with ID 1 exists', async () => {
const response = await axios.get('https://jsonplaceholder.typicode.com/users/1');
expect(response.status).toBe(200);
});
test('User with ID 1 has name "Leanne Graham"', async () => {
const response = await axios.get('https://jsonplaceholder.typicode.com/users/1');
expect(response.data.name).toBe('Leanne Graham');
});
test('Create a new user', async () => {
const user = {
name: "Test User",
username: "testuser",
email: "[email protected]"
};
const response = await axios.post('https://jsonplaceholder.typicode.com/users', user);
expect(response.status).toBe(201);
});
在您的“脚本”部分添加以下内容package.json
:
"scripts": {
"test": "jest"
}
您现在可以使用以下命令运行测试:
npm test
这是使用 JavaScript 进行 API 测试的基本介绍。请记住,随着您的系统变得更加复杂,您的测试将需要变得更加复杂。测试愉快!
验证测试可确保 API 以正确的格式返回正确的数据。
test('User email is valid', async () => {
const response = await axios.get('https://jsonplaceholder.typicode.com/users/1');
expect(response.data.email).toMatch(/\S+@\S+\.\S+/);
});
功能测试验证 API 是否按预期工作以及所有端点交互是否正常运行。
test('Create a new post', async () => {
const post = {
title: 'foo',
body: 'bar',
userId: 1
};
const response = await axios.post('https://jsonplaceholder.typicode.com/posts', post);
expect(response.data.title).toBe('foo');
expect(response.data.body).toBe('bar');
expect(response.data.userId).toBe(1);
});
安全测试可验证您的 API 是否免受攻击和漏洞的影响。
test('Cannot access secured endpoint without token', async () => {
try {
await axios.get('https://myapi/secure');
} catch (error) {
expect(error.response.status).toBe(401);
}
});
错误检测检查 API 如何处理故障。它会崩溃吗?它是否返回有意义的错误消息?
test('Non-existent endpoint returns 404', async () => {
try {
await axios.get('https://jsonplaceholder.typicode.com/nonexistent');
} catch (error) {
expect(error.response.status).toBe(404);
}
});
您可以使用 GitHub Actions、CircleCI、Travis CI 或任何其他 CI/CD 工具来自动化测试。每次推送代码更改时,该工具都会自动运行您的测试。
Jest 允许您在测试中轻松模拟模块。这是一个模拟 axios 获取响应的示例:
jest.mock('axios');
axios.get.mockResolvedValue({
data: {
id: 1,
name: 'Leanne Graham'
}
});
test('Get user with ID 1', async () => {
const response = await axios.get('https://jsonplaceholder.typicode.com/users/1');
expect(response.data.name).toBe('Leanne Graham');
});
负面测试是指向 API 提供无效输入,以确保它可以正常处理并返回适当的错误消息。
test('Cannot create user without email', async () => {
const user = {
name: "Test User",
username: "testuser"
};
try {
await axios.post('https://jsonplaceholder.typicode.com/users', user);
} catch (error) {
expect(error.response.status).toBe(400);
}
});
API 链接涉及使用一个 API 调用的响应来触发另一个 API 调用。当必须根据前一个 API 的响应触发一系列 API 时,这一点非常重要。
test('Get posts by user with ID 1', async () => {
const userResponse = await axios.get('https://jsonplaceholder.typicode.com/users/1');
const postsResponse = await axios.get(`https://jsonplaceholder.typicode.com/posts?userId=${userResponse.data.id}`);
expect(postsResponse.data[0].userId).toBe(1);
});
如果您的 API 使用 OAuth 进行身份验证和授权,您可能需要在测试中处理令牌生成和刷新。
test('Cannot access resource without token', async () => {
try {
await axios.get('https://myapi/resource');
} catch (error) {
expect(error.response.status).toBe(401);
}
});
本教程涵盖了使用 JavaScript 进行 API 测试的基础知识和一些高级概念。请记住,随着您的应用程序的增长,您的测试和方法也会随之增长。测试愉快!瓦利德·穆萨