如何在JMeter中使用JUnit 打印 E-mail
作者:WhoisTester   
2018-07-24 12:26

您是否需要在测试过程中使用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的所有信息。 但是如果我错过了什么或者你有什么问题 - 给我一个大喊!


 

发表评论


安全码
刷新