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. 对于长时间运行的压力测试,建议适当降低并发数

About

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

Language
Go100%