随着网络发展软件software也越来越复杂从独立单机结构到c/s结构、b/s结构、多层体系架构面向服务(soa)结构等集成软件software技术越来越多支持软件software用户也越来越多种凸显在人们面前问题是性能问题很多软件software系统在开发测试时没有任何问题但是上线不久就崩溃了原因就在于缺少了性能方面验证
性能测试“从小做起”
软件software是否在上线的前进行性能测试就能解决问题呢?不定如果性能测试进行得太晚会带来修改上风险很多软件software系统在设计时候并没有很好地考虑性能问题和优化方案等到整个软件software系统开发出来后测试人员忙着集成测试开发人员也疲于应付发现功能上bug当所有功能上问题都得到解决后才想到要进行性能测试性能测试结果表明系统存在严重问题如响应时间迟缓、内存占用过多、不能支持大量数据请求在大量用户并发访问情况下会造成系统崩溃如果此时再去修改已经非常困难了要彻底地解决性能问题需要重新调整系统架构设计大量代码需要重构这时员已经筋疲力尽不想再进行代码调整了调整带来是大量编码工作同时可能引发大量功能上不稳定性和再次出现大量bug
这给测试人员个启示性能测试不应该只是种后期测试活动更不应该是软件software系统上线前才进行“演练”而应该是贯穿软件software生产全过程如图所示
对于性能考虑应该在架构设计时就开始对于架构原型要进行充分评审和验证由于架构设计是个软件software系统基础平台如果基础不好也就是根基不牢性能问题就会根深蒂固后患无穷
性能测试应该在单元测试阶段就开始从代码每行效率到个思路方法执行效率再到个逻辑实现算法效率;从代码效率到存储过程效率都应该进行优化单元阶段性能测试可以考虑从以下几个方面进行:
代码效率评估;
应用单元性能测试工具;
数据库优化
应该注意每行代码效率所谓“积少成多水滴石穿”些看似细小问题可以经过多次执行累积成个大问题也是个量变到质变过程例如在用c#编写代码时候有些员喜欢在个循环体中使用串变量类似下面代码:
void loop1
{
digits = .empty;
for( i=0;i<100;i)
{
//累加串
digitsi.;
}
console.writeline(digits);
}
这样段代码其实是低效率是不可变对象串连接操作并不改变当前串只是创建并返回新串因此速度慢尤其是在多次循环中应该采用stringbuilder对象来改善性能例如下面代码就会快很多:
void loop2
{
//新建个stringbuilder类
stringbuilder digits = stringbuilder;
for( i=0;i<100;i)
{
//通过stringbuilder类来累加串
digits.append(i.);
}
console.writeline(digits.);
}
类似问题有很多它们特点是单个问题都很小但是在个庞大系统中经过多次问题会逐渐地被放大直到爆发这些问题都可以通过代码走查来发现