作为一名软件开发人员,对软件开发过程中的每个环节都不陌生,我们的代码提交后需要经过代码建构、单元测试、软件部署才能放到线上,有时候还要进行稳定性测试和压力测试。代码构建、单元测试、软件部署这些环节都必不可少,每个环节都要我们亲历亲为,会很费时间,有没有一种自动化的方式。另外,软件长时间运行的稳定性如何,承载能力如何,有没有一种自动化方法来测试软件的稳定性和系统承载能力。针对这两个问题,本文介绍一种Jenkins+Tcpcopy的软件自动化测试方法。
1 Jenkins
Jenkins是一个持续集成工具,能够依据资产库(源码,类库等)的变更自动完成编译、测试、部署和反馈,具体见下图:
1) 自动构建:可采用多种方式触发自动构建,比如版本库的变更、定时机制。
2) 纯净的构建环境:每一次都可把之前的环境删除干净,让每一次构建都是一个新的构建。
3) 完善的集成功能:集成代码测试,代码审查功能,支持自动化单元测试。
4) 反馈机制:在出现问题时,能及时的把问题反馈给相关人(代码提交者、测试人员、管理人员)
5) 回滚:在出现问题后,可进行版本回滚。
2 Tcpcopy
Jenkins能解决软件开发过程中代码构建、单元测试、软件发布的自动化问题,但是软件部署后是否能够长期稳定的运行,系统承载能力如何,这些问题是Jenkins解决不了的。下文我们通过TcpCopy来实现稳定性测试和压力测试。
2.1 工作机制
Tcpcopy是一种请求复制工具。可以将线上流量拷贝到测试机器,实时的模拟线上环境。在不影响线上用户的情况下,使用线上流量进行测试,以尽早发现bug。也可以通过放大流量,进行压力测试,评估系统承载能力。
Tcpcopy可以从线上服务器的抓取在线请求的数据包,通过修改目标请求地址和端口,将其发送给测试服务器进行测试。测试服务器上需运行拦截程序(intercept进程)。intercept进程默认会丢弃应用的响应内容,以释放tcp连接。具体工作流程,见下图
Tcpcopy拷贝一次流量访问的步骤如下:
1) 一个访问到达线上前端机;
2) socket数据包在ip层被拷贝了一份传给tcpcopy进程;
3) tcpcopy修改包的目的地址及源地址,发给目标测试机;
4) 拷贝的包到达目标测试机;
5) 目标测试机的软件应用处理访问(nginx),并返回结果;
6) 返回结果在ip层被截获、丢弃,由intercpet进程拷贝返回结果的ipheader并返回;
7) ipheader被发送给线上前端机的tcpcopy进程。
2.2 搭建及使用方法
下面举例说明Tcpcopy的搭建及使用方法,以下图中的测试环境为例进行说明。
服务器A:线上服务器,运行线上服务,服务端口81;
服务器B:测试服务器,部署测试服务,服务端口81;
服务器C:辅助服务器,拦截来自测试服务器的响应包;
服务器B:
添加路由:route add -net 10.10.30.0 netmask255.255.255.0 gw 10.10.20.2
服务器C:
安装tcpcopy0.96(见后文),并按照以下方式启动intercept
# modprobe ip_queue
# iptables -I OUTPUT -p tcp --sport 81 -jQUEUE
# intercept -i eth0 -F 'tcp and src port81' -d
如果内核版本大于3.5,按如下方式进行启动
# sudo iptables -I OUTPUT -p tcp --sport 81-j NFQUEUE
# sudo intercept -i eth0 -F 'tcp and src host 10.10.30.1 and src port 81' -d
服务器A:
安装tcpcopy0.96,并执行以下指令
tcpcopy -x 81-10.10.20.1:81 -s 10.10.20.2 -c 10.10.30.1–d
tcpcopy安装:
下载地址:https://github.com/wangbin579/tcpcopy/releases
# ./configure --enable-advanced--enable-pcap
# make
# make install
如果内核版本大于3.5,编译时添加参数--enable-nfqueue
如果configure过程中出现“error: pcap.h not found”,则需安装libpcap,yum install libpcap-devel