基于生产环境的仿真流量测试

虽然业界的Web应用测试工具众多,但多数是基于压力的离线测试,很多时候很难发现所有问题,往往测试上线后依然存在各种问题。基于实际生产环境的仿真流量测试,无疑能够覆盖更多的问题,达到更好的测试效果。
以下介绍三种实现仿真流量测试环境的实现工具。

goreplay

  • 源码下载

    下载

  • 文档

    GitHubWiki

  • 特点

    • Go语言编写
    • 功能强大,简单易用
    • 资源消耗少
  • 简单用例

    • 将本地8080端口流量复制到 10.0.0.2 的80端口
      1
      ./goreplay --http-original-host --input-raw :8080 --input-raw-realip-header "X-Real-IP" --output-http "http://10.0.0.2:80" --exit-after 259200s

Tcpcopy

  • 源码下载

    Tcpcopy

    intercept

  • 文档

    GitHub·READEME

  • 特点

    • C语言编写
    • 使用复杂
    • 依赖root权限或CAP_NET_RAW capability(e.g. setcap CAP_NET_RAW=ep tcpcopy)
    • 依赖于 assistant server的intercept截获应答
  • 简单用例

    1
    2
    3
    10.0.0.1 生产环境
    10.0.0.2 测试环境
    10.0.0.3 assistant server
    • 生产环境
      1
      2
      ./tcpcopy -x 8080-10.0.0.2:80 -s 10.0.0.3 -d -n2
      # 将生产环境本地8080端口流量放大2倍复制到10.0.0.2的80端口,并指定10.0.0.3为assistant server
    • 测试服务器(10.0.0.2)上添加路由
      1
      2
      3
      route add -net 10.0.0.0 netmask 255.255.255.0 gw 10.0.0.3
      或:
      route add -host 10.0.0.1 gw 10.0.0.3
    • assistant server
      1
      2
      ./intercept -i eth0 -F ‘tcp and src port 80’ -d
      # assistant server的intercept捕获eth0网卡的80端口的响应包

ngx_http_mirror_module

mirror模块默认开启,编译时加–without-http_mirror_module参数可禁用此功能。

  • 版本

    Nginx 1.13.4 +

  • 作用域

    http, server, location

    mirror 模块配置分为两部分:源地址和镜像地址配置。

  • 简单用例配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# original配置
location / {
mirror /mirror;
mirror /mirror2;
mirror_request_body off; //是否镜像请求Body部分
proxy_pass http://prod.env:8080;
}

# mirror配置 //mirror不会输出http返回内容
location /mirror {
internal; //指定此location只能被内部的请求调用,外部的调用请求会返回404
proxy_pass http://test.env:8000$request_uri; //指定上游Server的地址
proxy_set_header X-Original-URI $request_uri; //镜像流量的头部
}
location /mirror2 {
internal;
proxy_pass http://test2.env:8000$request_uri;
proxy_set_header X-Original-URI $request_uri;
}