对于如何使用Jmeter测试http接口,大家都已经比较熟悉,网上相关的知识也很多。但随着微服务越来越流行,仅仅会测试http接口已经远远不够。Dubbo作为当下非常流行的RPC接口,学习如何测试Dubbo接口已经成为了测试人员进阶的必备知识之一。
对于Dubbo接口的测试,可以通过编写代码的方式、使用工具的方式,今天我们先讲如何通过Jmeter Dubbo插件来测试Dubbo接口。
插件下载地址:https://github.com/thubbo/jmeter-plugins-for-apache-dubbo/releases
下载jmeter-plugins-dubbo-2.7.8-jar-with-dependencies.jar版本,此包中已含必要的依赖,推荐使用with-dependencies.jar包,下载后放到JMeter安装目录中的lib/ext路径下。
使用的Jmeter的版本:5.4.3
插一句:如何修改Jmeter背景色为白色,我是真的用不习惯黑色的那个背景:

开发环境ZK地址:
zookeeper://devzk1.xx.com:2181?backup=devzk2.xx.com:2181,devzk3.xx.com:2181
dubbo直连服务器, 服务器:
xx.xx.xx.xx:20880 , 20880是dubbo的服务端口
dubbo接口:com.xxxx.test.sdk.api.DubboServiceTestYY
方法名:yyTestDubbo
入参类型:自定义的POJO对象:com.xxxx.test.sdk.para.Param
参数值:{“name”:“test”,“age”:1,“address”:“中国”}
取样器选择Dubbo Sampler,直连的方式配置:

1、 Registry Center(注册设置) 区域填写内容:
由于是用直连的方式,所以Protocol选none。Address填写直连服务器的信息:xx.xx.xx.xx:20880
2、Consumer&Service Settings(消费者和服务者设置):
Timeout:设置请求接口超时时间,默认1000ms, 就用默认的就行,如果实际接口响应比较慢,也可以改大点,比如改成5000
Version:版本,一般无需填写。Dubbo不同版本之间差异较大,不同版本之间不能互相调用。注意:默认这里填的是1.0,现在dubbo的版本都是2.xx了,因此直接删掉版本号,就让这里为空,不然用默认的1.0会调不通。最开始我没有管这个值,结果发现调不通,删了version的值就成功调通了。
后面其他的几项值都不管,保持默认就行。
3、Get Provider List按钮:
根据Address填写的地址,获取服务提供者的服务列表。直连的方式下,点这个按钮没用,会提示让你把Protocol选为zookeepr or nacos or redis, 但是直连的时候Protocol要选none, 所以直连的时候就手动在下面去填interface和method,不用 Get Provider List按钮来获取。
4、 Interface 填 dubbo的接口:
com.xxxx.test.sdk.api.DubboServiceTestYY
Method填方法名:yyTestDubbo
5、 Args:接口入参,输入对应的参数类型和参数值
paramType:参数支持任何类型,可以直接使用java.lang下的包装类,如:int、float、shot、double、long、byte、boolean、char、String等。类型也可以是自定义对象POJO,需使用类的完全名称。我们这里接口是要用自定义对象: com.xxxx.test.sdk.para.Param。
paramValue:填写需要的参数值,例如:int为1,boolean为true等,自定义类与List或者Map等使用Json格式数据。我们这里接口是要用Json格式数据:{“name”:“test”,“age”:1,“address”:“中国”}
注意:有个小坑,paramValue填完值之后,如果马上填运行按钮调接口,会发现paramValue值消失了,没保存上。所以要再点一下增加按钮添加一行空白行,再删掉这行空白行,这样就保存上了。
执行接口调用,调用成功:



1、 Registry Center(注册设置) 区域填写内容:
由于是用ZK的方式,所以Protocol选zookeeper。Address填写直连服务器的信息:zookeeper://devzk1.xx.com:2181?backup=devzk2.xx.com:2181,devzk3.xx.com:2181
其他项填写,和直连的方式一样。
注意:实际测试中发现即使是用的ZK的方式,Get Provider List按钮也获取不到服务提供者的服务列表,点击之后会先出现提示信息:

意思是:获取所有提供者的服务列表,可能会导致 JMeter 停止响应几秒钟。 你要继续吗?
点击是,理论上正常的话会停顿一会儿,然后弹窗提示获取提供者列表成功!

如果10秒中都没有出现如上弹框,证明列表获取失败,可能是zookeeper地址填写错误,也可以能是服务有问题了。
而此时JMeter界面是卡死状态,需要强制关闭掉JMeter,因为等再长时间也没有意义了。
而实际测试的时候,发现我的ZK是对的,服务器也是正常运行的,也没有出现弹窗,Jmeter也会卡死。因此建议还是直接在下面手动输入Interface和Method吧。
执行接口调用,调用成功:



=========================================================================================================
以上就是本次的全部内容,如果对你有帮助,欢迎关注我的微信公众号:程序员杨叔,各类文章都会第一时间在上面发布,持续分享全栈测试知识干货,你的支持就是作者更新最大的动力~

很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel