远程执行,就是脚本放在本地,执行却在另一台电脑上执行,当然,可以是远程多台电脑一起执行。最常见的场景就是,跑性能测试的时候,一台电脑负载不起需要的线程时,就需要两台或者更多的电脑来启动线程跑测试,线程就相当于是虚拟用户。在网上,通常会说,超过1000个线程时,就不要使用一台电脑跑了,而是选择使用多台电脑一起负载。这个说法并不全对,比如,脚本就写一条insert语句,往数据库中插入数据,启20个线程跑,估计你的电脑CPU使用率就要100%了。所以,最终还是要看电脑承受得住否,而不是看多少个线程,不同的测试脚本,对测试机的压力不一样。很多时候,做性能测试的时候,为了模拟真实的用户操作,都会加等待时间。比如用户登录功能,用户在输入用户名和密码的时候,这个时候,服务器就是在等待,所以脚本在这里就会加一个等待时间,好像有点跑题了。
为了演示远程执行,开启一个虚拟机,然后把jmeter的压缩包传到linux里面。
点开始上传,jmeter包就会传到linux上去。然后使用命令:unzip apache-jmeter-3.1.zip,解压
因为我们一会做远程演示的脚本会用到JDBC,所以要把JDBC的驱动,放到linux上jmeter目录下的lib目录下去,当然,如果脚本使用了参数文件,参数文件也要传到远程机上。由于linux和windows的目录结构不一样,在脚本中,配置参数文件的路径时,就只能用相对路径了。相对路径可以以脚本为参照,也可以以jmeter程序为参照(bin目录下的jmeter)。但是远程执行,脚本是放在本机,远程机上没有脚本,所以只能以jmeter程序为参照
点开始上传,这样,第一步准备就做好了,接下来就是更改linux上jmeter的配置文件,先cd进入bin目录,再使用命令:vi jmeter.properties,进入编辑页面
然后输入/localport,回车,查询localport关键词
这个时候就光标停留在client.rmi.localport这一行,再次输入/localport,回车,查找下一个
然后就来到server.rmi.localport=4000这一行,按i进入插入模式,把这一行的注释去掉,也就是把前面的#号删了,再把端口号改为1099,这是默认的监听端口,当然,你要改成其它的端口也可以。
按ESC,再输入":qw",回车,保存退出
接下来就是启动远程客户端了
命令:./jmeter-server
可以看到服务器的端口为1099,但服务没有启动成功,下面提示不能启动,localhost.localdomain是一个回路地址,也就是不能用127.0.0.1作为启动地址。需要用本机的对外地址,于是使用命令:ifconfig查看ip地址。
使用vi jmeter-server命令编辑文件,然后按shift+g,让光标定位到最后一行
要修改的就是上面这一行,把注释去掉,后面的xxx...改成本机的ip地址
保存,退出,再启动服务
这样,远程客户端就启动成功了。接下来就要配置windows的jmeter了
进入jmeter的bin目录下,用编辑器打开jmeter.properties,我这里用的编辑器是EditPlus,按Ctrl+f查询hosts
在查找的下面一点,remote_hosts=127.0.0.1,这行,就是我们要修改的,把ip地址改成linux的ip地址,当然,如果在linux上你改的端口不是1099,那么还要加上端口号,如果要控制的远程机有多台,用英文逗号隔开
保存更改后的配置文件,然后启动jmeter,在运行——远程启动中,可以看到远程linux的ip地址
再接下来,就是编写脚本,这里使用JDBC教程里的数据库和表,往商品表中插入一条数据,因为现在要远程执行,所以连接池配置里,数据库的地址就不能用localhost了,要用自己电脑的ip地址,可以使用ipconfig查看本机电脑的ip地址
为了证明是linux执行了sql语句,我们打开navicat工具,执行命令:SHOW PROCESSLIST
我们在Host一列,可以看到有哪些主机连接着mysql,可以看到,现在只有localhost,现在我们在Jmeter里远程执行脚本,如果在Host列里出现了192.168.52.130,就代表是linux执行了脚本,点运行——远程运行,再选中linux的ip地址,当然也可以在运行里选择远程全部启动,或是工具栏里两个三角形的图标,也是远程全部启动
然后,发现jmeter会卡一会,那是因为jmeter在拼命的连接linux,但是它使出了吃奶的力气,还是没连上。然后就弹个窗,说连接超时
为什么呢,好吧,查找原因。。。我们先在主机上,ping一下linux
可以ping通,那么端口呢,telnet 192.168.52.130 1099
太不给面子了,竟然说telnet不是内部命令。嘛哩嘛哩轰,看我怎么把它变成内部命令。。。打开控制面板
点击程序和功能
点击左边的打开或关闭Windows功能,稍等...稍等...
将这两个勾上。点确定,然后在控制台telnet 192.168.52.130 1099
可以看到,不能连接到这个端口,其实,我在讲telnet,就应该知道是端口不通的问题,我只是顺带把telnet介绍一下。接下来,就是要到Linux里去开放1099端口,可以在原先的连接窗口按Ctrl+c停止掉启动的远程客户端,然后用命令开放端口,也可以双击SecureCRT程序再开启一个连接窗口改。这里,我就再开启一个连接窗口改,命令:firewall-cmd --zone=public --add-port=1099/tcp --permanent,然后再使用命令:firewall-cmd --reload使更改生效
好了,好了,再次执行脚本
可以看到脚本执行成功了,同时,在linux里面,也看到有内容输出了
然后,到navicat里去看下,好吧,没有看到有linux的主机。因为脚本一下子就执行完了,我们让线程组循环10次,每次添加商品都等待1秒
再次运行脚本,然后去navicat里去看,要快哟。。。
然后就会看到一个长这样的东西。这是啥吖,好吧,我也不认识。我们来个绝一点的,把本机的hostname和ip地址,当作商品的名称和图片地址,插入到数据库中去,jmeter中打开函数助手对话框,machineName是获取本机的hostname,machineIP是获取本机的ip地址。
然后,远程执行脚本
id是27的是本地执行的数据,呃,这个不认识的东西,竟然是我物理机的hostname,ip地址是我物理机的本地连接的ip地址。id是28的是远程执行的数据,hostname就是linux的hostname,这ip地址。。。无fack说。无论是本地执行,还是远程执行,ip地址都不是我们想要的,因为两台电脑都不是只有一张网卡,所以就会出现这样的情况,在上面我们查看linux的ip地址的时候,我们查出来的是有两部分,前面我们只关注了上面的部分,ip地址是192.168.52.130,下面部分显示的ip地址是127.0.0.1,而jmeter取的是下面的这个ip地址,所以就出现了ip地址是127.0.0.1的结果。我的策略应该也有问题,应该再建一个虚拟机,把数据库放到新建的虚拟机中去,然后让脚本去操作这个数据库,这个还是大家自己去尝试一下吧,看看结果会是什么 。
最后,远程执行脚本,察看结果树里,响应数据都是空的。这个时候,要想判断响应的结果是对还是不对,就不能通过看响应数据来判断了,只能添加断言来判断。再有就是远程控制多台电脑跑脚本,那么每台电脑上跑的都是一样的脚本,怎么理解这句话呢,比如脚本是起20个线程。控制两台电脑跑脚本,那么两台电脑都是20个线程,加起来就是40个线程。
欢迎加入测试群:91425817,一起讨论测试的那此事。