最近需要一个web系统进行接口性能测试,这里顺便说一下性能测试的步骤吧,大概如下
  一、分析接口频率
  根据系统的复杂程度,接口的数量有多有少,应该优先对那些频率高,数据库操作频繁的接口进行性能测试,所以先和开发根据业务情况,找到频率最高的几个接口。完成这些后再逐步完成剩余接口的测试。
  二、找到合适的测试工具
  性能测试工具简直数不胜数,最著名莫过于loadrunner,因为它支持windows,呵呵呵,这也是我刚毕业时用的工具(当然是盗版了。。。),简单易用,功能强大,不过收费版是真贵。我现在用得最多是jmeter,用起来也很简单。
  三、根据实际调整测试频率
  有的性能测试纯粹为了对比新旧版本的性能提升的,那就不用管三七二十一,全力去压既可。有的性能测试只是为了找到正常情况下,系统能支撑的最大并发之类,那么就要根据实际情况调整测试频率了,比如业务不繁忙时应该按多大频率,业务繁忙时应该按多大频率,业务正常时应该按多大频率。
  四、分析测试结果
  测试结果用于分析被测系统的性能瓶颈,它并不单单指测试工具的测试结果,还包括被测系统的日志,例如数据库访问日志,打印慢查询之类,作为一个性能测试人员,应该需要具备分析日志和测试工具结果的能力。
  下面说我在本次测试中遇到的难题,因为被测系统会对接口请求内容进行分析,如果格式不对就直接返回失败,所以用jmeter模拟请求时我都是根据实际请求内容来模拟的,其中有一个接口怎么模拟都返回失败,通过wireshark抓包后发现,正常的包接口请求body中有的换行符是"0a"有的是"0d0a"而且不能乱否则达不到想要的效果(同时多条数据查询),用jmeter模拟的请求参数却只能全是"0a"(用parameters的detail模拟)或者全是"0d0a"(用body data模拟),折腾许久仍然不行,最终只能郁闷地用python写代码来对这个接口做性能测试,其实真心不建议这样做,如果可以的话宁可让开发修改接口来临时绕过也好,因为术业有专攻,python毕竟不是专门用来做性能测试的,用它做性能测试是下策。windows下用python做性能测试大概有几种方案:
  1、多线程
  2、多进程
  3、协程

  本来打算用eventlet(基于协程),却发现用eventlet需要用它的“绿色标准库”,我这个接口请求内容如果用它的“绿色urllib2”来模拟的话又比较麻烦,用pycurl则简单许多,为了利用多核CPU的优势,我决定先用多进程+多线程的方式来实现一个比较挫的“接口性能测试”了。代码大概如下:

import string, threading, time
import random
import multiprocessing def perf():
a=0
while a<int(packets):#请求包总数,如果用时间长短来限制是更好的
for i in xrange(int(vusers)):#并发数,即并发线程数
t = threading.Thread(target=cloudquery,args=(random.randint(1, 1000000000)))#cloudquery是指每个线程干的活,就是实际的被测试接口,随机数用来尽量保证每次请求不同的内容,可以用其他方法来实现,不过要挑选性能比较好的方法,以免浪费资源在这上面
t.start()#启动线程
a+=1 if __name__ == '__main__':
jobs = []
for i in range(int(process)):#并发进程
p = multiprocessing.Process(target=perf)#启动多个进程,每个进程启动同样的线程
jobs.append(p)
p.start()
for aa in jobs:
aa.join()

  有时间再用绿色urllib2来实现一次,看看是不是更好一些。
  后记:已经用多进程+协程实现了,不过不知道是否我用法错误,从抓包看两者并发没有比多进程+多线程快啊。2进程*100线程的并发 > 2进程*协程的并发。。。

最新文章

  1. 由一个bug引发的SQLite缓存一致性探索
  2. WCF账户密码认证
  3. C# 检测程序运行时间的方法,Stopwatch类
  4. Android-ListView类
  5. Retrieve Only First x Rows
  6. 伪分布式环境下命令行正确运行hadoop示例wordcount
  7. OBJ解析
  8. GetMemory 函数解析
  9. think in coding
  10. 深入浅出学习Spring框架(四):IoC和AOP的应用——事务配置
  11. jquery中当CheckBoxList被选中时提示
  12. log4j.properties 的使用详解
  13. js中对一组数组进行求和
  14. 【BZOJ1901】【Luogu2617】Dynamic Ranking(主席树,树状数组)
  15. 一起学Android之Http访问
  16. java获取本机ip地址(写出来的)
  17. Spring 一二事(8) - annotation 形式的 MVC
  18. Unity教程之-UGUI一个优化效率小技巧
  19. 将图片绘制到画布上:imagecopy()
  20. [计算机网络-应用层] P2P应用

热门文章

  1. makefile编译错误情况整理
  2. mac上制作ubuntu引导盘
  3. rails 杂记 - erb 中的 link_to 的 ActiveRecord 与 render 中的 partial
  4. 新版Ubuntu安装日文输入法
  5. 算法基础_递归_求杨辉三角第m行第n个数字
  6. Feign 重试解析
  7. XSS笔记
  8. SyntaxError:unexpected EOF while parsing(&lt;string,line 0&gt;)
  9. windows 控制台下运行cl命令
  10. Linux Input子系统