Web Service 性能测试工具比较

背景

希望选择一款Web Service性能测试工具,能真实模拟大量用户访问网站时的请求,从而获取服务器当前的请求处理能力(请求数/秒)。
以微信服务器为例,每个用户用独立的登录token,做各种操作,比如刷消息、发消息、看朋友圈等。

希望该性能测试工具符合如下要求:

1. 测试脚本能力,最好是Python/Ruby等最常用的
2. 每个并发实例能使用不同参数
3. CLI启动测试,这对自动化测试很重要
4. Session支持,也就是第一个请求的响应,能用于后续请求的参数。
6. 单个结点的并发数量高。
7. 分布式支持,不受限于单个结点的计算能力。

性能测试工具选手:

Gatling

http://gatling.io/

Gatling是一款基于Scala 开发的高性能服务器性能测试工具,它主要用于对服务器进行负载等测试,并分析和测量服务器的各种性能指标。Gatling主要用于测量基于HTTP的服务器,比如Web应用程序,RESTful服务等,除此之外它拥有以下特点:

  • 支持Akka Actors 和 Async IO,从而能达到很高的性能
  • 支持实时生成Html动态轻量报表,从而使报表更易阅读和进行数据分析
  • 支持DSL脚本,从而使测试脚本更易开发与维护
  • 支持录制并生成测试脚本,从而可以方便的生成测试脚本
  • 支持导入HAR(Http Archive)并生成测试脚本
  • 支持Maven,Eclipse,IntelliJ等,以便于开发
  • 支持Jenkins,以便于进行持续集成
  • 支持插件,从而可以扩展其功能,比如可以扩展对其他协议的支持
  • 开源免费

测试场景示例:
http://gatling.io/docs/2.1.7/advanced_tutorial.html

object Search {val feeder = csv("search.csv").random // 1, 2val search = exec(http("Home").get("/")).pause(1).feed(feeder) // 3.exec(http("Search").get("/computers?f=${searchCriterion}") // 4.check(css("a:contains('${searchComputerName}')", "href").saveAs("computerURL"))) // 5.pause(1).exec(http("Select").get("${computerURL}")) // 6.pause(1)
}

统计图:

 

nGrinder

官网很卡,真的很卡...zzz...

http://naver.github.io/ngrinder/

nGrinder是一个基于 Grinder 开发的一个非常易于管理和使用的性能测试系统。

它是由一个controller和连接它的多个agent组成,用户可以通过web界面管理和控制测试,以及查看测试报告,controller会把测试分发到一个或多个agent去执行。用户可以设置使用多个进程和线程来并发的执行该脚本,而且在同一线程中,来重复不断的执行测试脚本,来模拟很多并发用户。

nGrinder的测试是基于一个python的测试脚本,用户按照一定规则编写测试脚本以后,controller会将脚本以及需要的其他文件分发到agent,用Jython执行。并在执行过程中收集运行情况、响应时间、测试目标服务器的运行情况等。并保存这些数据生成运行报告,以供以后查看。

nGrinder的一大特点就是非常容易使用,安装也非常容易,可以做到开箱即用,测试用户也可以很容易就开始测试任务。当然,如果想执行一些比较复杂场景的性能测试,就需要测试人员对python有一定认识。

测试场景示例:
http://grinder.sourceforge.net/faq.html#simulating-users

#
# testRandomise.py
#
import random
import stringclass TestRandomise:def __init__(self, filename):self._users = []infile = open(filename, "r")for line in infile.readlines():self._users.append(string.split((line),','))infile.close()def getUserInfo(self):"Pick a random (user, password) from the list."return random.choice(self._users)#
# Test script. Originally recorded by the TCPProxy.
#
from testRandomise import TestRandomise
tre = TestRandomise("users.txt")class TestRunner:def __call__(self):# Get user for this run.(user, passwd) = tre.getUserInfo()# ...# Use the user details to log in.tests[2002].POST('https://host:443/securityservlet',( NVPair('functionname', 'Login'),NVPair('pagename', 'Login'),NVPair('ms_emailAddress', user),NVPair('ms_password', passwd), ))

统计图:

 

Locust

http://locust.io/

Locust 是一个开源负载测试工具。使用 Python 代码定义用户行为,也可以仿真百万个用户。

Locust 是非常简单易用,分布式,用户负载测试工具。Locust 主要为网站或者其他系统进行负载测试,能测试出一个系统可以并发处理多少用户。

Locust 是完全基于时间的,因此单个机器支持几千个并发用户。相比其他许多事件驱动的应用,Locust 不使用回调,而是使用轻量级的处理方式 gevent。

测试场景示例:
http://docs.locust.io/en/latest/quickstart.html#example-locustfile-py

from locust import HttpLocust, TaskSetdef login(l):l.client.post("/login", {"username":"ellen_key", "password":"education"})def index(l):l.client.get("/")def profile(l):l.client.get("/profile")class UserBehavior(TaskSet):tasks = {index:2, profile:1}def on_start(self):login(self)class WebsiteUser(HttpLocust):task_set = UserBehaviormin_wait=5000max_wait=9000

统计图:

 

其他未参与比较的工具

因为没有脚本能力或CLI,所以未加入比较

  • JMeter
  • ApacheBench(ab)
  • Tsung

Locust作者对JMeter和Tsung发的牢骚:

http://my.oschina.net/u/1433482/blog/464092#OSC_h4_3

我们研究了现有的解决方案,都不符合要求。比如Apache JMeter和Tsung。 

JMeter基于UI操作,容易上手,但基本上不具备编程能力。其次JMeter基于线程,要模拟数千用户几乎不可能。 

Tsung基于Erlang,能模拟上千用户并易于扩展,但它基于XML的DSL,描述场景能力弱,且需要大量的数据处理才知道测试结果。

比较

比较科目x工具矩阵

 

结论

很明显,首选的全能选手就是 Gatling ,Akka Actor的并发模型就是来自于并发语言的鼻祖Erlang。

如果想自己扩展性能测试工具,那么Locust这个小而精的工具可以考虑。

nGrinder工具是韩国版微信Line开源的,并且专门开设了中文论坛,由韩国工程师回答中国开发者。但有两个问题,一是官网太卡,其二示例都是片段不完整。

各位同学参照上面的对比,自己各取所需吧。

 

转载地址:https://testerhome.com/topics/3003

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457656.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python中的常量是什么意思_第14p,Python中的常量与注释。

大家好,我是杨数Tos,这是《从零基础到大神》系列课程的第14篇文章,第二阶段的课程:Python基础知识:常量与注释。学习本课程,建议先看一遍:【计算机基础知识】课程。一、Python中的常量1、什么是…

07_JS函数

JS函数 函数声明 使用构造函数 var fun new Function();使用关键字 function 函数名(形参){// 函数体 }匿名函数 var fun1 function(){name "fun1" }函数参数 实参,形参都可以是任意数据类型,浏览器执行时不会检查实参类型和数量&…

cocoapods的安装(这真是一个神奇的东西,每次安装的方法都不一样,而且很容易出现各种各样的错误)...

文章开始之前,建议安装一个显示网速的插件,不然你不知道到底有没有下载,也让生活有一点盼头 1.因为众所周知的原因(我dang的行为真的是让人失望),先更换一下ruby镜像源 $ gem sources --remove https://rub…

转】MyEclipse使用总结——在MyEclipse中设置jsp页面为默认utf-8编码

原博文出自于:http://www.cnblogs.com/xdp-gacl/p/3496161.html        感谢! 在MyEclispe中创建Jsp页面,Jsp页面的默认编码是“ISO-8859-1”,如下图所示: 在这种编码下编写中文是没有办法保存Jsp页面的&#…

sum怎么用python_python sum()函数和.sum(axis=0)函数的使用

参考:《Machine Learning in Action》第二章#####################################################################sum函数:sum()函数是内建函数help(sum)函数功能:返回一个数字序列(非字符串)的和,并加上参数start的值(默认为…

08_JS工厂方法和构造函数

工厂方法和构造函数 工厂方法 工厂方法用来批量产生对象 function CreatCar(name,prase){// new 一个对象var obj new Object();obj.name name;obj.parse prase;obj.print function(){console.log(this.name " : " this.parse)};// 返回对象return obj; };va…

华为机试题【10】-求数字基root

题目描述: 求整数的Root:给定正整数,求每位数字之和;如果和不是一位数,则重复; 输入:输入任意一个或多个整数 输出:输出各位数字之和,直到和为个位数为止(输入异常,则返回-1),多行,每行对应一个输入数据的结果。 样例…

国内开源镜像站

搜狐开源镜像站:http://mirrors.sohu.com/ 网易开源镜像站:http://mirrors.163.com/开源中国:http://mirrors.oschina.net/首都在线科技股份有限公司:http://mirrors.yun-idc.com/阿里云开源镜像:http://mirrors.aliyu…

python update skeleton 不自动_python编程笔记(1)-数据类型

断断续续学了一些,但是后边一直没有使用,就又忘记了。为了缩短学习周期,这次学习的方法:先学主要框架(数据类型、条件、循环、函数、类、numpy、pandas、sklearn),后期直接看朋友code 实操了&am…

09_JS原型对象

原型对象 在构造函数中,同一类相同的方法可以直接写在构造函数里,但这样每实例化一个对象都会产生一个新的该方法,但其实这个方法都是一样的,这样会浪费大量空间,另外,可以将相同的方法写在构造函数外&…

[改善Java代码]非稳定排序推荐使用List

我们知道Set与List的最大区别就是Set中的元素不可以重复(这个重复指的equals方法的返回值相等),其他方面则没有太大的区别了,在Set的实现类中有一个比较常用的类需要了解一下:TreeSet,该类实现了类默认排序…

如何访问另一台电脑的共享文件夹_如何远程控制另一台电脑

在工作中,我们时常需要远程控制一下另一台电脑,如果这两台计算机在局域网内可以通过远程桌面轻松实现,如果这两台计算机不在局域网内则通常需要借助第三方软件来实现。远程桌面使用分三步:1、被控制端要开启远程桌面功能&#xff…

10_JS数组

JS 数组 以索引为键的对象&#xff0c;性能高于对象 创建 new Array() var arr Array() for(var i 0;i<5;i){arr[i] i; };var arr Array(1,2,3,4,5,6)数组字面量 var arr [2,3,4,5,6,7,8];不同&#xff1a;传入一个整数时&#xff0c;new把这个数当作数组长度&…

微软Hololens学院教程- Holograms 101: Introduction with Device【微软教程已经更新,本文是老版本】...

这是老版本的教程&#xff0c;为了不耽误大家的时间&#xff0c;请直接看原文&#xff0c;本文仅供参考哦&#xff01;原文链接&#xff1a;https://developer.microsoft.com/EN-US/WINDOWS/HOLOGRAPHIC/holograms_101 这篇文章将通过一个完整的实例来了解设备的核心特性&#…

python seaborn boxplot_python - 如何将文本框添加到Seaborn Boxplot? - 堆栈内存溢出

我试图在框图中插入一个文本框&#xff0c;但是出了点问题。 让我们先绘制箱线图&#xff1a;import pandas as pdimport matplotlib.pyplot as pltimport seaborn as sbdf_data pd.read_hdf(data.h5, keyfdf_data)##print(df_data)fig, (ax1, ax2) plt.subplots(1,2,gridspe…

JS_11正则表达式和字符串方法

正则表达式和字符串方法 正则表达式 创建正则对象 构造函数字面量 匹配模式 i&#xff1a;忽略大小写m&#xff1a;多行匹配g&#xff1a;全局匹配 正则语法 正则作用/a/检查是否有a/a|b/检查是否有a或b{}量词&#xff0c;如{1,3}匹配1到3次&#xff0c;{m,}匹配m次以上…

qtableview点击行将整行数据传过去_可以实时获取数据的Database Asset插件

前言&#xff1a;Goby之前开放的插件入口点较少&#xff0c;大家只能在扫描前、扫描后执行事件&#xff0c;无法参与扫描过程中来。为实现更多场景的应用及提高扫描效率&#xff08;如&#xff1a;后台爆破子域名等&#xff09;&#xff0c;Goby开放了一些新的API&#xff1a;事…

git 笔记

版本库1.repository在一个合适的地方&#xff0c;创建一个空目录$ mkdir learngit$ cd learngit$ pwd/User/leon/learngitpwd命令用于显示当前的目录&#xff0c;在我的电脑上&#xff0c;这个仓库位于/user/michael/learngit2.git init 将当前目录变成git 可以管理的仓库。$ g…

github 开源 代码 学习 集合(转载)

一个支持多种item类型的recycleView依赖注入库 1.通过注解的方式方便的把ViewHolder注入到recycleView中。 2.去除findViewByID等冗余操作。 3.去除编写adapter那些冗余逻辑&#xff0c;只需要编写proxy和holder即可快速的实现淘宝首页那样复杂的页面。https://github.com/s94…

JS_12 DOM

DOM 操作 HTML DOM Document Object Model&#xff0c;文档对象模型&#xff0c;用js操作文档对象 [外链图片转存失败(img-Dygj4uK9-1562680086020)(image/domtree.gif)] 节点&#xff1a;构成网页最基本的部分&#xff0c;网页的每一部分都是一个节点 文档节点&#xff1a;…