需求

在执行jmeter测试的时候,有时候限于系统的原因,无法实现mock操作,那么就需要人工操作的介入。例如:用户下单购买时微信支付的操作或佣金结算等需要执行后台的结算任务等。因此,jmeter脚本内可能需要分阶段运行预期的阶段。 尝试解决这个办法,就是允许命令行携带参数覆盖原本jmeter内部定义的用户自定义变量。

对于原生的jmeter 而言,相对简单。使用 -J 参数即可覆盖定义。 而使用jmeter的maven插件就相对曲折一点。

解决方案

pom.xml 配置

<?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.jxyx</groupId>
    <artifactId>jxyx-app-testing</artifactId>
    <version>1.0.1</version>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <java.version>1.8</java.version>
        <!-- 指定jmeter版本 -->
        <jmeter.version>5.4.3</jmeter.version>
        <!-- 指定jmeter-plugin版本 -->
        <jmeter-maven-plugin.version>3.6.1</jmeter-maven-plugin.version>
        <!-- 指定使用的mysql jdbc driver的版本 -->
        <mysql-driver.version>8.0.29</mysql-driver.version>
    </properties>
    <profiles>
        <profile>
            <!-- 定义测试环境 -->
            <id>test</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <testing.profile>test</testing.profile>
                <file_path>${project.basedir}</file_path>
                <!--
                用户佣金执行类型 execute 参数说明:
                    1=产生佣金的前提条件,jmeter用户购物下单;
                    1和2之间执行服务器端计算佣金并写入佣金的脚本;
                    2=jmeter检查预估佣金;
                    3=改变订单完成时间及状态以进行佣金结算;
                    3和4之间执行服务器端佣金结算脚本;
                    4=检查结算的金额
                  -->
                <!--suppress UnresolvedMavenProperty -->
                <user_commission.execute>${execute}</user_commission.execute>
            </properties>
        </profile>
        <profile>
            <!-- 定义预发环境 -->
            <id>pre</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <properties>
                <testing.profile>pre</testing.profile>
                <file_path>${project.basedir}</file_path>
                <!--
                用户佣金执行类型 execute 参数说明:
                    1=产生佣金的前提条件,jmeter用户购物下单;
                    1和2之间执行服务器端计算佣金并写入佣金的脚本;
                    2=jmeter检查预估佣金;
                    3=改变订单完成时间及状态以进行佣金结算;
                    3和4之间执行服务器端佣金结算脚本;
                    4=检查结算的金额
                  -->
                <!--suppress UnresolvedMavenProperty -->
                <user_commission.execute>${execute}</user_commission.execute>
            </properties>
        </profile>
    </profiles>
    <dependencies>
        <dependency>
            <groupId>org.apache.jmeter</groupId>
            <artifactId>ApacheJMeter_java</artifactId>
            <version>${jmeter.version}</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <!-- 命令行执行: mvn clean verify -->
                <!-- 文档及配置 https://github.com/jmeter-maven-plugin/jmeter-maven-plugin/wiki/ -->
                <groupId>com.lazerycode.jmeter</groupId>
                <artifactId>jmeter-maven-plugin</artifactId>
                <version>${jmeter-maven-plugin.version}</version>

                <configuration>
                    <!-- 使用特定的 jmeter 版本 -->
                    <jmeterVersion>${jmeter.version}</jmeterVersion>
                    <ignoreResultFailures>true</ignoreResultFailures>
                    <!-- 是否生成测试报告 -->
                    <generateReports>true</generateReports>
                    <!-- 错误数超过指定百分比后认为构建失败 -->
                    <errorRateThresholdInPercent>1</errorRateThresholdInPercent>
                    <customPropertiesFiles>
                        <!-- 指定要使用的自定义属性文件 -->
<!--                        <propertiesFile>src/test/resources/${testing.profile}.properties</propertiesFile>-->
                        <customPropertiesFile>src/test/resources/${testing.profile}.properties</customPropertiesFile>
                    </customPropertiesFiles>
                    <propertiesJMeter>
                        <log_level.jmeter>DEBUG</log_level.jmeter>
                        <!-- 定义自己的classpath加载路径 -->
                        <user.classpath>${project.basedir}/lib/jmeter-tools-${project.version}.jar</user.classpath>
                        <search_paths>${project.basedir}/lib</search_paths>
                        <plugin_dependency_paths>${project.basedir}/lib</plugin_dependency_paths>
                        <!--suppress UnresolvedMavenProperty -->
                    </propertiesJMeter>
                    <propertiesUser>
                        <!-- 用户定义的变量,相当于 jmeter 的 -J选项传递的变量及值 -->
                        <file_path>${project.basedir}</file_path>
                        <profile>${testing.profile}</profile>
                        <!--suppress UnresolvedMavenProperty -->
                        <db>${db}</db><!--                        <enable_report_listener>${reporting2}</enable_report_listener>-->
                        <execute>${user_commission.execute}</execute>
                    </propertiesUser>
                    <jmeterExtensions>
                        <!-- 此处定义的jar依赖,下载后将放置在jmeter/lib/ext文件夹下 -->
                        <artifact>mysql:mysql-connector-java:${mysql-driver.version}</artifact>
                    </jmeterExtensions>
                    <testPlanLibraries>
                        <!-- 此处定义的jar依赖,将从maven源下载后放到jmeter/lib下面 因此需要保证maven源有该artifact -->
<!--                        <artifact>mysql:mysql-connector-java:8.0.29</artifact> -->
                    </testPlanLibraries>
                    <testFilesIncluded>
                        <!-- 指定运行的jmeter脚本 可以使用通配符 例如: **/*.jmx 通过命令传递参数 -Djmx_file="**/test.jmx" 方式传递 -->
                        <!--suppress UnresolvedMavenProperty -->
                        <jMeterTestFile>${jmx_file}</jMeterTestFile>
                    </testFilesIncluded>
                </configuration>
                <executions>
                    <!-- Generate JMeter configuration -->
                    <execution>
                        <id>configuration</id>
                        <goals>
                            <goal>configure</goal>
                        </goals>
                    </execution>
                    <!-- Run JMeter tests -->
                    <execution>
                        <id>jmeter-tests</id>
                        <goals>
                            <goal>jmeter</goal>
                        </goals>
<!--                        <configuration>-->
<!--                            <selectedConfiguration>configuration</selectedConfiguration>-->
<!--                        </configuration>-->
                    </execution>
                    <!-- Fail build on errors in test -->
                    <execution>
                        <id>jmeter-check-results</id>
                        <goals>
                            <goal>results</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

要点

  • jmeter内定义用户自定义变量 execute=${__P(execute,1)}
  • pom.xml profile内定义<user_commission.execute>${execute}</user_commission.execute>
  • pom.xml 的jmeter插件配置 propertiesUser节点的参数<execute>${user_commission.execute}</execute>
  • 运行打开GUI命令行:mvn clean jmeter:configure jmeter:gui -Ptest -DguiTestFile=demo.jmx -Dexecute=2
  • 直接运行测试命令行:mvn clean jmeter:configure verify -Ptest -Djmx_file="**/demo.jmx" -Dexecute=2