GroboUtils之多线程测试

Groboutils:多线程编程和测试的Java工具库 JUnit 是一个开源的 Java 单元测试框架,用于编写和运行可重复的测试。它由 Kent Beck 和 Erich Gamma 创建,并在敏捷开发中广泛应用。JUnit 支持测试驱动开发(TDD)和行为驱动开发(BDD)方法论,这使得它成为 Java 开发者最喜爱的测试工具之一。JUnit 提供了一套注解,比如@Test@Before和@After等,通过这些注解,开发人员可以轻松地标识测试方法,以及设置和清理测试环境。此外,JUnit 为断言提供了简洁的 API,例如。 阅读详情
    Junit作为java自动化测试利器,在java软件开发方面有着强大的功能和便利。通过大量的单元测试,可以方便的定位错位,而且可以提高自己对代码的信心。单元的颗粒度可以小到是一个函数,也是大到是一个类,甚至更大,但是,在单元测试时,由于junit的设计,它对于runnable的对象是忽略 的,所以,在我们的测试过程中,对于多线程的测试就变得困难和不可行。但是,在有些项目中,对多线程的测试又是必须的,难以两全么?现在有了 groboutils,这一切就变得轻松方便了。
    在一些单元测试时,我们有可能需要调用一些类的线程,但是,在junit原有的模型上,要么 runnable对象被忽略了,要么就得调用它的run()方法,但是,这样的调用也就失去了并发性,在想要查看线程之间的调度时,这样的功能是不够的。
    首先来看一段简单的代码,我们有个类来计算pi,还有个去查看即时的pi值。
  1. //class 'calculate pi'
  2. public class pi extends Thread {
  3.         volatile double pi;
  4.         public double getPi() {
  5.                 return this.pi;
  6.         }
  7.         public void setPi(double pi) {
  8.                 this.pi = pi;
  9.         }
  10.         public void run() {
  11.                 calPI();
  12.         }
  13.         private double calPI() {
  14.                 boolean negative = true;
  15.                 for (int i = 3; i < Long.MAX_VALUE; i += 2) {
  16.                         if (negative)
  17.                                 pi -= (1.0 / i);
  18.                         else
  19.                                 pi += (1.0 / i);
  20.                         negative = !negative;
  21.                 }
  22.                 pi += 1.0;
  23.                 pi *= 4.0;
  24.                 return this.pi;
  25.         }
  26.         public pi() {
  27.                 start();
  28.         }
  29. }
  30. //class view the value of pi
  31. public class observer extends Thread {
  32.         pi pi;
  33.         observer(pi pi) throws InterruptedException {
  34.                 this.pi = pi;
  35.                 System.out.println("Start to calculate pi");
  36.                 start();
  37.         }
  38.         public void run() {
  39.                 while (true) {
  40.                         double zz = pi.pi;
  41.                         try {
  42.                                 Thread.sleep(1000);
  43.                                 System.out.println((zz + 1) * 4);
  44.                         } catch (InterruptedException e) {
  45.                                 e.printStackTrace();
  46.                         }
  47.                 }
  48.         }
  49. }
然后,我们进行junit测试。
  1. //测试类
  2. import junit.framework.TestCase;
  3. public class observerTest extends TestCase {
  4.         protected void setUp() throws Exception {
  5.         }
  6.         protected void tearDown() throws Exception {
  7.         }
  8.         public void testObserver() throws InterruptedException {
  9.                 pi temp = new pi();
  10.                 new observer(temp);
  11.         }
  12. }
    很不幸,我们发现,在构造函数初始化时,它忽略了start(),就直接结束了。这显然不是我们想要的结果,在junit中,对于线程,显然是不支持的。 好在有了groboutils,这一些就变得方便和轻松了。作为在junit的框架下面的扩展,如果想要使用支持线程的测试,线程要继承 TestRunnable这个类,并且重载这个类的runTest方法来代替原来的run();进行多线程测试时,通过 MultiThreadedTestRunner来控制线程的启动,先给出改写后的类。

  1. //改写后的pi计算
  2. import net.sourceforge.groboutils.junit.v1.TestRunnable;
  3. public class testpi extends TestRunnable {
  4.         volatile double pi;
  5.         public double getPi() {
  6.                 return this.pi;
  7.         }
  8.         public void setPi(double pi) {
  9.                 this.pi = pi;
  10.         }
  11.         public void runTest() {
  12.                 calPI();
  13.         }
  14.         private double calPI() {
  15.                 boolean negative = true;
  16.                 for (int i = 3; i < Long.MAX_VALUE; i += 2) {
  17.                         if (negative)
  18.                                 pi -= (1.0 / i);
  19.                         else
  20.                                 pi += (1.0 / i);
  21.                         negative = !negative;
  22.                 }
  23.                 pi += 1.0;
  24.                 pi *= 4.0;
  25.                 return this.pi;
  26.         }
  27.         public testpi() {
  28.         }
  29. }
  30. //改写后的ob
  31. import net.sourceforge.groboutils.junit.v1.TestRunnable;
  32. public class testob extends TestRunnable {
  33.         testpi pi;
  34.         testob(testpi pi) throws InterruptedException {
  35.                 this.pi = pi;
  36.                 System.out.println("Start to calculate pi");
  37.         }
  38.         public void runTest() {
  39.                 while (true) {
  40.                         double zz = pi.pi;
  41.                         try {
  42.                                 Thread.sleep(1000);
  43.                                 System.out.println((zz + 1) * 4);
  44.                         } catch (InterruptedException e) {
  45.                                 e.printStackTrace();
  46.                         }
  47.                 }
  48.         }
  49. }

  1. //改写后的测试类
  2. import net.sourceforge.groboutils.junit.v1.MultiThreadedTestRunner;
  3. import net.sourceforge.groboutils.junit.v1.TestRunnable;
  4. import junit.framework.TestCase;
  5. public class groboutil_test1 extends TestCase {
  6.         public void testobserver() throws Throwable {
  7.                 TestRunnable tr1,tr2;
  8.                
  9.                 tr1=new testpi();
  10.                 tr2=new testob((testpi)tr1);
  11.                 TestRunnable[] trs={tr1,tr2};
  12.                 MultiThreadedTestRunner mttr = new MultiThreadedTestRunner(trs);
  13.                 mttr.runTestRunnables();
  14.         }
  15. }
    可以看到,这样,程序又可以正常的启动测试了。通过在testrunnable数组里面任意调用需要的线程, MultiThreadedTestRunner会自己等待所有的线程执行完毕退出后才继续,所以,我们不必自己调用线程的start(),来启动线程, 而且交给 MultiThreadedTestRunner来统一调度,它会统一为线程启动进行异步控制。对于测试者而言,只需把注意力放在自己关注的单元测试上。 并且,它还提供了delay(),isDone()等方法,进一步方便测试者的调试。
    有了GroboUtils,多线程测试从此变得简单而快乐。
    GroboUtils链接: http://groboutils.sourceforge.net/   
Java多线程Junit测试GroboUtils-5.zip Java多线程Junit测试包,支持多线程测试. 立即下载

相关推荐

GroboUtils-5-core.jar

该工具包用于Junit测试多线程,不错的东西,可以下载下来试下。

使用GroboUtils进行多线程的单元测试

1.背景 测试一个方法是否多线程并发安全,编写单元测试用例时发现Junit启动多线程会使用System.exit退出用例执行,无法进行多线程的测试,使用GroboUtils 2.配置 使用maven配置依赖 <dependency> <groupId>net.sourceforge.groboutils</groupId> <artif...

qq_24516549的博客 344

net.sourceforge.groboutils.groboutils-core:5

net.sourceforge.groboutils.groboutils-core:5, 亲测可用

在本地使用GroboUtils进行多线程测试

在本地开发的时候有时候需要用到多线程去测试某些类或者方法是否有线程安全问题,由于本地开发机器硬件限制通过硬编码的方式往往难以达到多个线程同时访问的效果,这时可以考虑使用GroboUtils达到目的。顺便提一句,使用Junit是不行的,去看源代码会发现junit是System.exit退出用例执行的,主线程终止jvm都停了,其他线程肯定执行不了了。     使用GroboUtils可以去下载它的j

sanniao的博客 2896

groboutils

groboutils-core-5.jar 就一个jar包。

pay-facade简易版支付系统源码所需jar包:groboutils-core-5.jar、proton-jms-0.3.0-fuse-2.jar等

包含:groboutils-core-5.jar、fastdfs-client、kaptcha-2.3.2.jar、pinyin4j-2.5.0.jar、proton-jms-0.3.0-fuse-2.jar等

使用GroboUtils解决junit不支持多线程的问题(一次艰苦的踩坑经历,写个单元测试就这么难吗)

背景 最近想用junit写一个多线程实现的单元测试,但是测试结果与期望的不一样,通过debug发现一些实例对象是空的. 这就很让人摸不着头脑了. ???? 原因 通过艰苦卓绝的调查发现竟然是因为junit不支持多线程测试, 这是因为Junit的底层实现上是用System.exit退出用例执行的. JVM都终止了,在测试线程启动的其他线程自然也无法执行 JunitCore代码如下: /** ...

Kainx 748

groboutils-core-5.jar

groboutils-core-5.jar 单元测试多线程

使Junit可以测试多线程的插件:groboutils

使Junit可以测试多线程的插件:groboutils maven依赖: net.sourceforge.groboutils groboutils-core 5 test 注:如果下载失败,则可以选择手动添加 1)手动下载依赖的地址:https://oss.sonatype.org/content/repositories/opensymphony-relea

java小兵 1848

数据讲述中国故事!和鲸助力中国综合社会调查(CGSS)数据分析与可视化大赛圆满收官

用数据研究中国问题、总结中国道路、讲述中国故事。和鲸作为协办单位全程支持本次大赛,为中国人民大学中国调查与数据中心实施全套赛事系统,同时提供完备而周全的赛事运营服务。

ModelWhale的博客 1410

USB之ch376s数据手册

         最近师兄交给我一个项目,虽说刚学嵌入式起步,但上手一个项目怎说都是最好的快速学习方式。因为刚了解ch376s管理U盘的数据,所以先是看了ch376s的数据手册。那我就把数据手册直接放上来吧。。。。      1、概述 CH376 是文件管理控制芯片,用于单片机系统读写 U 盘或者 SD 卡中的文件。 CH376 支持 USB 设备方式和 USB 主机方式,并且内置了 USB 通...

iBGG的博客 6004

Spring Boot单元测试:GroboUtils多线程测试

简介 Junit本身是不支持是多线程测试的,因为Junit的底层实现上,是用System.exit退出用例执行的。JVM终止了在测试线程启动的其他线程自然也无法执行。 GroboUtils旨在扩展Java测试的可能性。它包含许多子项目,通过Java进行不同方面的测试。GroboUtils中包含的流行工具包括多线程测试、层次单元测试和代码覆盖工具。 这个工具集是在MIT许可下发布的。 官网地址:groboutils 使用方法 1. 导入POM依赖 <dependency> <g

yanyuan_1118的专栏 1844

【软路由】旁路由使用配置教程

【软路由】旁路由使用配置教程简介旁路由好处旁路由配置步骤1、修改管理地址网段 简介 我们都知道,软路由一般有两种使用方式,一种是作为承担DHCP分配的主路由,而另一种就是作为不承担DHCP分配功能的旁路由使用。今天就来介绍如何将软路由配置成为旁路由。 旁路由好处 旁路由最大的好处就是它不承担DHCP分配任务,这意味着它的对网络的影响极小。即使突然故障也不会导致整个网络瘫痪。更别提软路由的配置复杂,用户可能还经常修改上面的网络配置,一旦出错就是整个网络瘫痪,如果家中还有其他人使用网络,影响实在是不好。 建议有

博客 4万+

Junit使用GroboUtils进行多线程测试

写过Junit单元测试的同学应该会有感觉,Junit本身是不支持普通的多线程测试的,这是因为Junit的底层实现上,是用System.exit退出用例执行的。JVM都终止了,在测试线程启动的其他线程自然也无法执行。JunitCore代码如下: /**       * Run the tests contained in the classes named in the args.       *

qq_30044187的博客 957

开关电源EMI滤波设计:如何通过Cx和Cy电容精准抑制共模与差模干扰?

本文深入解析了开关电源EMI滤波设计中Cx和Cy电容的核心作用。Cx电容并联于火线与零线之间,专用于抑制差模干扰;Cy电容连接于火线/零线与地之间,则负责泄放共模干扰。文章详细阐述了二者选型、安规要求及PCB布局要点,并提供了基于测试频谱的实战调优策略,是解决电源传导噪声问题的实用指南。

7z8x2c4v6b9的博客 466

SCRFD算法解读及环境安装实践

SCRFD检测算法及环境安装

lishanlu136的博客 1009

junit可以测试多线程的插件:groboutils

实际上junit是不支持多线程的,但是我们可以使用插件,groboutils 就解决了这个问题。 <!-- https://mvnrepository.com/artifact/net.sourceforge.groboutils/groboutils-core --> <dependency> <groupId>net.sourceforge.grobout...

wjavadog的博客 691

均值回归 高频交易_基于布林带的均值回归交易策略

BOLL指标是美国股市分析家约翰·布林根据统计学中的标准差原理设计出来的一种非常简单实用的技术分析指标。一般而言,股价的运动总是围绕某一价值中枢(如均线、成本线等)在一定的范围内变动,布林线指标正是在上述条件的基础上,引进了“股价通道”的概念,其认为股价通道的宽窄随着股价波动幅度的大小而变化,而且股价通道又具有变异性,它会随着股价的变化而自动调整。由于之前大部分交易策略都是选股或者趋势追踪的择时,...

weixin_42528534的博客 1458

Junit4 GroboUtils多线程测试

利用JUNIT4,GroboUtils进行多线程测试 多线程编程和测试一直是比较难搞的事情,特别是多线程测试。只用充分的测试,才可以发现多线程编码的潜在BUG。下面就介绍一下我自己在测试多线程并发程序时用的一个比较简单好用的测试工具类库。即JUNIT4和GroboUtils。 废话不多说,把代码贴出来,大家一看就明白了。 import java.util.ArrayList;

3128

TP4054充电电路发热严重?手把手教你调整电阻值降低温度(附实测数据)

本文针对TP4054锂电池充电电路发热严重的问题,提供了详细的排错与解决方案。通过分析发热原理,指出核心在于PROG引脚电阻值设定,并手把手指导如何计算和选择正确的电阻以降低充电电流与温度。文末附有不同电阻下的实测温度与性能数据,为电子爱好者和工程师提供了实用的调试参考。

p4q5r6s7t的博客 406

ESP32学习,驱动LED点阵屏,SD卡播放GIF动图

搬运就可以实现效果,如果有不足,请批评指正。下步该学一下如何文章上视频了,老是截图不方便展示效果。

u011625956的博客 1868

使用GroboUtils进行jUnit的多线程测试

使用GroboUtils进行jUnit的多线程测试   jUnit不支持多线程测试(具体表现为,在@Test标记的方法中启动多线程测试,这是多线程中的Assert方法失效 具体原因是jUnit执行器执行的时候,执行线程很快退出,在多线程中还没有调用Assert的时候主线程就退出了, 而且,貌似jUnit也不会检测其他线程中调用Assert方法,即使其他线程中Assert方法失败了, 总...

Jack_Yin的专栏 382

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

上一篇: 博客增量抓取系统的难点之RSS增量抓取策略
下一篇: mysql优化: 内存表和临时表
CICTech
博客等级 码龄19年 26粉丝 20原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值