当前位置: 首页 > news >正文

java -jar 未响应_简单易学的测试攻略:JMeter测试Java请求示例

8a4188c459fd5f1e4ea1f04d7594ef6a.png

JMeter是Apache组织的开放源代码项目,它是功能和性能测试的工具,100%的用java实现,大家可以到官网下载源代码和查看相关文档。

关于使用JMeter进行JDBC数据库测试、HTTP请求接口测试、结合Badboy录制功能进行网站性能测试等内容,网上的资料比较丰富,这里就暂时不做介绍了。更实用和灵活的场景,是实用我们自己编写的jar包进行测试,这也就是“Java请求”方式的测试。这里主要记录一下我在学习这种测试方式时遇到的一些问题,和总体流程,算作一个记录和小总结。

17bed7426a73d392a8fcef9662afee73.png

一、核心步骤

1.创建一个Java工程;

在eclipse里面新建一个工程:JavaForJMeter

2.将JMeter的lib目录下的jar文件添加进此工程的Build Path;

ApacheJMeter_core.jar(必须)、ApacheJMeter_java.jar(必须)、avalon-framework-4.1.4.jar、jorphan.jar、logkit-2.0.jar,后台3个为本地调试需要用到的包文件。

  1. 创建一个类并实现JavaSamplerClient接口或继承AbstractJavaSamplerClient,并重写;

构建待测试类,添加类Hello,代码如下:

package com.test.webservice;

public class Hello {

public String sayHello()

{

return "Hello";

}

public String sayHelloToPerson(String s)

{

if(s == null || s.equals(""))

s = "nobody";

return (new StringBuilder()).append("Hello ").append(s).toString();

}

public int sum(int a,int b)

{

return a+b;

}

}

public Arguments getDefaultParameters();设置可用参数及的默认值;
public void setupTest(JavaSamplerContext arg0):每个线程测试前执行一次,做一些初始化工作;
public SampleResult runTest(JavaSamplerContext arg0):开始测试,从arg0参数可以获得参数值;
public void teardownTest(JavaSamplerContext arg0):测试结束时调用;

添加类perftest,并继承AbstractJavaSamplerClient,并添加代码如下:

package com.test.webservice;

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 com.test.webservice.Hello;

public class perftest extends AbstractJavaSamplerClient {

private String a;

private String b;

/** Holds the result data (shown as Response Data in the Tree display). */

private String resultData;

// 这个方法是用来自定义java方法入参的。

// params.addArgument("num1","");表示入参名字叫num1,默认值为空。

//设置可用参数及的默认值;

public Arguments getDefaultParameters() {

Arguments params = new Arguments();

params.addArgument("num1", "");

params.addArgument("num2", "");

return params;

}

//每个线程测试前执行一次,做一些初始化工作;

public void setupTest(JavaSamplerContext arg0) {

}

//开始测试,从arg0参数可以获得参数值;

public SampleResult runTest(JavaSamplerContext arg0) {

a = arg0.getParameter("num1");

b = arg0.getParameter("num2");

SampleResult sr = new SampleResult();

     sr.setSampleLabel( "Java请求哦");

try {

sr.sampleStart();// jmeter 开始统计响应时间标记

Hello test = new Hello();

// 通过下面的操作就可以将被测方法的响应输出到Jmeter的察看结果树中的响应数据里面了。

resultData = String.valueOf(test.sum(Integer.parseInt(a), Integer

.parseInt(b)));

if (resultData != null && resultData.length() > 0) {

sr.setResponseData("结果是:"+resultData, null);

sr.setDataType(SampleResult.TEXT);

}

// System.out.println(resultData);

sr.setSuccessful(true);

} catch (Throwable e) {

sr.setSuccessful(false);

e.printStackTrace();

} finally {

sr.sampleEnd();// jmeter 结束统计响应时间标记

}

return sr;

}

//测试结束时调用;

public void teardownTest(JavaSamplerContext arg0) {

// System.out.println(end);

// System.out.println("The cost is"+(end-start)/1000);

}

// main只是为了调试用,最后打jar包的时候注释掉。

/*

public static void main(String[] args)

{ // TODO Auto-generated method stub

Arguments params = new Arguments();

params.addArgument("num1", "1");//设置参数,并赋予默认值1

params.addArgument("num2", "2");//设置参数,并赋予默认值2

JavaSamplerContext arg0 = new JavaSamplerContext(params);

perftestbbb test = new perftestbbb();

test.setupTest(arg0);

test.runTest(arg0);

test.teardownTest(arg0);

}

*/

}

4.Export为Runnable Jar File:Hello.jar

5.将此Hello.jar包放入JMETER_HOMElibext目录;

6.以管理员身份打开JMeter;

7.创建线程组、Java Request、查看结果树,进行测试;

105ba0a1d0b7efd79571d709ea0cc0b7.png

84d17f8b9c84a37bb8fc8986c7e59619.png

总结:

这里有两点需要注意:

1. 如果你的jar依赖了其他第三方jar,需要将其一起放到lib/ext下,否则会出现ClassNotFound错误,这个问题也是困扰了我好久;

2. 如果在将jar放入lib/ext后,你还是无法找到你编写的类,且此时你是开着JMeter的,则需要重启一下JMeter。

以上就是使用JMeter的Java请求方式进行一个测试计划构建的全过程了,都是比较基础的方法,如果需要什么额外的功能还可以慢慢学习。虽然自己也有写多线程并发的客户端测试代码,并自己收集response time等,计算TPS,但显然使用JMeter的方式更加方便,因为你只需要按照单线程的方式去实现你的测试业务,也无需添加各种埋点收集数据。

综上,感觉JMeter还是很强大的,最近打算多学习一点,对以后写代码,自我测试性能也是很有帮助的,再配合jProfiler的使用,可以很好的保证Java代码的效率和性能。当然,工具只能“锦上添花”,最根本的还是需要我们自己可以编写出高质量的代码!

相关文章:

  • python 求余数_Python数据结构与算法——散列(Hash)
  • 此操作系统不支持 .net framework 4.6.2。_聊聊.net应用程序的Docker镜像
  • mysql binlog 实时_实时备份mysql binlog日志 脚本
  • oracle和mysql用户名_oracle 11g 默认用户名和密码
  • php mysql varchar_mysql中VARCHAR长度详细介绍
  • python图像读写技巧_Python图像读写方法对比
  • k8s一个容器多个镜像_AWS 容器三大新品:K8s 发行版,免费镜像库和 “Game Changer”AWS Proton...
  • c语言中的mecpy的用法_C语言的memcpy用法
  • python 判断字符串在数组中_一日一技:在 Golang 中如何快速判断字符串是否在一个数组中...
  • python像数常用函数_python图像处理常用函数
  • linux下查看mysql函数_linux下mysql函数的详细案列
  • mysql增删改查4组语句_MySQL增删改查之DML语句详解
  • python requests请求失败_Python requests多线程抓取请求都报异常无解
  • java returnAddres_java获取本机ip(排除虚拟机等一些ip)最终解,总算找到方法了...
  • 三路快速排序 java_java中三路快速排序的实现
  • 【css3】浏览器内核及其兼容性
  • 【node学习】协程
  • 【知识碎片】第三方登录弹窗效果
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • Fundebug计费标准解释:事件数是如何定义的?
  • iOS 颜色设置看我就够了
  • java概述
  • Java小白进阶笔记(3)-初级面向对象
  • rabbitmq延迟消息示例
  • React的组件模式
  • 后端_MYSQL
  • 基于axios的vue插件,让http请求更简单
  • 前端js -- this指向总结。
  • 悄悄地说一个bug
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 用Canvas画一棵二叉树
  • 走向全栈之MongoDB的使用
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • Semaphore
  • 函数计算新功能-----支持C#函数
  • #NOIP 2014# day.1 T2 联合权值
  • #Z2294. 打印树的直径
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (附源码)ssm高校实验室 毕业设计 800008
  • (简单) HDU 2612 Find a way,BFS。
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (强烈推荐)移动端音视频从零到上手(上)
  • (三)uboot源码分析
  • (算法)N皇后问题
  • (一)VirtualBox安装增强功能
  • (转) ns2/nam与nam实现相关的文件
  • (转)ABI是什么
  • .jks文件(JAVA KeyStore)
  • .mysql secret在哪_MySQL如何使用索引
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .net开发引用程序集提示没有强名称的解决办法