使用 JavaScript 进行 API 测试的综合教程

说明

        API 测试是软件测试的一种形式,涉及直接测试 API 并作为集成测试的一部分,以确定它们是否满足功能、可靠性、性能和安全性的预期。

先决条件:

  1. JavaScript 基础知识。
  2. Node.js 安装在您的计算机上。如果没有,请在此处下载。
  3. npm(节点包管理器),它是 Node.js 附带的。
  4. 对 API 和 HTTP 方法(GET、POST、PUT、DELETE)有基本了解。

第 1 章:了解 API 测试

1.1 什么是API?

API 代表应用程序编程接口。它是一组允许程序相互通信的规则。开发人员在服务器上创建 API 并允许客户端与其对话。

1.2 什么是API测试?

API 测试是一种软件测试,通过测试应用程序编程接口 (API) 来确定它们是否满足功能、可靠性、性能和安全性的预期。由于 API 缺乏 GUI,因此 API 测试是在消息层执行的。

1.3 为什么 API 测试很重要?

API 测试对于发现其他测试级别难以检测的缺陷类型至关重要,例如与集成和功能相关的问题。

第 2 章:API 测试规划

规划对于 API 测试至关重要。以下是规划时需要考虑的一些步骤:

  1. 了解 API:您需要了解您正在测试的 API 的用途。它可以像处理登录功能一样简单,也可以像管理大型系统的数据交换一样复杂。
  2. 定义结果:在开始测试之前,您应该知道您期望的结果。如果没有这种理解,您将无法知道 API 是否按预期运行。
  3. 定义您的测试:确定您要测试的内容。您可以测试 API 的功能、可靠性、安全性和/或性能。每一个都需要不同的方法。
  4. 准备测试环境:在开始测试之前设置测试环境。这包括拥有任何必要的数据库和服务器,并确保 API 可访问。
  5. 创建测试用例:测试用例包括测试步骤、条件和输入。提前准备好这些是很重要的。

第 3 章:API 测试最佳实践

为确保有效的 API 测试,请遵循以下最佳实践:

  1. 测试典型负载、最大负载和最小负载:始终检查 API 在典型负载、峰值负载和最小负载条件下的行为方式。
  2. 确定 API 函数调用的优先级:根据使用频率、重要性和实现复杂性确定 API 测试的优先级。
  3. 按测试类别对 API 测试用例进行分组:这可确保一个类别的所有测试用例按顺序执行,从而节省时间。
  4. 使用自动化进行回归、负载和性能测试:手动测试可能非常耗时且容易出错,因此建议尽可能实现自动化。
  5. 监控生产中的 API:持续监控 API 的性能,以确保其功能、可靠性和安全性。

第 4 章:设置环境

首先,我们将设置我们的项目。导航到您的项目目录并初始化一个新的 Node.js 项目:

npm init -y

接下来,我们需要安装jest用于测试和axios发出 HTTP 请求:

npm install --save-dev jest axios

为您的测试创建一个新文件,例如api.test.js.

第 5 章:编写基本测试

5.1 测试GET请求

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);
});

5.2 测试响应内容

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');
});

5.3 测试POST请求

test('Create a new user', async () => {
    const user = {
        name: "Test User",
        username: "testuser",
        email: "testuser@example.com"
    };
    const response = await axios.post('https://jsonplaceholder.typicode.com/users', user);
    expect(response.status).toBe(201);
});

第 6 章:运行测试

在您的“脚本”部分添加以下内容package.json

"scripts": {
    "test": "jest"
}

您现在可以使用以下命令运行测试:

npm test

这是使用 JavaScript 进行 API 测试的基本介绍。请记住,随着您的系统变得更加复杂,您的测试将需要变得更加复杂。测试愉快!

第 7 章:不同类型的 API 测试

7.1 验证测试

验证测试可确保 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+/);
});

7.2 功能测试

功能测试验证 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);
});

7.3 安全测试

安全测试可验证您的 API 是否免受攻击和漏洞的影响。

test('Cannot access secured endpoint without token', async () => {
    try {
        await axios.get('https://myapi/secure');
    } catch (error) {
        expect(error.response.status).toBe(401);
    }
});

7.4 错误检测

错误检测检查 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);
    }
});

第 8 章:自动化 API 测试

您可以使用 GitHub Actions、CircleCI、Travis CI 或任何其他 CI/CD 工具来自动化测试。每次推送代码更改时,该工具都会自动运行您的测试。

第 9 章:模拟 API 响应

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');
});

第 10 章:高级 API 测试概念

10.1 负面测试

        负面测试是指向 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);
    }
});

10.2 API 链接

        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);
});

10.3 API 中的 OAuth

        如果您的 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 测试的基础知识和一些高级概念。请记住,随着您的应用程序的增长,您的测试和方法也会随之增长。测试愉快!瓦利德·穆萨

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/186417.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言剔除相关数(ZZULIOJ1204:剔除相关数)

题目描述 一个数与另一个数如果含有相同数字和个数的字符&#xff0c;则称两数相关。现有一堆乱七八糟的整数&#xff0c;里面可能充满了彼此相关的数&#xff0c;请你用一下手段&#xff0c;自动地将其剔除。 输入&#xff1a;多实例测试。每组数据包含一个n(n<1000)&#…

.netcore 获取appsettings

我的开发环境是abpvnext net6.0 。 因为业务需要&#xff0c;从原来老项目net4.5工程里复制了一个报表导出的业务类到net6项目里面&#xff0c;但是他的获取appsettings的代码其实不用想都知道会报错。因为原来framwork时代获取appsettings的方法常见的是 System.Configura…

Jenkins CI/CD

1、 Jenkins CI/CD 流程图 说明&#xff1a;这张图稍微更形象一点&#xff0c;上线之前先把代码git到版本仓库&#xff0c;然后通过Jenkins 如Java项目通过maven去构建&#xff0c;这是在非容器之前&#xff0c;典型的自动化的一个版本上线流程。那它有哪些问题呢&#xff1f; …

PyQt基础_004_ 按钮类控件QPushButton以及自定义按钮控件

Qpushbutton基本操作 1.热键 2.按钮加图标 3.按钮事件等 import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *class Form(QDialog):def __init__(self, parentNone):super(Form, self).__init__(parent)layout QVBoxLayout()se…

万字长文 - Python 日志记录器logging 百科全书 - 高级配置之 日志文件配置

万字长文 - Python 日志记录器logging 百科全书 - 高级配置之 日志文件配置 前言 在 Python 的logging模块中&#xff0c;它不仅提供了基础的日志功能&#xff0c;还拥有一系列高级配置选项来满足复杂应用的日志管理需求。 说到logging 模块的高级配置&#xff0c;必须提及日…

模拟退火算法应用——求解函数的最小值

仅作自己学习使用 一、问题 需求&#xff1a; 计算函数 的极小值&#xff0c;其中个体x的维数n10&#xff0c;即x(x1,x2,…,x10)&#xff0c;其中每一个分量xi均需在[-20,20]内。因此可以知道&#xff0c;这个函数只有一个极小值点x (0,0,…,0)&#xff0c;且其极小值是0&…

STM32_7(ADC)

一、ADC ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁12位逐次逼近型ADC&#xff0c;1us转换时间输入电压范围&#xff1a;0~3.3V&#xff0c;…

蓝桥杯物联网竞赛_STM32L071_4_按键控制

原理图&#xff1a; 当按键S1按下PC14接GND&#xff0c;为低电平 CubMX配置: Keil配置&#xff1a; main函数&#xff1a; while (1){/* USER CODE END WHILE */OLED_ShowString(32, 0, "hello", 16);if(Function_KEY_S1Check() 1){ OLED_ShowString(16, 2, &quo…

HTTP/2:多路复用、服务器推送和首部压缩的革命

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

ES之x-pack-core-7.14.2许可证修改为白金版

X-Pack是什么 X-pack是elasticsearch的一个扩展包&#xff0c;将安全&#xff0c;警告&#xff0c;监视&#xff0c;图形和报告功能捆绑在一个易于安装的软件包中&#xff0c;虽然x-pack被设计为一个无缝的工作&#xff0c;但是你可以轻松的启用或者关闭一些功能。 主要分一下步…

基于Eclipse+Tomcat+Mysql开发的研究生信息教务系统

基于Eclipse的研究生教务系统 项目介绍&#x1f481;&#x1f3fb; 该研究生教务系统是一款集学生信息管理、学院信息维护、学生类别信息维护、专业信息维护、教师信息导入、课程信息导入及老师信息导入等功能于一体的教育管理软件。它以高效、便捷、准确的方式处理教务管理工作…

百度 文心一言 sdk 试用

JMaven Central: com.baidu.aip:java-sdk (sonatype.com) Java sdk地址如上&#xff1a; 文心一言开发者 文心一言 (baidu.com) ERNIE Bot SDK https://yiyan.baidu.com/developer/doc#Fllzznonw ERNIE Bot SDK提供便捷易用的接口&#xff0c;可以调用文心一言的能力&#…

DevEco Studio安装

HUAWEI DevEco Studio For OpenHarmony&#xff08;以下简称DevEco Studio&#xff09;是基于IntelliJ IDEA Community开源版本打造&#xff0c;面向OpenHarmony全场景多设备的一站式集成开发环境&#xff08;IDE&#xff09;&#xff0c;为开发者提供工程模板创建、开发、编译…

Markdown如何自定义字体样式:字体颜色、背景、斜体、粗体

Markdown如何自定义字体样式&#xff1a;字体颜色、背景、斜体、粗体 文章目录 Markdown如何自定义字体样式&#xff1a;字体颜色、背景、斜体、粗体前言一、字体大小二、字体颜色1. 英文字母2. 十六进制颜色值 三、字体背景色三、字体类型四、字体加粗五、字体斜体六、混合使用…

Mac Ubuntu双系统解决WiFi和WiFi 5G网络不可用问题

文章目录 设备信息1. Ubuntu WiFi不可用解决方式查看Mac的网卡型号根据网卡型号搜索获取到的解决方法查看WiFi名字问题参考链接 2. 解决WiFi重启后失效问题打开终端创建.sh脚本文件编辑脚本文件复制粘贴脚本修改脚本权限创建并编辑systemd service文件复制粘贴下文到systemd se…

Feign接口请求返回异常 no suitable HttpMessageConvert found for response type

问题场景&#xff1a; 后端调用feign接口请求, 接口返回异常, no suitable HttpMessageConvert found for response type 问题描述 报错异常如下&#xff1a; //根据图片特征 去查询人员信息ResultVo<List> personVos ipbdFaceLibPersonApi.queryFacePersonByFeatur…

Git 与 Maven:企业级版本管理与版本控制规范设计

一、背景 当今&#xff0c;许多开发人员熟悉 GitFlow 工作流程&#xff0c;但往往忽略了 GitFlow 如何与 Maven 版本控制结合&#xff0c;尤其是在管理 snapshot 和 release 版本时的最佳实践。本文旨在整合 GitFlow 工作流程与 Maven 版本管理&#xff0c;提出一个统一的企业…

Python 在 JMeter 中如何使用?

要在JMeter中使用Python&#xff0c;需要使用JSR223 Sampler元素来执行Python脚本。使用JSR223 Sampler执行Python脚本时&#xff0c;需要确保已在JMeter中配置了Python解释器&#xff0c;并设置了正确的环境路径。 1、确保JMeter已安装Python解释器&#xff0c;并将解释器的路…

CSS3新特性(2-1)

CSS3新特性 前言border&#xff1a;radius标签属性选择器box-sizing透明度 前言 本文主要讲解CSS3有哪些新的特性和内容&#xff0c;那么好&#xff0c;本文正式开始. border&#xff1a;radius 新增了圆角边框概念&#xff0c;可以通过具体数值或者百分比&#xff0c;来让边…

Java特殊文件

Properties 读取数据 package com.itheima.d1;import java.io.FileNotFoundException; import java.io.FileReader; import java.nio.charset.StandardCharsets; import java.util.Properties; import java.util.Set;public class Test1 {public static void main(String[] arg…