我们在上一篇java自动化脚本中用到了HttpurlConnection的网络请求方式,这里我们用得失okhttp网络请求方式编写我们的脚本
附上代码:(代码里面的注释很详细,自己看看就懂了)
本文主要介绍登陆和上传图片用okhttp编写Java测试脚本
首先我们需要导包lib(包里面我们放了七个包)
自己看吧,在哪里呢Jmeter lib里面找找看,可能有,哈哈哈,实在没有的下载吧
我们继续util包Jdurl.java
package com.yuliguo.util; public class Jdurl { //服务器基类 public static final String JD_SERVER="http://39.107.102.34:8080/jd/"; //登录 public static final String JD_LOGIN="login"; //发送图片的url public static final String JD_SEND="send"; }
util包MD5util.java(数据库密码有加密的加上没有,不用)
package com.yuliguo.util; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5util { public static String getPwd(String pwd) { try { // 创建加密对象 MessageDigest digest = MessageDigest.getInstance("md5"); // 调用加密对象的方法,加密的动作已经完成 byte[] bs = digest.digest(pwd.getBytes()); // 接下来,我们要对加密后的结果,进行优化,按照mysql的优化思路走 // mysql的优化思路: // 第一步,将数据全部转换成正数: String hexString = ""; for (byte b : bs) { // 第一步,将数据全部转换成正数: // 解释:为什么采用b&255 /* * b:它本来是一个byte类型的数据(1个字节) 255:是一个int类型的数据(4个字节) * byte类型的数据与int类型的数据进行运算,会自动类型提升为int类型 eg: b: 1001 1100(原始数据) 35 * 运算时: b: 0000 0000 0000 0000 0000 0000 1001 1100 255: 0000 36 * 0000 0000 0000 0000 0000 1111 1111 结果:0000 0000 0000 0000 37 * 0000 0000 1001 1100 此时的temp是一个int类型的整数 3 */ int temp = b & 255; // 第二步,将所有的数据转换成16进制的形式 // 注意:转换的时候注意if正数>=0&&<16,那么如果使用Integer.toHexString(),可能会造成缺少位数 // 因此,需要对temp进行判断 if (temp < 16 && temp >= 0) { // 手动补上一个“0” hexString = hexString + "0" + Integer.toHexString(temp); } else { hexString = hexString + Integer.toHexString(temp); } } return hexString; } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } return ""; } }
entity包Login.java
package com.yuliguo.entity; public class Login { public int statue; public String message; public int userId; public String tpken; public String username; }
entity包Send.java
package com.yuliguo.entity; public class Send { public int statue; public String message; }
jdlogin包JDLogin.java
package com.yuliguo.jdlogin; import com.google.gson.Gson; import com.yuliguo.entity.Login; import com.yuliguo.util.Jdurl; import com.yuliguo.util.MD5util; import okhttp3.*; 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 java.io.IOException; public class JdLogin extends AbstractJavaSamplerClient{ //声明成员变量 public SampleResult sampleResult; //返回给jmeter界面参数的方法 @Override public Arguments getDefaultParameters() { //实例化Arguments= Arguments arguments=new Arguments(); //往里面加入参数 arguments.addArgument("username","zhangsan1"); arguments.addArgument("password","123456"); return arguments; } @Override public void setupTest(JavaSamplerContext context) { super.setupTest(context); //实例化 sampleResult=new SampleResult(); } @Override public SampleResult runTest(JavaSamplerContext javaSamplerContext) { //获取参数 String name=javaSamplerContext.getParameter("username"); String pwd=javaSamplerContext.getParameter("password"); //对密码进行MD5机密 // String md5_pwd= MD5util.getPwd(pwd); //开始统计我们的响应时间 sampleResult.sampleStart(); //实例化okhttpClient OkHttpClient okHttpClient=new OkHttpClient(); //设置body 提交参数 RequestBody body=new FormBody.Builder().add("username",name) .add("password",pwd).build(); //将body设置到request Request request=new Request.Builder() .url(Jdurl.JD_SERVER+Jdurl.JD_LOGIN).post(body).build(); //下面会执行观察者模式,也就是接口回调,发送数据给服务器 Call call=okHttpClient.newCall(request); //创建观察者模式返回数据,也就是常说的接口回调 call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { //当网络请求成功以后,获取内容进行解析 String json=response.body().string(); System.out.println(json); //进行json解析 //实例化gson Gson gson=new Gson(); Login login=gson.fromJson(json,Login.class); //获取状态 int statue=login.statue; System.out.println("statue="+statue); //返回结果给察看结果树 sampleResult.setResponseData(json,"UTF-8"); //设置返回数据类型 sampleResult.setDataType(SampleResult.TEXT); //判断 switch (statue){ case 0: sampleResult.setSuccessful(true); sampleResult.setResponseCodeOK(); break; case 1: sampleResult.setSuccessful(false); break; } } }); //结束统计响应的时间 sampleResult.sampleEnd(); return sampleResult; } @Override public void teardownTest(JavaSamplerContext context) { super.teardownTest(context); } public static void main(String[] args){ Arguments params = new Arguments(); params.addArgument("username", "zhangsan1");//设置参数,并赋予默认值1 params.addArgument("password", "123456");//设置参数,并赋予默认值2 JavaSamplerContext arg0 = new JavaSamplerContext(params); JdLogin test = new JdLogin(); test.setupTest(arg0); test.runTest(arg0); test.teardownTest(arg0); } }
jdlogin包SendImage.java(注意:我们在最后打的注释我是想在控制台先打印一下看是否ok,然后我们token值会因为我们每次登陆而发生改变)
package com.yuliguo.jdlogin; import com.google.gson.Gson; import com.yuliguo.entity.Send; import com.yuliguo.util.Jdurl; import okhttp3.*; 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 java.io.File; import java.io.IOException; public class SendImage extends AbstractJavaSamplerClient { //实例化对象 public SampleResult sampleResult; //获取Jmeter界面值得方法 @Override public Arguments getDefaultParameters() { //实例化对象 Arguments arguments=new Arguments(); arguments.addArgument("userId",""); arguments.addArgument("token",""); arguments.addArgument("image",""); arguments.addArgument("image1",""); arguments.addArgument("image2",""); return arguments; } //初始化对象 @Override public void setupTest(JavaSamplerContext context) { super.setupTest(context); //实例化对象 sampleResult=new SampleResult(); } //运行测试用例的方法 @Override public SampleResult runTest(JavaSamplerContext javaSamplerContext) { //写脚本步骤 //1.继承AbstractJavaSamplerClient,重写4个方法 //2.在getDefaultParameters指定jmerter界面需要添加的值 //3.声明成员变量SampleResult //4.在setupTest里面实例化 SampleResult对象 //5.在runTest里面返回sampleResult //6.在runTest获取jemter里面输入值 //7.在runtest里面统计开始的时间和结束的时间 通过sampleResult.sampleStart()开始 //sampleResult.sampleEnd()结束,一般在网络请求之前开始,在网络请求之后结束 //8.在runTest实例化okhttpClient String userId = javaSamplerContext.getParameter("userId"); String token = javaSamplerContext.getParameter("token"); String image = javaSamplerContext.getParameter("image"); String image1 = javaSamplerContext.getParameter("image1"); String image2 = javaSamplerContext.getParameter("image2"); //开始统计时间 sampleResult.sampleStart(); //实例化okhttpclient OkHttpClient client = new OkHttpClient(); //文字提交的 content-type : application/x-www-form-urlencode //图片提交 content-type: multipart/form-data okhttp这个框架支持键可以重复使用 //实例化file File file1 = new File(image1); File file2 = new File(image2); //实例化 RequestBody body = new MultipartBody.Builder() .addFormDataPart("username", userId) .addFormDataPart("token", token) .addFormDataPart("image", image) .addFormDataPart("image", file1.getName(), RequestBody.create(MediaType.parse("image/jpg"), new File(image1))) .addFormDataPart("image", file2.getName(), RequestBody.create(MediaType.parse("image/jpg"), new File(image1))) .build(); //将body加入到请求里面 Request request = new Request.Builder() .post(body) .url(Jdurl.JD_SERVER + Jdurl.JD_SEND) .build(); //发送请求 Call call = client.newCall(request); //观察者模式 call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { //返回给查看结果数 String result = response.body().string(); System.out.println(result); //进行解析 Gson gson = new Gson(); Send send = gson.fromJson(result, Send.class); //获取statue int statue = send.statue; System.out.println(statue); //判断设置成功还是失败 sampleResult.setResponseData(result, "UTF-8"); switch (statue) { case 0: sampleResult.setSuccessful(true); break; case 1: sampleResult.setSuccessful(false); break; } } }); //结束统计时间 sampleResult.sampleEnd(); //如果这里不返回数据,查看结果数是看不到的,聚合报告统计时间也看不到 return sampleResult; } //测试用例结束的时候 // @Override // public void teardownTest(JavaSamplerContext context) { // super.teardownTest(context); // } // public static void main(String[] args) { // // write your code here // // Arguments params = new Arguments(); // // params.addArgument("userId", "2");//设置参数,并赋予默认值1 // params.addArgument("token", "a998989fd3a5bd5d4b25f08fa3d1f6ef");//设置参数,并赋予默认值2 // params.addArgument("image", "世界在我脚下");//设置参数,并赋予默认值2 // params.addArgument("image1", "/Users/yuliguo/Desktop/a.jpg");//设置参数,并赋予默认值2 // params.addArgument("image2", "/Users/yuliguo/Desktop/b.jpg");//设置参数,并赋予默认值2 // // JavaSamplerContext arg0 = new JavaSamplerContext(params); // // // SendImage test = new SendImage(); // // test.setupTest(arg0); // // test.runTest(arg0); // // test.teardownTest(arg0); // } }
然后呢?我们该进行打包操作了,然后将打包好的文件放到ext文件里面。
注意:这里跟上一篇有点区别,我们多加了如图的后三个(ext里面哈)
到这里我们就可以启动我们的Jmeter了,不多说了。
补充:
上图的807行注释去掉,因为可能会影响Jmeter的数据返回,就到这里。。。