
测试的发展方向大体是4种:功能业务测试、性能测试、测试开发、安全测试
(1)功能测试也就是以业务测试为重点,测试过程中可以使用一些开发语言如Java、Python写自动化的脚本辅助业务测试。
(2)性能测试:是不同于功能测试的另外一种测试方向,它是借助压测工具常用的如loadrunner、jemter对业务进行正常、峰值以及异常负载的压测从而监控系统的各项指标,发现系统的瓶颈点进而优化使系统处于最优状态。
(3)测试开发:是近2年比较流行的一种岗位,它对测试的要求更高,不仅要了解业务知识而且测试人员还要有丰富的开发经验,从而能利用开发知识编写测试工具提升测试效率。
(4)安全测试:这里不赘述。
本篇重点讲述性能测试的调优案例。
【性能测试例子1】
【背景阐述】
生产环境同一时间段请求量过大,导致服务响应下降,甚至拒绝连接,首先第一个想到的是扩容或者服务限流,经过扩容之后平稳了一个多月,又出现了相同的现象。
【优化】
检查各个服务器的硬件资源,cpu、内存、磁盘就发现磁盘利用率达到99%
查看开发的代码发现日志内容打印多且混乱,无用的日志不应该打印,另外日志等级设置的不合理,error、warn、info、debug,先前设置的debug出现性能问题,现在配置的error问题解决,并且去掉无用日志。
优化前日志每天的量在24G左右,将日志去掉后,日志减少,响应时间明显提高
目前支付系统的日志有两个地方需要修改:
1. 日志格式,不满足云平台的日志格式;
2. 日志内容,日志内容打印多且混乱。无用的日志(如:架构类,debug级别)不应该打印;
log4j对系统性能的影响程度主要体现在以下几方面:
a、日志输出的目的地,输出到控制台的速度比输出到文件系统的速度要慢。
b、日志输出格式不一样对性能也会有影响,如简单输出布局(SimpleLayout)比格式化输出布局(PatternLayout)输出速度要快。可以根据需要尽量采用简单输出布局格式输出日志信息。
c、日志级别越低输出的日志内容就越多,对系统系能影响很大。
d、日志输出方式的不同,对系统系能也是有一定影响的,采用异步输出方式比同步输出方式性能要高。
e、每次接收到日志输出事件就打印一条日志内容比当日志内容达到一定大小时打印系能要低。
【性能测试例子2】
【背景阐述】
订单服务:minor GC 每分钟100次左右,fullGC 每隔6分钟一次,接口平均响应时间50ms,
频繁full gc 造成服务响应下降,需要降低full gc频率,首先查看服务器物理内存有8g,系统配置的初始堆和最大堆都是1g,首先优化Minor GC频繁问题。通常情况下,由于新生代空间较小,Eden区很快被填满,就会导致频繁Minor GC,因此可以通过增大新生代空间来降低Minor GC的频率。例如在相同的内存分配率的前提下,新生代中的Eden区增加一倍,Minor GC的次数就会减少,调整初始堆的大小,扩大Eden空间的比例minor gc从每分钟100次降低为每分钟40次,fullGc降为每小时5次,响应时间大幅度提升。
【性能测试例子3】
【背景阐述】
atureFull GC的次数是按照老年代GC时stop the world的次数而定的。
bankService旧的配置:
-Xms1g -Xmx1g -Xmn512m -Xss512K -XX:PermSize=128m -XX:MaxPermSize=128m
jdk 1.8环境下 运行 ./jcmd 196761 VM.flags
查看默认VM.flags:
-XX:CICompilerCount=4 -XX:InitialHeapSize=1073741824 -XX:MaxHeapSize=1073741824 -XX:MaxMetaspaceSize=536870912
-XX:MaxNewSize=536870912 -XX:MetaspaceSize=536870912 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=536870912
-XX:OldSize=536870912 -XX:ThreadStackSize=1024 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
1.涉及收集器:
1.1Serial oLd收集器:标记-整理,暂停所有用户线程。
1.2Parallel Scavenge收集器:Java1.8默认的收集器,复制算法的收集器,特点是并行的多线程回收,以吞吐量优先。
此配置仅对年轻代有效。可以同时并行多个垃圾收集线程,但此时用户线程必须停止。
尴尬的是,【如果新生代使用它,老年代必须使用Serial Old收集器。】
1.3CMS(Concurrent Mark Sweep)收集器:最短回收停顿时间,注重响应速度。(并发方法)
2.默认VM.flags问题:
-XX:+UseParallelGC:选择垃圾收集器为Parallel Scavenge收集器。
3.修改方案:
老年代指定UseConcMarkSweepGC收集器,年轻代ParNew收集器配合使用。(不配置默认使用)
线上应该使用的配置
-Xms1g -Xmx1g -Xmn512m -Xss512K -XX:PermSize=128m -XX:MaxPermSize=128m -XX:ParallelGCThreads=20
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=4
-XX:CMSInitiatingOccupancyFraction=90 -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC
-XX:+PrintGCApplicationStoppedTime -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10
-XX:GCLogFileSize=200M -Xloggc:/opt/gc.log -XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/optdump.log
ps:
并行:多条垃圾收集器并行工作,用户线程处于等待状态,讲究吞吐量。
并发:用户线程无需等待,(不一定并行,可能交互执行),用户线程继续运行,垃圾收集器程序运行于其他CPU。
-------------------------自动化测试---------------------------
众所周知接口自动化测试有以下特点:
1、低投入高产出
2、比较容易实现自动化
3、和UI自动化相比更加稳定
接口自动化要做到低投入、低维护、高收益的效果
1、开发提交代码构建后能触发接口自动化脚本,进行测试
2、每天测试:使用Jenkins定时每天构建
3、当工具用:把公共的模块抽离出来写成工具如:放款、日终功能、还款功能。
4、冒烟测试用例、线上回归用例整理出来放到对应的xml里面,集中运行集中查看结果
将自动化测试用例数据存储在MySQL数据库中,实现数据和代码分离,以数据驱动测试场景。
58很多团队都是使用这样的结构来进行接口自动化,在以后的推广中,学习和迁移成本都会比较低。

很多公司测试数据放在Excel或者配置文件中,现在公司的代码都是提交到git上的,如果使用Excel不方便日常的修改与维护。而使用数据库可以针对测试用例批量修改,提交也有记录,数据回滚也方便。使用SQL最大的好处就是灵活
每个测试接口分组执行。使用allue展示测试结果
支持多环境多场景运行测试用例。
通用
简单、方便
用例数据与脚本分离,简单、方便
便于维护
模板化
抽象出通用的模板,可快速拓展
数据结构一致,便于批量操作,由于使用了同一的模板,各组之间便于交流学习。
校验
保证充足的检查点的情况下,还要尽可能的减少误报
健壮
在执行测试过程中,难免会报失败,执行失败可能的原因有很多,简单分为4类:

1、被测系统出错
2、测试工具出错
3、测试数据错误
4、不可抗力