logo
0
0
WeChat Login
♻️ refactor: 将测试用例配置重命名为任务并重构相关代码

apicheck-go

apicheck-go 是一个基于 Go 语言的轻量级接口自动化测试工具,支持通过 YAML 配置文件定义测试用例,实现快速、可维护的接口验证和压力测试。

功能特性

  • ✅ 接口自动化测试:通过 YAML 配置文件定义测试用例
  • ✅ AB 风格压力测试:支持并发请求和多种统计指标
  • ✅ 灵活的变量管理:支持环境变量和测试用例间变量传递
  • ✅ 响应结果验证:支持 JSON 路径提取和验证
  • ✅ 详细的测试报告:包含响应时间、状态码、QPS 等指标
  • ✅ 高性能:使用 Go 语言的并发特性,支持高并发测试

技术栈

  • 语言:Go 1.23.12
  • 依赖:
    • github.com/urfave/cli/v3:命令行界面
    • github.com/tidwall/gjson:JSON 处理
    • gopkg.in/yaml.v3:YAML 配置解析
    • github.com/chihqiang/logx:日志处理

安装

源码安装

git clone https://cnb.cool/zhiqiangwang/apicheck-go cd apicheck-go go build -o apicheck main.go

使用方法

运行接口测试

./apicheck flow config.yml

运行压力测试

./apicheck ab --url http://example.com --concurrency 10 --total 1000 --timeout 3s --keep-alive

配置文件格式

测试用例配置 (config.yml)

variables: api_url: "https://httpbin.org" username: "apicheck" password: "secure123" token: "abc123xyz" tasks: - name: get_ip method: GET url: "{{api_url}}/ip" assert: http_status: 200 json_fields: origin: "present" - name: post_data method: POST url: "{{api_url}}/post" headers: Content-Type: "application/json" Authorization: "Bearer {{token}}" body: '{"username":"{{username}}","password":"{{password}}","email":"{{username}}@example.com"}' assert: http_status: 200 json_fields: json: "present" headers: "present" - name: get_headers method: GET url: "{{api_url}}/headers" headers: X-Custom-Header: "test-value" User-Agent: "apicheck-go/1.0" assert: http_status: 200 json_fields: headers: "present" - name: put_update method: PUT url: "{{api_url}}/put" body: '{"updated_field":"new_value"}' assert: http_status: 200 - name: delete_test method: DELETE url: "{{api_url}}/delete" assert: http_status: 200 json_fields: json: "present"

压力测试功能

ABTask 结构体

type ABTask struct { URL string // 压测地址 Concurrency int // 并发数 Total int // 总请求数 Timeout time.Duration // 单请求超时 KeepAlive bool // 是否开启 KeepAlive }

压测结果 (ABResult)

type ABResult struct { Total int // 总请求数 Success int // 成功请求数 Failed int // 失败请求数 Min float64 // 最小延迟(ms) Max float64 // 最大延迟(ms) Mean float64 // 平均延迟(ms) Median float64 // 中位数延迟(ms) P90 float64 // 90%请求的延迟(ms) P95 float64 // 95%请求的延迟(ms) P99 float64 // 99%请求的延迟(ms) QPS float64 // 每秒请求数 Duration float64 // 总耗时(秒) Start time.Time // 开始时间 End time.Time // 结束时间 StatusCodes map[int]int // 状态码统计 }

项目结构

apicheck-go/ ├── conf/ # 配置相关 │ └── config.go ├── flow/ # 测试流程控制 │ ├── flow.go │ └── result.go ├── task/ # 任务类型实现 │ ├── ab_task.go # AB 压力测试任务 │ ├── http_task.go # HTTP 测试任务 │ ├── task.go # 任务接口定义 │ └── variable.go # 变量管理 ├── config.yml # 测试用例配置示例 ├── main.go # 入口文件 ├── go.mod ├── go.sum └── README.md

核心功能实现

AB 压力测试

AB 压力测试功能支持高并发 HTTP 请求,提供详细的性能指标:

  • 使用固定大小切片存储延迟数据,优化内存使用
  • 支持配置并发数、总请求数、超时时间等参数
  • 计算完整的统计信息:最小/最大/平均/中位数延迟、90%/95%/99% 百分位、QPS 等
  • 记录状态码分布情况

HTTP 客户端优化

func (t *ABTask) newHTTPClient() *http.Client { transport := &http.Transport{ MaxIdleConns: t.Concurrency * 2, MaxIdleConnsPerHost: t.Concurrency, MaxConnsPerHost: t.Concurrency, IdleConnTimeout: 90 * time.Second, DisableKeepAlives: !t.KeepAlive, TLSHandshakeTimeout: t.Timeout, ResponseHeaderTimeout: t.Timeout, } return &http.Client{ Transport: transport, Timeout: t.Timeout, } }

性能指标说明

延迟统计

  • Min: 最小响应时间
  • Max: 最大响应时间
  • Mean: 平均响应时间
  • Median: 中位数响应时间
  • P90: 90% 请求的响应时间不超过此值
  • P95: 95% 请求的响应时间不超过此值
  • P99: 99% 请求的响应时间不超过此值

吞吐量

  • QPS: 每秒处理的请求数
  • Duration: 测试总耗时

注意事项

  1. 压力测试时请确保目标服务器能够承受相应的并发请求
  2. 合理设置超时时间,避免因网络问题导致测试结果不准确
  3. 对于长时间运行的压力测试,建议适当降低并发数