您是否需要在测试过程中使用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的一些建议:

  1. 开发并保持您的测试原子性。 测试不应相互依赖,每项测试应尽可能少地完成。

  2. 正确使用setUp和tearDown方法。 理想情况下,JUnit测试应使系统处于与测试执行前相同的状态

  3. 请记住,JMeter是多线程的 - 因此请确保您使用的是线程安全的方法,集合等。

  4. 每次调用JUnit方法时都会创建父测试类实例。 每次,这些结果都会传递给Listeners。

  5. 如果您的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项目类路径中,则可以使用此技巧:

  1. 在项目中创建一个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); 
}

  1. 将JUnit测试用例编译成.jar文件,然后将jar放入/ lib / junit文件夹

  2. 重启JMeter(如果正在运行)

  3. 将 用户定义的变量 配置元素 添加 到测试计划中,并使用值“bar”定义“foo”变量

  1. 添加JUnit Request Sampler并选择相关的类和getJMeterVariableTest方法。

  2. 打开 日志查看器 窗口并运行测试。

  1. 在Log Viewer输出窗口中查找“foo variable value is”字符串

此方法适用于任何JMeter变量。 例如:您可以将JUnit请求采样器与 CSV数据集配置 结合使用 。

在JUnit请求中设置JMeter变量

如果需要从JUnit请求中提取一些数据,可以采用类似的方法从父上下文中获取JMeter变量:

  1. 使用以下代码(或类似代码)创建一个新的测试用例:

@Test 
public  void   setJMeterVariableTest (){ 
JUnitSampler sampler = new   JUnitSampler (); 
JMeterVariables vars = sampler。 getThreadContext ()。 getVariables (); 
val。 put ( “JUnitVariable” , “此变量由” + sampler 设置 .getThreadContext ()。 getCurrentSampler ()。 getName ()); 
sampler。 getThreadContext ()。 setVariables (vars); 
}

  1. 将测试用例编译到jar文件中并将其放到/ lib / junit文件夹中

  2. 重启JMeter(如果正在运行)

  3. 将JUnit Request Sampler添加到测试计划中

  4. 在JUnit请求下 添加 Debug Sampler 和 View Results Tree Listener。 如果您之前没有调试过JMeter脚本,请查看指南: 如何调试Apache JMeter脚本

  5. 运行测试

  6. 在View Results Tree Listener中打开Debug Sampler, 在Response Data选项卡中 查找“JUn itVariable”

JUnit请求采样器限制

使用JUnit Sampler有一些限制。 以下是您应该注意的一些内容:

  1. 仅记录JUnit请求采样器的“经过时间”。 您将无法看到Latency或Bytes指标,因为JMeter对您的JUnit测试一无所知。 因此,JMeter只能测量您的测试方法执行时间
  2. 目前(根据​​JMeter 2.11)无法运行JUnit套件或夹具。 每个JUnit Request Sampler实例只能执行单个测试用例,只有一个测试用例
  3. JUnit测试设计存在某些限制。 由于JMeter的多线程特性,测试开发人员需要使用线程安全的方法(即尽可能避免使用静态字段和方法,并记住资源可能忙于另一个线程)。
  4. 有限的JUnit请求采样器配置功能假设所有测试前和测试后的逻辑都应该采用setUp和tearDown方法。 如果需要将外部数据提供给采样器,请使用属性文件或系统属性

Blazemeter和JUnit采样器

Blazemeter系统完全支持JUnit Request Sampler。 只需确保上传.jar文件以及测试和第三方依赖项(如果有)以及.jmx文件。

以下是Blazemeter系统日志查看器中“getJMeterVariableTest”场景的外观:

Blazemeter的 JUnit请求采样器 的 负载报告 看起来像任何其他采样器 - 除了采样器不支持的延迟和嵌入式资源。

 而已! 我认为您需要了解有关JUnit Request Sampler的所有信息。 但是如果我错过了什么或者你有什么问题 - 给我一个大喊!

1.如何在JMeter中使用JUnit的更多相关文章

  1. 如何在jmeter中调用自己写的java工具包

    本文介绍在jmeter中调用自己写java工具包,并非直接继承jmeter提供的java sample request接口. 工具/原料 jmeter eclipse 方法/步骤 通常用jmeter做 ...

  2. 如何在JMeter中使用ForEach控制器

    Jmeter中的ForEach Controller遍历变量数组. 在这个JMeter教程中,我们将使用ForEach控制器循环访问JSON数组. 有时我们需要解析响应并提取某些信息.例如,在测试AP ...

  3. Jmeter中使用外部的java文件

    感觉在Jmeter中使用外部的Java文件比较方便,语法一样,而且可以直接引用,所以个人觉得这个功能还是蛮重要的,特别是在使用Jmeter的过程中,可能需要结合一定的业务场景进行判断等,那使用Jmet ...

  4. 如何在springMVC 中对REST服务使用mockmvc 做测试

    如何在springMVC 中对REST服务使用mockmvc 做测试 博客分类: java 基础 springMVCmockMVC单元测试  spring 集成测试中对mock 的集成实在是太棒了!但 ...

  5. Jmeter中的几个重要测试指标释义

    一.基本概念 1.测试计划是使用 JMeter 进行测试的起点,它是其它 JMeter 测试元件的容器. 2.线程组:代表一定数量的并发用户,它可以用来模拟并发用户发送请求.实际的请求内容在Sampl ...

  6. 转帖Jmeter中的几个重要测试指标释义

    Aggregate Report 是 JMeter 常用的一个 Listener,中文被翻译为“聚合报告”.今天再次有同行问到这个报告中的各项数据表示什么意思,顺便在这里公布一下,以备大家查阅. 如果 ...

  7. 【转】JMeter中使用Selenium进行测试

    JMeter是使用非常广泛的性能测试工具,而Selenium是ThroughtWorks 公司一个强大的开源Web 功能测试工具.Jmeter和Selenium结合使用,就可以实现对网站页面的自动化性 ...

  8. 如何在Idea中编译构建Spring Framework 5.x

    如何在Idea中编译构建Spring Framework 5.x 安装配置Gradle(略) 下载源码:git clone https://github.com/spring-projects/spr ...

  9. 我是如何在SQLServer中处理每天四亿三千万记录的

    首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...

随机推荐

  1. 洛谷 P1972 [SDOI2009]HH的项链(树状数组,离线)

    传送门 解题思路 因为是求区间的不同种类数,所以我们用树状数组(貌似并没有什么直接联系) (...表示到) 还是和原来一样,用s[i]来表示a[i-lowbit(i)]...a[i]的种类数. 因为有 ...

  2. Windows程序设计--(一)起步

    1.3 你的第一个Windows程序 1.3.2 Windows 对应程序 #include <windows.h> int WINAPI WinMain(HINSTANCE hInsta ...

  3. UIViewController push或presentViewController 弹出方式

    //导航控制器数量 add xjz 判断是push还是present出来的 NSArray *viewcontrollers = self.navigationController.viewContr ...

  4. rabbitmq 结构体

    amqp_basic_properties_t props; props._flags = AMQP_BASIC_CONTENT_TYPE_FLAG | AMQP_BASIC_DELIVERY_MOD ...

  5. rabbitmq 从channal获得socket

    std::string queue_name = "hello100"; AmqpClient::Channel::ptr_t channel = AmqpClient::Chan ...

  6. Sass字符运算

    在 Sass 中可以通过加法符号“+”来对字符串进行连接.例如: $content: "Hello" + "" + "Sass!"; .bo ...

  7. HTML基础 img标签 做一个图库

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. Python3.5-20190519-廖老师-自我笔记-面向对象中slots变量--@property的使用

    python是动态语言,可以随时随地给实例对象添加属性和方法,但是我们想限制属性的名字,可以使用__slots__特殊变量来限制 使用__slots__要注意,__slots__定义的属性仅对当前类实 ...

  9. NET Core SDK 已安装在VS2017不可见

    本地装了6个版本的net core sdk,但是在vs2017,vs2019 只是显示1.0和1.1: 重装,重启了好几遍也没用,没想到是环境变量PATH顺序问题,将x64的放在x86前,就OK了~:

  10. Delphi 运行后错误提示“无效的授权说明”

    Delphi 运行后错误提示“无效的授权说明” 一般情况是:数据库的连接出现了问题. 解决方法:检查加载数据库是否正常,能否正常连接.