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

snake · 2015年05月18日 · 最后由 fanyanlong 回复于 2019年05月10日 · 16060 次阅读
本帖已被设为精华帖!

有人在我前面的帖子里面回复,可以用 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 还可以这么玩,之前一直用自带的图表来查看结果

@lihuazhang 补齐了。

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

snake #65 · 2015年05月20日 Author

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

64楼 已删除

之前也利用 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,继续跟进

已经搭建完毕

16楼 已删除

#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

33楼 已删除

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

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

已搭建,谢谢分享

34楼 已删除
39楼 已删除

#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 [该话题已被删除] 中提及了此贴 06月28日 13:54
xuxinhong [该话题已被删除] 中提及了此贴 07月01日 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

陈恒捷 [该话题已被删除] 中提及了此贴 08月21日 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 接口自动化 中提及了此贴 11月30日 09:02
xuxinhong 使用 Jmeter 做 Web 接口测试 中提及了此贴 12月08日 01:11
陈恒捷 接口测试的一些感悟 中提及了此贴 12月13日 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 里显示就可以了

69楼 已删除

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

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册