接口测试 [分享] 自动化测试与持续集成方案--Jmeter 测试接口及性能

snake · May 18, 2015 · Last by fanyanlong replied at May 10, 2019 · 17019 hits
本帖已被设为精华帖!

有人在我前面的帖子里面回复,可以用 Jmeter 来做接口测试. 稍微尝试了下,来给大家分享,完全是现学现卖,还请大家多多提意见。
Jmeter 这工具好用,又开源,我是看了一遍官方文档,将其捡起来的。
为了让文章具备完整性,以下有些文字是网络找的。

一、什么是接口测试?

  接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。
  接口测试适用于为其他系统提供服务的底层框架系统和中心服务系统,主要测试这些系统对外部提供的接口,验证其正确性和稳定性。接口测试同样适用于一个上层系统中的服务层接口,越往上层,其测试的难度越大。
  接口测试实施在多系统多平台的构架下,有着极为高效的成本收益比,接口测试天生为高复杂性的平台带来高效的缺陷监测和质量监督能力。平台越复杂,系统越庞大,接口测试的效果越明显。
  基于接口测试的重要性,以及它比较容易自动化的特性,通过持续集成的接口监控能够及时的发现项目中存在的问题,这对持续运营的项目来说,非常重要。

二、接口测试的流程

  1、 项目启动后,测试人员要尽早找到开发人员拿到接口测试文档
  2、 获取接口测试文档后,就可以进行接口用例的编写和调试
  3、 接口用例编写调试完成后,部署到持续集成的测试环境中,
  4、 设定脚本运行频率,告警方式等基本参数,进行接口的日常监控
  5、 每日进行接口脚本的维护更新,接口异常的处理

三、编写接口测试脚本

  大部分性能工具都可以用来进行接口测试,jmeter就是一个好用的性能测试工具,他也同样可以用来进行接口测试,jmeter比较适用于CGI、webservice、DB等类型的接口测试。下面以websevice api接口为例说明如何编写接口测试用例(本文侧重于接口测试平台的搭建,对于具体工具是使用只进行简单介绍,对于工具不了解的,可以自行百度):
以下是我弄的一个简单的脚本。

每个请求都加一个响应断言来判断是否达到期望。
如果用命令来执行,也很简单:
jmeter -n -t test.jmx -l test.jtl

四、接口持续集成

在这块卡了好久,主要是report展示。之前是不想再用其他工具(如:Ant, Maven ), 就想将jtl文件的报告展现出来,弄了很久没成功。最后还是向工具屈服,用的Ant来编译.
主要是配置build.xml
一个示例:

<?xml version="1.0" encoding="UTF-8"?>

<project name="ant-jmeter-test" default="all" basedir=".">
<tstamp>
<format property="time" pattern="yyyyMMddhhmm" />
</tstamp>
<!-- 需要改成自己本地的 Jmeter 目录-->
<property name="jmeter.home" value="F:\xxxxx\Jmeter" />
<!-- jmeter生成jtl格式的结果报告的路径-->
<property name="jmeter.result.jtl.dir" value="F:\xxxxx\resultLog\jtl" />
<!-- jmeter生成html格式的结果报告的路径-->
<property name="jmeter.result.html.dir" value="F:\xxxxx\resultLog\html" />
<!-- 生成的报告的前缀->
<property name="ReportName" value="TestReport" />
<property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/${ReportName}${time}.jtl" />
<property name="jmeter.result.htmlName" value="${jmeter.result.html.dir}/${ReportName}${time}.html" />

<target name="all">
<antcall target="test" />
<antcall target="report" />
</target>

<target name="test">
<taskdef name="jmeter" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask" />
<jmeter jmeterhome="${jmeter.home}" resultlog="${jmeter.result.jtlName}">
<!-- 声明要运行的脚本。"*.jmx"指包含此目录下的所有jmeter脚本-->
<testplans dir="D:\test_case_path" includes="*.jmx" />
</jmeter>
</target>

<target name="report">
<xslt in="${jmeter.result.jtlName}"
out="${jmeter.result.htmlName}"
style="${jmeter.home}/extras/jmeter-results-detail-report_21.xsl" />

<!-- 因为上面生成报告的时候,不会将相关的图片也一起拷贝至目标目录,所以,需要手动拷贝 -->
<copy todir="${jmeter.result.html.dir}">
<fileset dir="${jmeter.home}/extras">
<include name="collapse.png" />
<include name="expand.png" />
</fileset>
</copy>
</target>
</project>

Jenkins 上安装 “Publish performance test result report” ,“Publish HTML reports” 的插件,配置一下。
运行。
结果如下:

如果加上一些并发,负载等,就是性能测试报告了。
性能报告的曲线展示还没弄出来,有空再看看。

补上性能测试报告:

之前一直出了个错:

Performance: Recording JMeter reports '**/*.jtl'
Performance: no JMeter files matching '**/
*.jtl' have been found. Has the report generated?. Setting Build to FAILURE
Build step 'Publish Performance test result report' changed build result to FAILURE
Finished: FAILURE

导致结果出不来。后面在 Jmeter/bin 下将 jmeter.properties 中的:
jmeter.save.saveservice.output_format=csv
改成:
jmeter.save.saveservice.output_format=xml

结果就是这样的:

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 59 条回复 时间 点赞

高大上的jmeter测试报告

如果加上一些并发,负载等,就是性能测试报告了。
性能报告的曲线展示还没弄出来,有空再看看。

补齐了,才能加精! 不能马虎啊 @snake

为了实现接口自动化测试集成到jenkins中,无奈的选择了jmeter(jmeter搞自动化真正短板,入参动态生成、接口依赖、扩展方法,对于我这种pythoner来说还是很难的,可选参数的逻辑控制都难),就为了jenkins报告插件可以判断测试是否通过,以便控制依赖构建的运行。
请问各位,jenkins有没有方法通过自己的测试报告告知jenkins测试是否通过。(除了自己开发报告插件,个人技术能力不足)

学习了,原来jmeter还可以这么玩,之前一直用自带的图表来查看结果

snake #5 · May 20, 2015 作者

@lihuazhang 补齐了。

#5楼 @snake 好文!
能否建立一个合集贴,把你的 自动化测试与持续集成方案 系列都放进去,然后每个帖子的内容头部附上合集贴的链接?
这样能更方便其他人看到你的这个系列文章。

snake #7 · May 20, 2015 作者

@chenhengjie123 会的,应为没有太多的时间,所以有空的时候就会写一篇。等全部写完了,会有个总结的。

8Floor has been deleted

之前也利用jmeter做接口测试,实现方式与楼主大同小异,实际是多人编写维护脚本并上传svn,测试机执行时取脚本运行;另外定义了多个build.xml文件,用来根据需要执行不同集合的接口测试。报告是直接在邮件中展现,不同的测试集对应不同的测试报告。

我提供一个build.xml文件,我也是Jenkins+Jmeter+SVN实现接口测试,build.xml文件内容如下:
特别说明,里面用到的jar包自行下载并且替换路径

<?xml version="1.0" encoding="utf-8"?>













classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask"
classpathref="ant.jmeter.classpath" />






















jmeterhome="${jmeter-home}"
resultlogdir="${resultBase}/temp/${results.jtl}"
runremote="${runremote}"
resultlog="${jmx.filename}.jtl"
testplan="${jmxs.dir}/${jmx.filename}.jmx">




out="${resultBase}/temp/${results.html}/${jmx.filename}.html" classpathref="xslt.classpath"
style="${jmeter-home}/extras/jmeter-results-detail-report_21.xsl" >












Publish performance test result report” ,“Publish HTML reports” 怎么配置的。。。
我配置的JMeter Report files: E:\apps\jmeter\resultLog\jtl*.jtl

直接报错了,日志为:
Started by user anonymous
Building in workspace C:\Users\Administrator.jenkins\jobs\我的测试\workspace
[testCase] $ cmd.exe /C '"ant.bat -file build.xml && exit %%ERRORLEVEL%%"'
Buildfile: E:\apps\jmeter\testCase\build.xml

all:

test:
[jmeter] Executing test plan: E:\apps\jmeter\testCase\web.jmx ==> E:\apps\jmeter\resultLog\jtl\TestReport201506080830.jtl
[jmeter] Creating summariser


[jmeter] Created the tree successfully using E:\apps\jmeter\testCase\web.jmx
[jmeter] Starting the test @ Mon Jun 08 20:30:19 CST 2015 (1433766619320)
[jmeter] Waiting for possible shutdown message on port 4445
[jmeter] summary = 10 in 1.1s = 8.8/s Avg: 190 Min: 141 Max: 254 Err: 0 (0.00%)
[jmeter] Tidying up ... @ Mon Jun 08 20:30:20 CST 2015 (1433766620505)
[jmeter] ... end of run

report:
[xslt] Processing E:\apps\jmeter\resultLog\jtl\TestReport201506080830.jtl to E:\apps\jmeter\resultLog\html\TestReport201506080830.html
[xslt] Loading stylesheet D:\app\apache-jmeter-2.13\extras\jmeter-results-detail-report_21.xsl

BUILD SUCCESSFUL
Total time: 2 seconds
Performance: Percentage of errors greater or equal than 1% sets the build as unstable
Performance: Percentage of errors greater or equal than 2% sets the build as failure

Performance: Recording JMeter reports '/apps/jmeter/resultLog/jtl/*.jtl'
Performance: no JMeter files matching '
/apps/jmeter/resultLog/jtl/*.jtl' have been found. Has the report generated?. Setting Build to FAILURE
Build step 'Publish Performance test result report' changed build result to FAILURE
Finished: FAILURE
我确定我的jtl文件目录是没有错的

jmeter.save.saveservice.output_format=xml已经配置

终于解决了:
根据日志文件报错,发现工作目录为:Building in workspace C:\Users\Administrator.jenkins\jobs\我的测试\workspace

然而我的日志文件却在e盘,于是我构建了一个shell 命名,把e盘的日志文件收到复制到工作目录:
cd $WORKSPACE
cp -r E:/apps/jmeter/resultLog/* .

我的配置的JMeter Report files: */jtl/.jtl
解决了。如图:

但是还有有点问题就是默认列表进来显示的数据为空图片,要点击进去才能看到具体的某一个图片,自己再去想办法去解决:

问题已经解决,已经在官网说此处是bug,有人上传了一个安装包重新安装html插件就可以了

https://issues.jenkins-ci.org/browse/JENKINS-27100

发现一个问题,楼主应该也没有解决:
生成的报告没有min和max的time的时间,显示的为NaN,但是在执行命名过程中是可以看到max和min的时间。网上查到资料,好像是bug,继续跟进

已经搭建完毕

16Floor has been deleted

#3楼 @skwinleo jenkins有一个插件Text什么的,可以改变最终的构建结果

楼主那个报告中Max Min 为NaN解决了吗

楼主这套设计投入使用了么,效果如果?

看看这个taurus

#13楼 @284772894 我这里不能***,可以把重新安装html插件发我一下吗?邮箱:664514361@qq.com.谢谢

#18楼 @hellengo
直接在build.xml加入以下几行就解决了:
<!-- use this config to generate html report; if not, may not display Min/Max Time in html-->



文档我详细看了下,对于刚刚入门的人看,可能有点乱,有时间我来梳理一下吧,让大家都可以用起来。@snake 可好

恩,这个接口要用jmeter做持续集成无法用jenkins的performance plugin,只能用这种普通的显示方法,我也在这卡了半天

你好,想问一个问题,使用jmeter远程连接linux下的mysql时,老是提示说没有匹配的驱动,可我已经导入了相应的驱动了。你在这方面有做过吗

#22楼 @jxxgxldl
按你说的在build.xml加入以下几行就可以解决max&min time NaN的问题




实际操作下来,并没有解决,问题依旧存在。
多次尝试后发现,仅需要从Jmeter的lib包里把xalan-2.7.2.jar和serializer-2.7.2.jar copy到Ant的lib包里即可,不用修改build.xml

#12楼 @284772894 楼主 我也遇到这个问题 可是我按照你说的办法试了还是报相同的错 求解

com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: 前言中不允许有内
容。
org.xml.sax.SAXParseException; systemId: file:/D:/jmeter/apache-jmeter-2.13/test
path/html/TestReport201512241238.jtl; lineNumber: 1; columnNumber: 1; 前言中不允
许有内容。
还是报错- -

[xslt] Processing D:\jmeter\apache-jmeter-2.13\testpath\html\TestReport201512241249.jtl to D:\jmeter\apache-jmeter-2.13\testpath\jtl\TestReport201512241249.html
[xslt] Loading stylesheet D:\jmeter\apache-jmeter-2.13\extras\jmeter-results-detail-report_21.xsl
[xslt] : Error! 前言中不允许有内容。
[xslt] : Error! com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: 前言中不允许有内容。
[xslt] Failed to process D:\jmeter\apache-jmeter-2.13\testpath\html\TestReport201512241249.jtl

终于解决了,不知道为什么,改了 jmeter.properties没用,在build.xml中加了一句:



<!-- 声明要运行的脚本。".jmx"指包含此目录下的所有jmeter脚本-->
<testplans dir="D:\jmeter\apache-jmeter-2.13\testpath" includes="
.jmx" />


非常强大,学习了!

Very Good

33Floor has been deleted

请问 我搭建好了 也可以查看到报告 只是报告是没有格式的 类似于文本 但是下载下来单独打开是有格式的 请问怎么处理的

#34楼 @441385483 你可以通过jmeter的xls文件,将jtl文件格式化成html文件,如果你也是jmeter测试的话,然后通过tomcat虚拟目录,发布测试报告

已搭建,谢谢分享

38Floor has been deleted
39Floor has been deleted

#12楼 @284772894 请教下:
你操作的“根据日志文件报错,发现工作目录为:Building in workspace C:\Users\Administrator.jenkins\jobs\我的测试\workspace

然而我的日志文件却在e盘,于是我构建了一个shell 命名,把e盘的日志文件收到复制到工作目录:
cd $WORKSPACE
cp -r E:/apps/jmeter/resultLog/* .

我的配置的JMeter Report files: */jtl/.jtl

这个具体是要怎么配置的啊,我配了都没有,还是报错的
Performance: Recording JMeter reports 'C:\Users\Administrator.MICROSO-IIT688U.jenkins\jobs\weather\htmlreports\app登录\jtl11*.jtl'
Performance: no JMeter files matching 'C:\Users\Administrator.MICROSO-IIT688U.jenkins\jobs\weather\htmlreports\app登录\jtl11*.jtl' have been found. Has the report generated?. Setting Build to FAILURE
Build step 'Publish Performance test result report' changed build result to FAILURE
Finished: FAILURE

搞定,谢谢分享。PS:楼上同学,试试
In Manage Jenkins -> Configure System -> Shell, set the shell path as

C:\Windows\system32\cmd.exe

#9楼 @hobbs 你好 请你的测试报告在邮件中是以附件展示还是在邮件内容中显示,方便的话加个qq 281599519,麻烦了

请问一下,我在本地 通过命令行启动 ant, 命令行消息是 测试成功的,但是最终出来的html 报告不仅 是 min/max 显示 NAN, 连 tests 和 fails 的个数都是显示为0. success rate 显示的也是 nan。 这个有人遇到过吗? 该怎么解决?

test 和 fails 的个数都显示0 这个问题解决了。之前用的是jmeter 3.0的版本,现在改回2.7 版本就ok了。可能是因为 3.0 和 2.7 的 xsl 文件设置的问题。3.0 没有jmeter-results-detail-report_21 这个 xsl, 只有jmeter-results-detail-report.xsl , 2 者的设置区别还没有去对比。

。。。。我也是这个问题,3.0 没法解决吗

Believe [Topic was deleted] 中提及了此贴 28 Jun 13:54
xuxinhong [Topic was deleted] 中提及了此贴 01 Jul 17:28

#45楼 @pacerron 我用3.0版本也遇到报告显示不出来的问题了,查了一下,3.0自带jmeter-results-detail-report.xsl文件读取数据有问题,找其他同学给一个jmeter-results-detail-report_21.xsl就行。
具体对比如下:
jmeter-results-detail-report_21.xsl读取数据部分:

jmeter-results-detail-report.xsl读取数据部分

手动修改为上面格式也可以

#48楼 @jaychang1989 对的,谢谢,3.0的报告需要改点东西,现在也没时间搞这个 呵呵

#48楼 @jaychang1989 请教一个3.0的问题,在post的body中没法输入中文,请问是哪里的配置项的问题?

请教一下楼主,Jenkins是自动集成后是使用命令行方式调用JMeter吗?

#42楼 @caitianming 在jenkins中配置了一个项目用来跑回归,然后在邮件里边给了个链接,链接到jenkins项目workspace中的html测试报告文件

#50楼 @jiagd0105 已经解决:jmeter.properties,jsyntaxtextarea.font.family=Hack这行的注释去掉

楼主有没有完整的文档啊,能不能发一个给我呢,非常感谢了。1075213454

陈恒捷 [Topic was deleted] 中提及了此贴 21 Aug 01:50

您好,我在把jmeter放入maven project的时候遇到了一点问题,希望大家帮忙看看~~~
1 在eclipse下maven project 中 有一个自己实现的类XMLParser, 并引用了外部的类(XML的解析类dom4j)通过pom文件引入
2 将自己实现的类 export出来成JAR包其中包括pom信息
3 在Jmeter中建了一个项目,在其中的一些脚本中引用了刚才自己的实现类,并手动把相关的 jar包 放入jmeter/lib/ext下,测试,运行正常
4 创建maven project来build maven-jmeterproject 将JMX文件放到正确位置,并在pom文件中引入本地的jar包(内有自己实现的类)
5 build - 运行 - 直到 运行到 自己实现的类 call dom4j类 运行失败,说dom4j调不到
(而查看build 出的 target中 jmeter包下的ext 中有dom4j 及自己实现的类 )
log里面是这样的:2016/09/07 21:43:54 ERROR - jmeter.util.BeanShellInterpreter: Error invoking bsh method: eval org/dom4j/Element
2016/09/07 21:43:54 WARN - jmeter.extractor.BeanShellPostProcessor: Problem in BeanShell script org.apache.jorphan.util.JMeterException: Error invoking bsh method: eval org/dom4j/Element

我也遇到56楼类似的问题,在测试java接口时,自定义了一些测试类打包jar后,java request请求调用。在jmeter运行没有问题,但在jmeter-maven-plugin通过jmeter.properties/seach_paths或者pom中标签引入编译后,target/jmeter/li b/ext目录下并没有引入成功。请问通过jmeter-maven-plugin运行测试如何解决这个问题?

Believe [测试报告优化] Jenkins+JMeter 接口自动化 中提及了此贴 30 Nov 09:02

高大上

xuxinhong 使用 Jmeter 做 Web 接口测试 中提及了此贴 08 Dec 01:11
陈恒捷 接口测试的一些感悟 中提及了此贴 13 Dec 10:29

我有一个疑问,及时多个jmeter脚本跑完后,结果都在一个页面展示无法分开。另外为啥你的一个接口点击可以打开,会显示response结果呢?监听器不一样?

jenkins和jmeter在不同的主机怎么操作呢,而且jmeter是linux环境,jmeter是windows环境

你好,两个publish的插件是怎么装上去的,求解

jmeter -n -t test.jmx -l test.jtl
找不到这个命令啊,请问jmeter这个命令是在哪边的,在哪个目录执行,是一个脚本吗?多谢大神指教

lijinzhou2016 回复

在jmeter的bin目录运行

果冻 回复

这个应该是自3.0起优化了body data后默认的字体(consolas)不支持中文显示,解决方案,在jmeter.properties中查找jsyntaxtextarea.font.family,取消注释,使用hack字体即可(当然也可以换成支持的其他字符集)

用3.3版本,jmeter有美化报告,直接把报告整到jenkins里显示就可以了

69Floor has been deleted

大佬,我也用的这个方法,但是报错:TestReport201805100549.jtl 不存在 求解哇

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up