使用Maven集成JMeter执行接口测试的详细步骤,以及多种异常的处理方式
1.创建Maven项目
1.1 创建Maven Project
首先,创建一个Maven Project,如下图:
然后选择好存储路径,再save即可,Maven项目就创建好了,如下图:
1.2 在项目中为JMeter添加运行所需资源文件
在Maven中运行JMeter,需要我们手动为项目路径下添加三种资源文件:
- 测试脚本文件(后缀为.jmx)。
- JMeter配置文件(后缀为.properties) 。在JMeter的包里都是.properties后缀的文件,它们用来为JMeter的配置进行更改。
- 测试结果模板文件(后缀为.xsl)。在JMeter的包里都是.xsl后缀的文件,它们是JMeter的测试结果的模板。
1.2.1 添加测试脚本文件(后缀为.jmx)
测试脚本文件是指你的测试用例脚本,我的脚本比较简单,仅用于演示,如下图:
然后在项目的src\test路径下,创建名为“jmeter”的文件夹,并把jmx脚本文件复制进去,如下图:
1.2.2 添加JMeter配置文件(后缀为.properties)
找到你下载的JMeter的安装包(如果没下,请去 https://jmeter.apache.org/download_jmeter.cgi 这里下载),在bin文件夹下,找到这些后缀为.properties的配置文件,如下图:
然后复制到Maven项目的jmeter文件夹下,如下图:
1.2.3 添加测试结果模板文件(后缀为.xsl)
在Maven项目的src\test路径下,再创建一个名为“resources”的文件夹,如下图:
再回到JMeter的安装包中,在extras文件夹下,找到jmeter-results-detail-report_21.xsl和jmeter-results-report_21.xsl这两个测试结果模板文件,然后复制到resources文件夹下,如下图:
1.3 在pom.xml中添加相关依赖
1.3.1 pom.xml
直接为Maven注入灵魂,如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.api.test</groupId>
<artifactId>JMeterToMavenDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--此路径用于存储JMeter的原生测试结果文件,比如csv或者jtl-->
<jmeter.result.jtl.dir>${project.build.directory}\jmeter\results</jmeter.result.jtl.dir>
<!--此路径用于存储由模板转换过来的详细的测试结果的html文件-->
<jmeter.result.html.dir>${project.build.directory}\jmeter\html_detail_report</jmeter.result.html.dir>
<!--此路径用于存储由模板转换过来的测试结果的html文件-->
<jmeter.result.html.dir1>${project.build.directory}\jmeter\html_report</jmeter.result.html.dir1>
<ReportName>TestReport</ReportName>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<!--核心插件,用于将Apache JMeter集成到Maven中-->
<groupId>com.lazerycode.jmeter</groupId>
<artifactId>jmeter-maven-plugin</artifactId>
<version>2.7.0</version>
<configuration>
<!--JMeter能够创建.jtl(XML格式)测试结果和csv测试结果。
默认情况下,此插件使用csv格式。这里需要将其切换为xml格式。-->
<resultsFileFormat>xml</resultsFileFormat>
<!--这里是否生成result report需要设置为false,否则运行时会出现“前言中不允许有内容”的报错。
因为若该项为true,无论你在.properties配置文件或者此pom文件中将结果文件的格式显示设置为xml,最后都只会生成csv的结果文件。
而csv的格式无法转换成我们最后要的html结果文件,就会报上述的错。-->
<generateReports>false</generateReports>
<!--忽略失败-->
<ignoreResultFailures>true</ignoreResultFailures>
<!--为结果文件添加时间戳-->
<testResultsTimestamp>true</testResultsTimestamp>
<!--指定日志级别-->
<overrideRootLogLevel>debug</overrideRootLogLevel>
<!--指定运行的jmeter脚本-->
<testFilesIncluded>接口自动化测试demo.jmx</testFilesIncluded>
<!--指定不需要运行的jmeter脚本-->
<testFilesExcluded>aaa.jmx</testFilesExcluded>
</configuration>
<executions>
<execution>
<id>jmeter-tests</id>
<goals>
<goal>jmeter</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<!--用于解析模板,并生成测试结果的html文件的插件-->
<groupId>org.codehaus.mojo</groupId>
<artifactId>xml-maven-plugin</artifactId>
<version>1.0.2</version>
<executions>
<execution>
<!--在Maven生命周期中,通过verify命令执行JMeter的测试-->
<phase>verify</phase>
<goals>
<goal>transform</goal>
</goals>
</execution>
</executions>
<configuration>
<transformationSets>
<transformationSet>
<!--保存JMeter原生测试结果文件(.jtl文件)的路径-->
<dir>${jmeter.result.jtl.dir}</dir>
<!--需要解析的模板-->
<stylesheet>src\test\resources\jmeter-results-detail-report_21.xsl</stylesheet>
<!--通过模板生成测试结果的html文件-->
<outputDir>${jmeter.result.html.dir}</outputDir>
<fileMappers>
<fileMapper implementation="org.codehaus.plexus.components.io.filemappers.FileExtensionMapper">
<targetExtension>html</targetExtension>
</fileMapper>
</fileMappers>
</transformationSet>
<transformationSet>
<!--保存JMeter原生测试结果文件(.jtl文件)的路径-->
<dir>${jmeter.result.jtl.dir}</dir>
<!--需要解析的模板-->
<stylesheet>src\test\resources\jmeter-results-report_21.xsl</stylesheet>
<!--通过模板生成测试结果的html文件-->
<outputDir>${jmeter.result.html.dir1}</outputDir>
<fileMappers>
<fileMapper implementation="org.codehaus.plexus.components.io.filemappers.FileExtensionMapper">
<targetExtension>html</targetExtension>
</fileMapper>
</fileMappers>
</transformationSet>
</transformationSets>
</configuration>
</plugin>
</plugins>
</build>
</project>
1.3.2 pom.xml中需要注意的问题
除了已经在pom.xml中标注出的注意事项之外,插件的版本也很重要,如下图:
各位读者在使用这些插件的时候,尽量使用最新版本的插件,因为Jmeter插件版本太低的话,会无法运行高版本的jmx脚本。而且如果插件之间的版本不匹配的话,还会产生各种各样蛋疼的抛错问题,这些我会在“3.常见问题”一章中专门进行讲述。
最新的插件或者依赖,可以去Maven的中央仓库搜索,地址为:https://mvnrepository.com/ 。如下图:
我写这些的目的是,教会大家如何去寻找最合适的插件或者依赖,授人以鱼不如授人以渔嘛,这样即使几十年几百年后还有人能看到我的博客,读者也不会因为复制了我这老古董的pom而翻车~
2.检查JMeter运行结果
执行Maven的Verify命令,就可以执行接口测试了(如果要重新执行,记得先执行clean命令,再verify),如下图:
测试结束后,项目路径下会生成target文件夹,在target\jmeter文件夹下,就是对应的测试报告、测试log等各种文件,如下图:
2.1 检查控制台结果
正常情况下,控制台运行日志是不会有任何抛错的,如下图:
2.2 检查jtl测试结果文件
jtl文件是JMeter原生的测试结果存储文件,在target\jmeter\results文件夹下,如下图:
可以使用JMeter的监听器打开查看,如下图:
2.3 检查html测试结果文件
html是转换过后的测试结果存储文件,在target\jmeter\html_detail_report文件夹下,如下图:
使用浏览器打开,如下图:
成功,没有问题。
3.常见问题
如果jmeter-maven-plugin或者xml-maven-plugin的版本不对,或者pom.xml的配置不对,则很容易出现一些非常蛋疼的问题,下面举例说明。
3.1 “Property ‘xxx’ is not recognized”
具体报错为:
编译器警告:
WARNING: ‘org.apache.xerces.jaxp.SAXParserImpl: Property ‘http://javax.xml.XMLConstants/property/accessExternalDTD’ is not recognized.’
如图:
这个问题的原因是jmeter-maven-plugin和xml-maven-plugin的版本太太太老啦,如果运行高版本JMeter写的脚本,就会出现这种属性无法识别的错误。
解决方法是按照我在上文中说的,去maven官网找到最新的版本号即可(我用的2.7.0和1.0.2,就没有这个问题了)。
3.2 “Failed to transform input file”
具体报错为:
[ERROR] Failed to execute goal org.codehaus.mojo:xml-maven-plugin:1.0-beta-3:transform (default) on project JMeterToMavenDemo: Failed to transform input file E:\workspace\Demo\JMeterToMavenDemo\target\jmeter\results\20190904-接口自动化测试demo.csv: javax.xml.transform.TransformerException: com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: Content is not allowed in prolog. -> [Help 1]
如图:
这个问题的原因是,JMeter运行完成后,生成结果文件是csv,而不是jtl,xml-maven-plugin插件无法解析csv,就会抛这个错。
解决方法为修改pom.xml,为jmeter-maven-plugin的插件添加resultFileFromat的设置,如下图:
3.3 “前言中不允许有内容”
具体报错为:
[INFO] Transforming file: E:\workspace\Demo\JMeterToMavenDemo\target\jmeter\results\20190904-接口自动化测试demo.csv
ERROR: ‘前言中不允许有内容。’
ERROR: ‘com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: 前言中不允许有内容。’
如图:
这个问题的原因也是由于生成结果文件是csv,而不是jtl所引起。不过我检查了下,pom.xml的resultFileFromat的设置明明就是xml啊,而且我还跑到jmeter.properties文件中特意设置了jmeter.save.saveservice.output_format=xml,但是都不生效,如下两图:
最后我一顿折腾,终于发现还需要给pom添加另一项设置,测试结果才能是jtl文件,如下图:
generateReport需要设置为false,因为若该项为true,无论你在.properties配置文件或者此pom文件中将结果文件的格式显示设置为xml,最后都只会生成csv的结果文件。