iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >开源的性能测试框架p-unit怎么用
  • 839
分享到

开源的性能测试框架p-unit怎么用

2023-06-03 03:06:59 839人浏览 薄情痞子
摘要

本篇文章为大家展示了开源的性能测试框架p-unit怎么用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。认识p-unit:一款开源的性能测试框架p-unit 是一款开放源码的性能测试框架,和 JUni

本篇文章为大家展示了开源性能测试框架p-unit怎么用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

认识p-unit:一款开源的性能测试框架

p-unit 是一款开放源码的性能测试框架,和 JUnit 不同,JUnit 关注的是测试案例的正确性,而 p-unit 不仅关注测试案例的正确性,还收集测试案例的性能参数,默认情况下,p-unit 收集测试案例的时间和内存消耗情况,可以产生文件,图片,和 pdf 格式的报表。此外,p-unit 还支持参数化测试,多线程测试以及不同 Java 虚拟机性能之间的比较。

p-unit 简介

或许我们已经习惯了使用 JUnit 来写单元测试来保证代码质量(我也一直这么做),但可能经常碰到这样的问题:
程序多线程下正确性如何?
如何测试程序的性能?
当有多个方案可以选择时,技术上如何比较不同方案的性能?
 对于问题 1,我们或许听天由命?或是凭借人工分析,或是根据用户反馈?很多软件单线程下的单元测试覆盖率相当高,从而保证了代码的健壮性。然而多线程测试时常被忽略,这并不代表多线程测试不重要,相反,修正一个用户报告的多线程 BUG 往往比单线程的要高出很多,因为测试案例经常不是 100% 可重现的。这更要求程序员开发阶段充分的重视。目前多线程单元测试力度不够的一个重要原因是没有一个像 JUnit 那样易用的测试工具,另外重复写测试案例往往不被程序员接受。
 对于问题 2,一个成熟的关心性能的产品往往有一个性能测试平台。这个测试平台应该关注的是测试业务逻辑本身,而无需关心如何运行测试案例。你是否为写这样的测试平台痛苦过?以及花费时间在产生一些直观的报表上面?

 对于问题 3,我们往往写一个原型来比较不同产品之间的性能,如何比较执行速度和内存消耗?或是选择最适合你的虚拟机?
p-unit 就是这么一款开源的性能测试软件,它能帮助你很好的解决上述问题。p-unit 可以:
多线程支持:同一个测试案例可以单线程执行,也可以多线程执行,测试案例开发者只需写一套测试案例。
参数化测试案例:很多测试案例,需要测试同一功能在不同数量级上的性能表现。
不同虚拟机性能测试:只需指定虚拟机路径,即可测试同一个测试案例在不同虚拟机上的表现,报表上可以非常直观显示性能差别。
事件机制构架:punit 是基于事件机制构架的,如果用户想定制报表,只需实现事件响应器,并注册该响应器到 punit 核心即可。


多线程执行测试案例


 在了解如何多线程执行测试案例之前,我们先了解一下如何利用 p-unit 单线程执行测试案例。不同于 JUnit, p-unit 测试用例无需继承任何测试类或是实现接口,即可执行 test 开始的方法。尽管 JUnit 4 中加入了注释(Annotation) 的特性,但测试方法前缀为 "test" 仍然是测试者们的首选。因此如果你的 JUnit 测试案例遵循的是 test 命名规则,那么 p-uni t可以兼容运行 JUnit 测试案例。
下面的代码清单 1 是一个最为普通的测试案例:

public class SimpleTestClass {public void setUp() {SampleUtil.doSomething();}public void tearDown() {SampleUtil.doSomething();}public void testA() {System.out.println("testA");SampleUtil.doSomething();}public void testB() {SampleUtil.doSomething();}public void testC() {SampleUtil.doSomething();}}public class SampleUtil { private static Random _random = new Random();public static void consumeMemory(int length) {byte[] data = new byte[length];for(int i = 0, j = 0; i < data.length; ++i) {++j;}}public static void consumeTime(int time) {ThreadUtil.sleepIgnoreInterruption(time);}public static void doSomething() {consumeTime(Math.abs(_random.nextInt()) % 500);consumeMemory(Math.abs(_random.nextInt()) % 100000);}} 

这是做为普通的测试案例,但是注意到这仅仅是一个测试案例,不包含其他任何逻辑,这也是 p-unit 追求的业务逻辑和测试运行环境分离的一个理念。同一个测试案例,用户可以选择不同的测试环境去运行,而不是绑定在某一个特定的测试软件工具上。现在我们来看 p-unit 是如何运行这个测试案例的。你只需要在 main 函数中写一行代码来运行它:

清单 2. 单线程运行测试案例

CODE:


public static void main(String[] args) {
new PUnitSoloRunner().run(SimpleTestClass.class);
}
清单 3. 单线程运行测试案例结果


[solo] Started running samples.SimpleTestClass
samples.SimpleTestClass
testA
testA() - [287.0ms]
testB() - [27.0ms]
testC() - [213.0ms]
total: 3, failures:0 (GREEN) - 2025.0ms
 

是否和想象中的一样?下面我们来看如何多线程执行这个测试案例。或许从上面的例子你已经猜到了,在 main 函数还是只需一句代码,只用把 PUnitSoloRunner 换成 PUnitConcurrentRunner 即可!

清单 4. 多线程运行测试案例

public static void main(String[] args) {new PUnitConcurrentRunner().run(SimpleTestClass.class);}

清单 5. 多线程运行测试案例结果

[concurrent] Started running samples.SimpleTestClasssamples.SimpleTestClasstestAtestAtestAtestAtestAtestAtestAtestAtestAtestAtestA() - [405.0ms]testB() - [469.0ms]testC() - [503.0ms]total: 3, failures:0 (GREEN) - 1447.0ms 

是否和想象中的一样?默认情况 p-unit 启动 10 个线程来执行,要指定不同的线程数,只需将线程数做为参数传入 PUnitConcurrentRunner 即可。p-unit 甚至支持不同的测试案例有不同的线程数,这要求测试案例实现 p-unit 中定义的 Concurrent 接口,该接口的定义为:

清单 6. p-unit Concurrent 接口

CODE:


public interface Concurrent {
public int concurrentCount();
}
 该接口的意思,相信无需再多做解释了,返回该测试案例需要的线程数。

最新回复

  • quake at 2007-11-21 15:35:48

  • 参数化测试案例


     性能测试,不同于单元测试,经常要求测试不同数量级在同一个测试场景中的表现,JUnit 是一款非常优秀的单元测试工具,但没覆盖到这个方面。比如我们比较类库 Foo1 的方法 bar() 和类库 Foo2 的方法 bar() 哪个更符合自己的应用程序,我们需要测试该函数在应用程序可能的数量级的范围内的表现。有经验的开发者知道经常碰到在小数量级 A 更好大数量级 B 更好的局面,因此全面的测试对于代码的性能理解非常重要,能帮助开发者做出正确的决定。p-unit 支持将参数传给测试方法,测试案例需要实现 p-unit 的 parameterizable 接口,该接口的主要方法是返回一组参数列表,这组列表的参数将会一一传给测试方法。

    清单 7. p-unit 参数化测试案例

public class ParamTestClass implements Parameterizable {public static void main(String[] args) {new PUnitSoloRunner().run(ParamTestClass.class);}public Parameter[] parameters() {return new Parameter[] { new ParameterImpl(10), new ParameterImpl(20) };}public void testA(ParameterImpl param) {SampleUtil.doSomething();}public void testB(ParameterImpl param) {SampleUtil.doSomething();}public void testC(ParameterImpl param) {SampleUtil.doSomething();}public void setUpAfterWatchers(Parameter param) throws Exception {}public void setUpBeforeWatchers(Parameter param) throws Exception {}public void tearDownAfterWatchers(Parameter param) throws Exception {}public void tearDownBeforeWatchers(Parameter param) throws Exception {}static class ParameterImpl implements Parameter {private int _count;ParameterImpl(int count) {_count = count;}public int count() {return _count;}public String toString() {return String.valueOf(_count);}}}

上述代码的执行结果为:

  • CODE:


    [solo] Started running samples.ParamTestClass
    samples.ParamTestClass
    testA(10) - [57936.0bytes,447.0ms]
    testA(20) - [33128.0bytes,61.0ms]
    testB(10) - [24832.0bytes,137.0ms]
    testB(20) - [0.0bytes,63.0ms]
    testC(10) - [83560.0bytes,468.0ms]
    testC(20) - [16528.0bytes,47.0ms]
    total: 6, failures:0 (GREEN) 1450.0ms
     

  • 从上述结果看出,每个方法被执行了 2 次,每次传入不同的参数。多线程运行参数化测试程序?相信读者已经明白怎么去实现了,只需将 PUnitSoloRunner 替换成 PUnitConcurrentRunner。

  • quake at 2007-11-21 15:40:22

  • 运行环境测试案例

     随着 Java 开源,出现了更多的 Java 运行环境,除了 SUN 的参考实现外,BEA、IBM 均有自己的 Java 运行环境,更有如 Apache Harmony 的开源运行环境(尽管现在 Apache Harmony 尚不能称为 Java 运行环境)。运行环境测试案例,为运行环境开发者以及选择运行环境,都能提供一定的帮助。比如说下面的例子就是测试 java.util.ArrayList 和 java.util.Vector 在两个不同运行环境的表现。测试案例写法和普通的测试案例完全一样,我们只需告诉 p-unit 不同的运行环境的 Java 路径以及正确的 classpath,然后调用 runVMs 函数即可:

    清单 9. p-unit 运行环境测试案例

public static void main(String[] args) {PUnitSoloRunner runner = new PUnitSoloRunner();runner.addPUnitEventListener(new OverviewReporter(new ImageRender()));runner.runVMs(ListTestClass.class, new VM[] { VMConfig.HARMONY, VMConfig.SUN });}public class VMConfig {private static String CLASSPATH = " -cp correct_classpath_including_all_jars_and_path"; private static String HARMONY_PATH = "harmony_pathbinjava" + CLASSPATH; private static String SUN_PATH = "sun_pathbinjava" + CLASSPATH; public static VM HARMONY = new VM(HARMONY_PATH, "HARMONY"); public static VM SUN = new VM(SUN_PATH, "SUN");}public class ListTestClass {private static final int LIST_COUNT = 100000;private static Object element = new Object();private Random indexGenerator = new Random();;public void testInsertArrayList() { ArrayList arrayList = new ArrayList(LIST_COUNT);insertSequence(arrayList);insertRandom(arrayList);}public void testInsertVector() {Vector vector = new Vector(LIST_COUNT);insertSequence(vector);insertRandom(vector);}public void insertSequence(List list) {for (int i = 0; i < LIST_COUNT; ++i) {list.add(element);}}public void insertRandom(List list) {for (int i = 0; i < LIST_COUNT; ++i) {list.add(indexGenerator .nextInt(LIST_COUNT),element);}}}

笔者使用的 HARMONY 版本在该测试案例中速度更快,但内存消耗更多。


 从上面的实例中我们已经看到 p-unit 的输出结果的两种形式,控制台和报表图片。默认情况下,p-unit 将输出到控制台。p-unit 采用事件机制,在运行器的每个节点都会提供通知事件。所有的输出都是通过注册事件响应器来实现的。这也表明了结果输出和运行器完全隔离,用户也可以定制自己的报表。p-unit 有 4 种内建输出,分别为控制台、文件、图片报表以及 PDF 报表。上一节的例子中我们已经看到图片报表,其代码为:
清单 10. 添加 p-unit 总体图片报表

CODE:

runner.addPUnitEventListener(new OverviewReporter(new ImageRender())); p-unit 内建的报表有分三种不同的粒度:总体级别(OverviewReporter),TestSutie 级别(TestSuiteReporter),以及测试案例类级别(TestClassReporter)。这三种级别都可以输出图片格式或是 PDF 格式,因此,总共有六种类型的输出。上述的代码就是输出总体级别的图片。由于事件监听器是互相独立的,因此你可以既选择输出图片又选择输出 PDF 文件,只需再添加事件监听器即可:
清单 11. 添加多个 p-unit 事件监听器

runner.addPUnitEventListener(new OverviewReporter(new ImageRender()));runner.addPUnitEventListener(new OverviewReporter(new PDFRender()));

上述内容就是开源的性能测试框架p-unit怎么用,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网精选频道。

--结束END--

本文标题: 开源的性能测试框架p-unit怎么用

本文链接: https://www.lsjlt.com/news/232297.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 开源的性能测试框架p-unit怎么用
    本篇文章为大家展示了开源的性能测试框架p-unit怎么用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。认识p-unit:一款开源的性能测试框架p-unit 是一款开放源码的性能测试框架,和 JUni...
    99+
    2023-06-03
  • .Net性能测试框架Crank怎么使用
    这篇文章主要介绍“.Net性能测试框架Crank怎么使用”,在日常操作中,相信很多人在.Net性能测试框架Crank怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”.Net性能测试框架Crank怎么使用...
    99+
    2023-06-21
  • PHP中的性能测试框架
    随着互联网应用的不断发展,Web应用程序的性能越来越受到关注。在开发Web应用程序时,开发人员需要关注程序的运行效率和响应速度,及时发现并解决性能问题,以提供更好的用户体验。因此,选择一个性能测试工具来评估和优化Web应用程序的性能是非常重...
    99+
    2023-05-23
    框架 PHP 性能测试
  • .Net性能测试框架Crank的使用方法
    目录安装Crank创建Crank配置文件启动Crank-Agent启动Crank结果输出更多参考资料Crank 是微软新出的一个性能测试框架,集成了多种基准测试工具,如bombard...
    99+
    2024-04-02
  • Python的pytest测试框架怎么用
    今天小编给大家分享一下Python的pytest测试框架怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。pytest 可...
    99+
    2023-06-27
  • imba框架的简单介绍和性能测试
    这篇文章主要讲解了“imba框架的简单介绍和性能测试”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“imba框架的简单介绍和性能测试”吧!imba 简单介绍i...
    99+
    2024-04-02
  • 手写java性能测试框架的实现示例
    目录引言代码分享基础类实现数据库的实现concurrent类引言 之前写过一个性能测试框架,只是针对单一的HTTP接口的测试,对于业务接口和非HTTP接口还无非适配,刚好前端时间工作...
    99+
    2024-04-02
  • Python测试框架pytest怎么使用
    这篇文章主要介绍了Python测试框架pytest怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python测试框架pytest怎么使用文章都会有所收获,下面我们一起来看看吧。一、Pytest简介Pyt...
    99+
    2023-06-29
  • PHP 应用程序性能优化中 PHPUnit 测试框架的性能提升优化
    利用 phpunit 优化 php 应用程序性能:减少全局变量的使用。缓存常用资源。避免重复查询。使用断言分组。通过应用这些策略,您可以提升 phpunit 的性能,缩短测试执行时间,及...
    99+
    2024-04-30
    php 性能优化
  • 揭开 Python 测试框架的面纱:为您的代码赋能
    Unittest:Python 中的基本测试框架 Unittest 是 Python 内置的测试框架,它提供了创建和运行测试用例的简单方法。它还具有断言功能,使开发人员能够验证预期结果是否与实际结果匹配。 Pytest:一个高度可扩展的测...
    99+
    2024-04-02
  • PHP7怎么通过yum源安装及性能测试
    今天就跟大家聊聊有关PHP7怎么通过yum源安装及性能测试,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。提到PHP,肯定会有人说这是世界上最好的编程语言。单说流行程度,目前全球超过8...
    99+
    2023-06-05
  • Java WebService开源框架CXF怎么使用
    使用CXF框架开发Java WebService可以按照以下步骤进行:1. 配置CXF框架:下载CXF框架的最新版本,解压后将CXF...
    99+
    2023-08-08
    Java CXF
  • Java微基准测试框架JMH怎么使用
    使用Java微基准测试框架JMH需要按照以下步骤进行:1. 创建一个Java项目,并将JMH依赖添加到项目的构建文件中(例如,Mav...
    99+
    2023-09-22
    Java JMH
  • ASP 测试框架中的开箱即用魔法:揭晓其强大功能
    ASP 测试框架,Segue Magic,测试自动化,Web 测试 Segue Magic 允许开发者使用类似于业务场景的简单语言来描述他们的测试。这极大地简化了测试创建过程,即使是复杂的情景也能轻松描述。例如: Navigate t...
    99+
    2024-02-17
    Segue Magic ASP.NET 测试框架中的一项强大功能 它提供了测试场景创建 执行和维护方面的诸多好处。通过使用 Segue Magic 可以显著提高测试效率和准确性。
  • golang的执行性能怎么测试
    要测试Golang的执行性能,你可以使用以下几种方法: 使用内置的性能分析工具:Golang提供了一个内置的性能分析工具go t...
    99+
    2023-10-22
    golang
  • 租用云主机怎么测试性能
    要测试云主机的性能,可以考虑以下几个方面:1. 基准测试:使用性能测试工具对云主机进行基准测试,例如UnixBench、SPEC C...
    99+
    2023-08-20
    云主机
  • 在Linux中怎么使用unixbench来测试测试系统性能
    这篇文章主要介绍“在Linux中怎么使用unixbench来测试测试系统性能”,在日常操作中,相信很多人在在Linux中怎么使用unixbench来测试测试系统性能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答...
    99+
    2023-06-12
  • 自动化测试框架pytest的Fixture固件怎么调用
    本篇内容介绍了“自动化测试框架pytest的Fixture固件怎么调用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是固件Fixture...
    99+
    2023-07-05
  • 香港cn2的vps性能怎么测试
    香港cn2的vps性能测试方法:1、输入执行bench.sh脚本命令查看所有的配置,能直观的了解服务器的硬件配置;2、 使用Speedtest工具测试主机的上传和下载带宽;3、使用http://ipip.net在线工具对主机的PING响应时...
    99+
    2024-04-02
  • Linux系统的VPS性能怎么测试
    这篇文章主要讲解了“Linux系统的VPS性能怎么测试”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux系统的VPS性能怎么测试”吧!通过测试IP测试速度选择VPS当然要先进行IP测试...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作