1.Jmeter在3.0以后就弃用了MongoDB Script
所以我选择编写自己的java请求进行mongoDB压测。
先贴上界面:
红色标出来的就是自己编写的java请求
2.编写java请求
建立一个maven工程,然后导入依赖
<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.li.demo</groupId>
<artifactId>com.li.demo.Mango</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>com.li.demo.Mango</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.mongodb/mongo-java-driver -->
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.11.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.jmeter/jmeter -->
<!-- https://mvnrepository.com/artifact/org.apache.jmeter/ApacheJMeter_mongodb -->
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_mongodb</artifactId>
<version>5.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<showWarnings>true</showWarnings>
</configuration>
</plugin>
<!-- 内置打包法 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<!-- 用这个maven打包插件 -->
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<!-- 默认值为true.注意这个属性,如果你用这个插件来deploy,或者发布到中央仓库,这个属性会缩减你的pom文件,会把你依赖的<dependency>干掉 -->
<createDependencyReducedPom>false</createDependencyReducedPom>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<!-- 这个是你的程序入口文件 -->
<mainClass>com.li.demo.com.li.demo.Mango.App</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
我这里引入了mongo-java-driver和ApacheJMeter_mongodb,然后还需要用到jmeter,这是因为要继承AbstractJavaSamplerClient,才可以成为jmeter可运行可识别的java请求。
这个jmeter2.2的jar包我通过maven导入不了,所以下载下来,外部引入。
继承AbstractJavaSamplerClient新建一个类,然后代码如下:
package com.li.demo.com.li.demo.Mango;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import org.bson.Document;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
public class MangoTest extends AbstractJavaSamplerClient {
public static void main(String[] args) {
System.out.println("hello world");
}
public SampleResult runTest(JavaSamplerContext arg0) {
// TODO Auto-generated method stub
System.out.println("开始执行!");
SampleResult sampleresult = new SampleResult();
sampleresult.sampleStart();
sampleresult.setSampleLabel("MongodbSampler" + Thread.currentThread().getId());
MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
MongoDatabase mongoDatabase = mongoClient.getDatabase("test");
System.out.println("成功");
MongoCollection<Document> collection = mongoDatabase.getCollection("test");
Document doc=new Document();
doc.put("sss1", 10);
collection.insertOne(doc);
/*if ( responseData!= "" || !responseData.equals("")) {
//设置响应数据为查询结果
sampleresult.setResponseData(responseData.getBytes());
}else {
sampleresult.setResponseData(("the return data is null !").getBytes());
} */
sampleresult.setSuccessful(true);
sampleresult.sampleEnd();
return sampleresult;
}
@Override
public Arguments getDefaultParameters() {
// TODO Auto-generated method stub
Arguments params=new Arguments();
params.addArgument("ip","127.0.0.1");
params.addArgument("port","27017");
params.addArgument("dbname","test");
params.addArgument("collection","test");
return params;
}
}
之所以新建一个main方法是之后要导出jar包的时候要导出成可执行的jar包,所以需要一个入口方法main。
runTest()是java请求的主要代码,里面是你的逻辑,可以是各种mangoDB的数据操作
getDefaultParameters()是设置输入参数。在runTest里可以用context.getParameter("参数名")获取到界面输入的参数
3.打包问题,因为引入了第三方jar包,打包是一个问题
右键项目,Export-》
选择Runnable JAR file
导出为:
一个jar包和依赖文件夹。一起放到jmeter的lib/ext下即可。
4.很坑很坑的java.lang.NoSuchMethodError: com.mongodb.MongoClient.getDatabase报错
结果是jmeter的lib下就有
而且是最高优先级,所以选择先加载了这个jar包,版本还很低。所以没有找到那个getDatabase方法!