1.如何在JMeter中使用JUnit
您是否需要在测试过程中使用JUnit? 要回答这个问题,我们先来看看单元测试。
单元测试是软件测试生命周期中测试的最低分辨率。 运行单元测试时,需要在应用程序中使用最小的可测试功能,将其与其他代码隔离,并确定其行为是否符合预期。 这使您可以在开始构建更大的模块之前验证正在测试的应用程序的小“单元”是否正常工作。
Junit是迄今为止最流行的Java语言单元测试框架。 根据最近的一项调查,超过30%的GitHub项目使用JUnit进行单元测试。 JMeter开发人员和贡献者还使用JUnit来验证新功能或错误修复是否会破坏任何现有功能。
所以JUnit显然对开发人员有很大的价值。 但你怎么用呢?
如果您已经在使用JMeter,则可以使用其 JUnit Request 采样器。 该采样器可以执行单独的JUnit测试用例,使您能够:
在多个线程中运行JUnit测试用例
应用JMeter功能,例如:
逻辑控制器
计时器
断言
听众
控制测试执行顺序和条件以构建高级测试计划
在本文中,我将重点介绍最常见的用例,向您展示如何执行配置,显示应放置JUnit测试.jar文件的位置,并提供有关扩展方案的提示。
运行现有的JUnit测试
将JUnit .jar文件提供给JMeter
放置包含JUnit测试用例的.jar文件的最佳位置是在JMETER_HOME / lib / junit文件夹中。 只需将.jar文件放入此文件夹,重新启动JMeter,然后将JUnit Request Sampler添加到测试计划中。 JMeter扫描此文件夹并获取看起来像JUnit测试用例的所有内容 - 因此您应该能够在下拉列表中看到您的JUnit测试类名称和相关方法。
您还可以通过“user.classpath”属性“告诉”JMeter查看其他位置。 此属性位于JMeter安装的/ bin文件夹下的“user.properties”文件中。 它可以采用以下值:
单个jar文件: user.classpath = /项目/ junit的/ test1.jar
多个jar文件: user.classpath = /项目/ junit的/ test1.jar; /Projects/junit/test2.jar
一个文件夹: user.classpath = /项目/ junit的
以上任意组合。 各个类路径条目需要用分号分隔。
有关各种JMeter属性以及设置和覆盖它们的方法的更多信息,请参阅“ Apache JMeter属性自定义指南”
请记住,类路径中的正斜杠或反斜杠应对应于操作系统的文件分隔符:
对于Windows,文件分隔符是反斜杠:\
对于Linux / Unix / MacOSX,文件分隔符是正斜杠:/
JMeter的JUnit Request Sampler可识别JUnit3和JUnit4样式的类和方法,但您需要通过“搜索JUnit 4注释(而不是JUnit3)”复选框“告诉”要查找的版本。 选中此框后,JMeter将查找JUnit4样式的注释,并且不会显示JUnit3类(如果未选中该框,则反之亦然)。
例如,我有JUnit3和JUnit4测试类的jar。 如果我不选中该框,JMeter将查找JUnit3测试并且不会显示JUnit4:
选中此框后,JMeter将被指示仅扫描JUnit4测试。 如您所见,JUnit3测试不在下拉列表中
希望您现在可以在JMeter的JUnit Sampler中列出所有类和方法。 下一个是什么?
JUnit采样器的控制面板参数 - 解释!
在进一步研究之前,您需要了解JUnit Sampler控制面板的所有参数。 这是每个的快速解释:
名称
这是JUnit采样器的名称,就像任何其他采样器或配置元素或逻辑控制器一样。 最好为采样器提供一个合适的,唯一的名称,以确保在运行 性能测试结果分析 时能够将其与其他名称区分开来 。
评论
在这里,您可以输入任意评论 - 如果您正在合作,可以为自己或同事输入。 这通常涉及采样器的功能的简短摘要。
搜索JUnit4批注
我已经涵盖了上述内容。 它告诉JMeter是否要查找JUnit3或JUnit4测试。
包过滤器
通过使用包过滤器,您可以将JMeit的JUnit测试类输出限制为仅一个。 这将包含通过输入提供的模式。
默认情况下,JMeter列出所有类
如果在过滤器中键入“woolfel”,您将看到JMeter仅显示包名称中带有“woolfel”的类。
请记住,包过滤器仅适用于包,不适用于类名。 所以“羊毛”会起作用,但“假人”不会。
班级名称
这个参数非常明显。 只需选择要从生活中运行的测试用例的类。
构造函数字符串标签
如果您的JUnit测试类具有接受单个String的构造函数,则可以使用此参数设置其值。 如果您的JUnit测试类没有声明这样的构造函数,JUnit Sample将尝试查找空构造函数。
测试方法
这是JUnit采样器中最重要的部分。 根据“类名”选项,“测试方法”下拉列表显示所有可用方法。 JUnit Sampler一次只能运行一个JUnit测试方法。
值得一提的是“oneTimeSetUp”和“oneTimeTearDown”方法,它们代表 @BeforeClass 和 @AfterClass JUnit4注释。 这些显示为单独的测试方法,由于JMeter的多线程特性,因此不会自动执行。
成功消息和代码
可以使用这些参数设置自定义响应消息和响应代码。 在JUnit测试中,将显示指定响应消息和代码的成功。
失败代码和消息
当您有JUnit测试失败(断言失败)时,这些字段允许您定义自定义响应代码和响应消息。
错误代码和消息
当出现意外测试缺陷时,可以使用错误代码和消息参数来设置响应代码和响应消息。 例如:如果在测试用例执行期间抛出异常并且未处理,则此测试将报告为错误,而不是失败。
不要调用setUp和tearDown
默认情况下,setUp和tearDown方法由JUnit Request采样器调用。
对于JUnit3:
@Override
public void setUp (){
//在这里设置逻辑
}
@Override
public void tearDown (){
//在这里拆除逻辑
}
对于JUnit4:
@Before
public void setUp (){
//在这里设置逻辑
}
@After
public void tearDown (){
//在这里拆除逻辑
}
在计算采样器的经过时间时,不考虑执行setUp和tearDown的时间。 只测量测试方法本身的执行时间 - 因此从报告的角度来看,它没有任何区别。 请确保:
如果您故意选中此框,则您知道自己在做什么,因为相关的setUp和tearDown方法将不会被执行。 在JUnit Request Sampler的世界中,它几乎是执行预测试配置和测试后清理的唯一方法。
如果您正在使用oneTimeSetUp和oneTimeTearDown JUnit4方法(注释为@BeforeClass和@AfterClass),请确保 选中 此框
附加断言错误
选中“附加断言错误”框后,AssertionError消息将附加到您的响应消息。
如果您采用以下JUnit测试用例代码:
@Test
public void test1 (){
断言。 assertEquals ( 1,2 );
}
JUnit Sampler输出如下所示:
附加运行时异常
在执行JUnit测试期间,任何不是来自失败断言的异常都被视为“错误”而不是“失败”。 “Append Runtime Exceptions”标志确定是否将此未处理的异常消息添加到JUnit Request Sampler的响应消息中。
为每个示例创建一个新实例
此复选框确定是否在每次测试执行时重新初始化JUnit Request Sampler。
开发用于JUnit请求采样器的新单元测试
以下是有关如何设计JUnit测试以便使用JMeter的JUnit Request Sampler的一些建议:
开发并保持您的测试原子性。 测试不应相互依赖,每项测试应尽可能少地完成。
正确使用setUp和tearDown方法。 理想情况下,JUnit测试应使系统处于与测试执行前相同的状态
请记住,JMeter是多线程的 - 因此请确保您使用的是线程安全的方法,集合等。
每次调用JUnit方法时都会创建父测试类实例。 每次,这些结果都会传递给Listeners。
如果您的JUnit测试依赖于第三方库 - 请确保必要的jar位于以下位置之一:
JMETER_HOME / lib中/ JUnit的
“user.classpath”指定的位置
即使jar位于/ lib或/ lib / ext文件夹下,JMeter也能够找到所需的类。 但是,建议不要这样做,因为/ lib文件夹用于JMeter依赖库,而/ lib / ext用于真正的核心组件和插件。 因此,他们的行为可能是不确定的。
JUnit采样器 - 高级用法
从JUnit测试用例访问JMeter变量
在本节中,我将介绍如何在JUnit测试中使用JMeter变量。
与 Java Request Sampler(在 WebSocket测试 演示中 提到 )不同,JUnit Request Sampler没有基于名称 - 值对的配置。 因此,唯一可用的选项是类构造函数字符串。
但是,如果将JMeter库包含到JUnit项目类路径中,则可以使用此技巧:
在项目中创建一个JUnit测试用例(或修改现有的),如下所示:
private static final Logger log = LoggingManager。 getLoggerForClass ();
@Test
public void getJMeterVariableTest (){
JUnitSampler sampler = new JUnitSampler ();
String foo = sampler。 getThreadContext ().getVariables (). ( “foo” );
登录。 info ( “foo变量值为:” + foo);
}
将JUnit测试用例编译成.jar文件,然后将jar放入/ lib / junit文件夹
重启JMeter(如果正在运行)
将 用户定义的变量 配置元素 添加 到测试计划中,并使用值“bar”定义“foo”变量
添加JUnit Request Sampler并选择相关的类和getJMeterVariableTest方法。
打开 日志查看器 窗口并运行测试。
在Log Viewer输出窗口中查找“foo variable value is”字符串
此方法适用于任何JMeter变量。 例如:您可以将JUnit请求采样器与 CSV数据集配置 结合使用 。
在JUnit请求中设置JMeter变量
如果需要从JUnit请求中提取一些数据,可以采用类似的方法从父上下文中获取JMeter变量:
使用以下代码(或类似代码)创建一个新的测试用例:
@Test
public void setJMeterVariableTest (){
JUnitSampler sampler = new JUnitSampler ();
JMeterVariables vars = sampler。 getThreadContext ()。 getVariables ();
val。 put ( “JUnitVariable” , “此变量由” + sampler 设置 .getThreadContext ()。 getCurrentSampler ()。 getName ());
sampler。 getThreadContext ()。 setVariables (vars);
}
将测试用例编译到jar文件中并将其放到/ lib / junit文件夹中
重启JMeter(如果正在运行)
将JUnit Request Sampler添加到测试计划中
在JUnit请求下 添加 Debug Sampler 和 View Results Tree Listener。 如果您之前没有调试过JMeter脚本,请查看指南: 如何调试Apache JMeter脚本
运行测试
在View Results Tree Listener中打开Debug Sampler, 在Response Data选项卡中 查找“JUn itVariable”
JUnit请求采样器限制
使用JUnit Sampler有一些限制。 以下是您应该注意的一些内容:
- 仅记录JUnit请求采样器的“经过时间”。 您将无法看到Latency或Bytes指标,因为JMeter对您的JUnit测试一无所知。 因此,JMeter只能测量您的测试方法执行时间
- 目前(根据JMeter 2.11)无法运行JUnit套件或夹具。 每个JUnit Request Sampler实例只能执行单个测试用例,只有一个测试用例
- JUnit测试设计存在某些限制。 由于JMeter的多线程特性,测试开发人员需要使用线程安全的方法(即尽可能避免使用静态字段和方法,并记住资源可能忙于另一个线程)。
- 有限的JUnit请求采样器配置功能假设所有测试前和测试后的逻辑都应该采用setUp和tearDown方法。 如果需要将外部数据提供给采样器,请使用属性文件或系统属性
Blazemeter和JUnit采样器
Blazemeter系统完全支持JUnit Request Sampler。 只需确保上传.jar文件以及测试和第三方依赖项(如果有)以及.jmx文件。
以下是Blazemeter系统日志查看器中“getJMeterVariableTest”场景的外观:
Blazemeter的 JUnit请求采样器 的 负载报告 看起来像任何其他采样器 - 除了采样器不支持的延迟和嵌入式资源。
而已! 我认为您需要了解有关JUnit Request Sampler的所有信息。 但是如果我错过了什么或者你有什么问题 - 给我一个大喊!
1.如何在JMeter中使用JUnit的更多相关文章
- 如何在jmeter中调用自己写的java工具包
本文介绍在jmeter中调用自己写java工具包,并非直接继承jmeter提供的java sample request接口. 工具/原料 jmeter eclipse 方法/步骤 通常用jmeter做 ...
- 如何在JMeter中使用ForEach控制器
Jmeter中的ForEach Controller遍历变量数组. 在这个JMeter教程中,我们将使用ForEach控制器循环访问JSON数组. 有时我们需要解析响应并提取某些信息.例如,在测试AP ...
- Jmeter中使用外部的java文件
感觉在Jmeter中使用外部的Java文件比较方便,语法一样,而且可以直接引用,所以个人觉得这个功能还是蛮重要的,特别是在使用Jmeter的过程中,可能需要结合一定的业务场景进行判断等,那使用Jmet ...
- 如何在springMVC 中对REST服务使用mockmvc 做测试
如何在springMVC 中对REST服务使用mockmvc 做测试 博客分类: java 基础 springMVCmockMVC单元测试 spring 集成测试中对mock 的集成实在是太棒了!但 ...
- Jmeter中的几个重要测试指标释义
一.基本概念 1.测试计划是使用 JMeter 进行测试的起点,它是其它 JMeter 测试元件的容器. 2.线程组:代表一定数量的并发用户,它可以用来模拟并发用户发送请求.实际的请求内容在Sampl ...
- 转帖Jmeter中的几个重要测试指标释义
Aggregate Report 是 JMeter 常用的一个 Listener,中文被翻译为“聚合报告”.今天再次有同行问到这个报告中的各项数据表示什么意思,顺便在这里公布一下,以备大家查阅. 如果 ...
- 【转】JMeter中使用Selenium进行测试
JMeter是使用非常广泛的性能测试工具,而Selenium是ThroughtWorks 公司一个强大的开源Web 功能测试工具.Jmeter和Selenium结合使用,就可以实现对网站页面的自动化性 ...
- 如何在Idea中编译构建Spring Framework 5.x
如何在Idea中编译构建Spring Framework 5.x 安装配置Gradle(略) 下载源码:git clone https://github.com/spring-projects/spr ...
- 我是如何在SQLServer中处理每天四亿三千万记录的
首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...
随机推荐
- Linux拷贝、移动、删除
cp:拷贝文件或文件夹(copy) - cp original_filename copy_filename(在当前目录生成拷贝文件,并改名为copy_filename) - cp original_ ...
- Linux修改密码指令
1.在选择系统菜单界面,按 "e" 进入编辑模式 2.在以字符串“Linux16”开头的行,将光标移动到该行的结尾,然后输入“init=/bin/bash”,按 "Ctr ...
- python控制cpu使用率
以下亲测可行. 使用方法:命令行模式 runing.py -c 2 -t 0.01 -c 指定cpu核数:不指定-c参数默认为所有核数. -t 数值越大,cpu使用率越低. runing.py &qu ...
- IDA Pro - 如何得到比较清楚的逆向伪代码
原文地址:Question about disassembler 简介 这篇文章介绍了如何在不使用插件的IDA Hex-Rays如何得到比较清晰的伪代码.IDA Hex-Rays功能很强大,只要你提供 ...
- elasticsearch相关聚合查询示例
索引(index):logstash-nginx-*,type:nginx_access 请求路径: 1.按照某个字段进行分组统计访问量 { "query": { "bo ...
- TLSv网络安全标准,会话加密协议展望未来
本文是关于TLSv1.3采用的三部分系列的第三部分也是最后一部分.它解决了网络加密和监控的选项,包括备用会话加密协议. 通过TLSv1.3的批准,并在IETF出版物队列中,是时候考虑部署选项和障碍,并 ...
- JavaScript中操作节点
1.获取节点 1.1.用 getElement 方法获取 获取元素节点时,必须等到DOM树加载完成后才能获取.两种处理方式:(1)将JS写在文档最后:(2)将代码写入window.onload函数中: ...
- NOIp 图论算法专题总结 (3):网络流 & 二分图 简明讲义
系列索引: NOIp 图论算法专题总结 (1) NOIp 图论算法专题总结 (2) NOIp 图论算法专题总结 (3) 网络流 概念 1 容量网络(capacity network)是一个有向图,图的 ...
- [CSP-S模拟测试]:Endless Fantasy(DFS)
题目描述 中二少年$cenbo$幻想自己统治着$Euphoric\ Field$.由此他开始了$Endless\ Fantasy$.$Euphoric\ Field$有$n$座城市,$m$个民族.这些 ...
- Android实战技巧:Dialog (转)
转:http://blog.csdn.net/hitlion2008/article/details/7567549#t0 Dialog是任何系统都必须有的一个控件,作为辅助窗口,用于显示一些消息,或 ...