3-1 接口测试流程+接口测试工具&脚本
接口性能分析思路
功能测试之外,接口性能测试同样重要。当网站需要优化时,应从接口层面入手排查:
排查顺序(自上而下):
网络延迟 → 服务端处理 → 数据库查询
排查顺序(自下而上):
SQL 查询时长 → 机器资源(CPU/磁盘IO/内存) → 网络传输
text
常见瓶颈出现在数据库层面而非 Web 框架层面。
接口测试标准流程
完整的接口测试包含六个环节(中小团队可按需裁剪):
| 环节 | 说明 | 是否必须 |
|---|---|---|
| 需求理解和分析 | 理解接口的功能需求、输入/输出参数、错误代码、异常处理等信息(可从接口文档、需求文档或开发人员处获取) | 建议 |
| 测试用例设计 | 包含正常功能测试用例、异常/错误处理测试用例、性能测试用例 | 建议 |
| 环境搭建 | 根据接口运行环境要求,安装和配置服务器、数据库、网络等 | 必须 |
| 执行测试 | 按测试用例执行,记录测试结果 | 必须 |
| 结果分析和报告 | 分析结果,反馈问题给开发人员,编写测试报告(包含目的、内容、环境、结果、存在的问题等) | 视项目 |
| 缺陷跟踪和回归测试 | 跟踪问题修复状态,修复后进行回归测试,验证修复是否影响其他功能 | 必须 |
对于给客户交付的项目,测试报告通常是阶段性验收的必要条件。可借助禅道、看板工具等管控整个流程。
测试工具分类
免费/开源工具
| 工具 | 类型 | 特点 |
|---|---|---|
| JMeter | 性能/功能测试 | Apache 开源,支持多种协议,GUI + CLI |
| Apache Bench (ab) | HTTP 压测 | 命令行工具,轻量 |
| Locust | Python 性能测试 | 代码化编写测试场景 |
| k6 | 现代压测工具 | JavaScript 编写脚本,云原生 |
| Gatling | 高性能压测 | Scala DSL,报告丰富 |
| wrk | HTTP 基准测试 | 命令行,高并发 |
| autocannon | Node.js 压测 | npm 生态,与 fastify 基准测试同款 |
| Artillery | Node.js 压测 | YAML 配置,支持 CI/CD |
| Tsung | 多协议压测 | Erlang 编写,支持 HTTP/WebDAV/SOAP |
| Siege | HTTP 压测 | 命令行,支持基本/摘要认证 |
| nGrinder | 性能测试平台 | 基于 Grinder,支持分布式 |
| Taurus | 测试框架 | 开源,可扩展 JMeter/Gatling |
商业工具
| 工具 | 说明 |
|---|---|
| LoadRunner | 业界老牌,功能强大但价格昂贵 |
| NeoLoad | 企业级性能测试平台 |
| Silk Performer | Micro Focus 出品的企业级测试工具 |
| LoadNinja | 基于浏览器的实时负载测试 |
面试中 JMeter 和 LoadRunner 是高频考点,但实际工作中 JMeter 的使用更为广泛(免费、开源、功能全面)。
Linux 性能测试脚本
除了接口级压测工具,服务器系统性能监控同样重要,以下是常用的 Shell 脚本和命令工具。
Shell 脚本
Bench.sh —— 一键系统性能测试:
- 显示当前系统的各种信息
- 取自世界多处知名数据中心的测试点,下载测试比较全面
- 支持 IPv6 下载测速
- IO 测试三次,并显示平均值
wget -qO- bench.sh | bash
# 或者
curl -Lso- bench.sh | bash
bash
SuperBench.sh —— 改进版性能测试:
- 改进了显示模式,基本参数添加了颜色方便区分与查找
- IO 测试采用小文件、中等文件、大文件分别测试,然后取平均值
- 速度测试替换为 Superspeed,测试到中国电信、联通、移动各三个不同地区的速度
wget -qO- --no-check-certificate https://raw.githubusercontent.com/oooldking/script/master/superbench.sh | bash
bash
UnixBench.sh —— 综合基准性能测试:
- 自动安装 UnixBench 和测试脚本
- 测试系统调用、读写、进程、图形化测试、2D、3D、管道、运算、C 库等系统基准性能
wget --no-check-certificate https://github.com/teddysun/across/raw/master/unixbench.sh
chmod +x unixbench.sh
./unixbench.sh
bash
命令工具
| 类别 | 工具/命令 | 用途 |
|---|---|---|
| 磁盘 IO | dd, hdparm, fio, iostat | 磁盘读写速度和 IO 使用率 |
| CPU | top, htop, mpstat | CPU 使用率 |
| 内存 | free, vmstat | 内存使用情况 |
| 网络 | netstat, ss, iperf | 网络连接和带宽 |
| 综合 | sysstat 工具集, sysbench | 系统性能综合监控和压力测试 |
dd 命令 —— 快速磁盘 IO 测试:
dd if=/dev/zero of=test bs=8k count=256k conv=fdatasync
dd if=/dev/zero of=test bs=64k count=4k oflag=dsync
bash
conv=fdatasync 与 oflag=dsync 的区别:sync 函数将修改过的块缓冲区排入写队列后立即返回,不等待实际写磁盘结束;fsync 函数只对单一文件起作用,且等待写磁盘操作结束。不带缓存的 IO 读写测试才是硬盘的真实读写速度,一般低于 30MB/s 算较慢。
fio —— 专业 IOPS 测试工具,可产生多线程执行特定类型的 IO 操作:
# 安装
sudo apt install fio
# 测试读速度
fio --name TEST --eta-newline=5s --filename=temp.file --rw=read --size=2g --io_size=10g --blocksize=1024k --ioengine=libaio --fsync=10000 --iodepth=32 --direct=1 --numjobs=1 --runtime=60 --group_reporting
# 测试写速度
fio --name TEST --eta-newline=5s --filename=temp.file --rw=write --size=2g --io_size=10g --blocksize=1024k --ioengine=libaio --fsync=10000 --iodepth=32 --direct=1 --numjobs=1 --runtime=60 --group_reporting
# 测试随机读写
fio --name TEST --eta-newline=5s --filename=temp.file --rw=randrw --size=2g --io_size=10g --blocksize=4k --ioengine=libaio --fsync=1 --iodepth=1 --direct=1 --numjobs=1 --runtime=60 --group_reporting
bash
fio 常用参数说明:
--rw=randwrite:读写模式,可选read、write、randread、randrw等--ioengine=libaio:异步模式,同步使用sync--direct=1:使用 direct IO--numjobs=1:每个 job 的线程数--iodepth=64:队列深度--bs=4k:每个 IO 命令的数据大小,4KB IOPS 测试时设置此项
sysbench —— 综合压力测试工具,可测试 CPU、内存、文件 IO 和数据库:
# 安装
sudo apt install sysbench
# 生成测试文件
sysbench --test=fileio --num-threads=20 --file-total-size=1G --file-test-mode=rndrw prepare
# 执行测试
sysbench --test=fileio --num-threads=20 --file-total-size=1G --file-test-mode=rndrw run
# 清理测试文件
sysbench --test=fileio --num-threads=20 --file-total-size=1G --file-test-mode=rndrw cleanup
bash
在测试硬盘 IO 时,可以使用 iostat -x 1 10 查看磁盘压力(需安装 sysstat)。主要关注 %util 和 %idle:%util 接近 100% 说明 IO 请求太多,系统已满负荷;%idle 小于 70% 时 IO 压力较大。dd 命令直观但准确性不一定高,sysbench 和 fio 是综合性的测试工具,能全方位了解磁盘 IO 性能,推荐使用。
涉及网络测试的脚本需要联网运行,如需在内网执行可跳过网络部分或提前下载脚本上传到服务器。
参考资源
↑