上一篇文章 异常测试实践与梳理之功能异常中,总结了功能异常的 3 种类型(单接口异常、web 端异常及业务操作异常)及其关注点和常用测试工具,这篇总结一下服务端异常测试。对后端服务来说,异常测试是保障系统可靠性的有效手段,也是对测试人员自身要求比较高的一项测试任务,特别是在对系统异常的分析上,需要测试人员有一定的经验。
服务端异常测试一般是放在功能测试全部完成之后,是对整个系统进行的系统性的异常测试,算是一种独立的测试类型。服务端异常测试的关注点主要是系统级别的参数,如 cpu、内存、线程状态、连接池情况等,与具体功能关系不太。
我在上个项目 A 项目中第一次实践了一个项目完整的服务端异常测试,下面从新手的角度,结合测试实践,总结一下服务端异常测试的一般流程及常用的测试工具。
在进行异常测试之前,必须了解系统架构,包括系统模块划分、依赖服务、数据流向及线上的部署情况等。因为异常测试就是在各个模块之间穿插异常,让系统不能按原有流程运行。
以 A 项目为例,这是一个典型的 web 前端 + 后台的项目,下面是系统架构。左侧是系统的模块划分,右侧是依赖的第三方服务。在架构分析阶段需要了解清楚各依赖模块的参数设置,如超时时间、连接池数量等。了解超时时间,一是后续测试访问超时要依赖超时时间设置,二是为了评估超时时间的合理性。
异常测试实践与梳理之功能异常中讲了单接口异常测试,如果在功能测试阶段做了单接口异常测试,那么对于接口的模块依赖及参数设置分析已经完成,系统架构分析时只需要分析其他的模块依赖即可,会快很多。
用例是根据上步的架构分析来设计的。异常测试用例主要分为应用层异常和系统异常。在 A 项目中,系统异常优先级低,主要关注外部依赖模块的异常。下图中的每一个异常场景即为一条异常测试用例。
异常测试需要在一定的持续接口调用过程中进行,即需要有一定的背景流程。而且最好是混合的、覆盖核心业务的接口,并且需要尽量覆盖到每个依赖服务。这样异常测试覆盖范围才是比较全的。流量的模拟可以自己写代码实现,也可用选用 jmeter 等工具。
A 项目中的主流程是购买,背景流量选用购买流程涉及的几个接口。而购买流程比较特殊,各接口之间通过 token 进行关联,且后一个接口的参数值依赖于前一个接口的返回,使用 jmeter 等工具来模拟的话实现起来会很麻烦,所以我选用写 java 代码来模拟一系列的接口请求。
访问超时可以使用 linux 的 tc 命令,服务挂掉可直接通过修改服务的 ip 和端口,或修改服务对应的 host 来模拟。
异常分析是服务端异常测试中的重点,也很考验测试人员功底的环节,需要测试人员有一定的实战经验,要熟悉常用监控工具,并了解系统常见的异常的分析步骤。
web 前后端的项目一般需要主要关注以下几点:CPU、GC&内存、线程及连接池的状态、业务请求的状态等。其中线程&连接池状态主要包括请求响应时间、线程是否阻塞,还有要关注 TCP 连接的状态,特别是 CLOSE_WAIT 的数量是否正常。
我测试过程中使用的监控工具主要是 windows 下 jconsole 客户端和 netstat 命令。JConsole 是 jdk 自带的监控工具,操作简单,比较容易上手,可实时监控 java 程序在运行过程中的内存,cpu,线程的使用情况,并可以对加载的相关类进行分析,监控界面如下图所示。使用 jconsole 连接远程 java 应用需要进行的远程配置及本地配置,可以参照这篇文章:如何利用 JConsole 观察分析 Java 程序的运行,进行排错调优。
netstat 命令用于显示各种网络相关信息,如网络连接,路由表,网络接口信息等。平时最常用的是 netstat -ntlp | grep *** 端口,用来查看该端口是否被占用以及占用的进程 PID。异常测试中,主要用 netstat 来查看服务器 TCP 的连接状态,使用下面这条命令可以统计当前各 TCP 状态的连接数量:
root@347cf33bf9af:~# netstat -an | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
LISTEN 8
CLOSE_WAIT 5
ESTABLISHED 12
一般在批量请求结束之后,如果 CLOSE_WAIT 还维持在一个比较大的数量的话,一般就说明程序里存在问题。
主要关注在异常恢复之后,业务请求及系统的资源占用情况能都快速恢复正常。
在测试报告中需要指明测试的结论、系统的架构图、整体测试策略、环境配置以及测试过程中的操作步骤。其中环境配置中需要说明部署应用机器的配置、tomcat 版本及 jvm 的参数配置等信息,在测试过程中,最好记录下操作的步骤及系统的表现,方便后续问题的复现及回溯。
下图就是测试过程中的步骤及现场记录的一部分:
到这里,服务端异常测试的实践就介绍完了。总体来讲,最关键也是最难的点,在系统架构分析及异常分析上,前者需要测试人员对系统有深入的了解,后者需要测试人员对熟悉常用的服务端监控工具及命令,并且对系统异常分析有一定的经验。
这次测试过程中发现的问题不多,从深度上来讲是比较浅的,但是熟悉了服务端异常测试的流程及常用的分析工具,在后续项目中会在异常测试的深度上多花点功夫,争取在异常分析上积累更多的实战经验。