多线程的单元测试工具 - GroboUtils

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

  1. /** 
  2.      * Run the tests contained in the classes named in the <code>args</code>. 
  3.      * If all tests run successfully, exit with a status of 0. Otherwise exit with a status of 1. 
  4.      * Write feedback while tests are running and write 
  5.      * stack traces for all failed tests after the tests all complete. 
  6.      * @param args names of classes in which to find tests to run 
  7.      */ 
  8.     public static void main(String... args) { 
  9.         runMainAndExit(new RealSystem(), args); 
  10.     } 
  11.  
  12.     /** 
  13.      * Do not use. Testing purposes only. 
  14.      * @param system  
  15.      */ 
  16.     public static void runMainAndExit(JUnitSystem system, String... args) { 
  17.         Result result= new JUnitCore().runMain(system, args); 
  18.         system.exit(result.wasSuccessful() ? 0 : 1); 
  19.     } 

 

RealSystem.java:

  1. public void exit(int code) { 
  2.  
  3.         System.exit(code); 
  4.  
  5.     } 

 

所以要想编写多线程Junit测试用例,就必须让主线程等待所有子线程执行完成后再退出。想到的办法自然是Thread中的join方法。话又说回来,这样一个简单而又典型的需求,难道会没有第三方的包支持么?通过google,笔者很快就找到了GroboUtils这个Junit多线程测试的开源的第三方的工具包。
GroboUtils官网如下:
http://groboutils.sourceforge.net/
下载页面:
http://groboutils.sourceforge.net/downloads.html
Maven依赖方式:
  1. <dependency> 
  2.       <groupId>net.sourceforge.groboutils</groupId> 
  3.       <artifactId>groboutils-core</artifactId> 
  4.       <version>5</version> 
  5.     </dependency> 

 

 

 

注:需要第三方库支持:
RepositoryOpensymphony Releases
Repository urlhttps://oss.sonatype.org/content/repositories/opensymphony-releases
依赖好Jar包后就可以编写多线程测试用例了。上手很简单:
  1. /** 
  2.      * 多线程测试用例 
  3.      *  
  4.      * @author lihzh(One Coder) 
  5.      * @date 2012-6-12 下午9:18:11 
  6.      * @blog http://www.coderli.com 
  7.      */ 
  8.     @Test 
  9.     public void MultiRequestsTest() { 
  10.                 // 构造一个Runner 
  11.         TestRunnable runner = new TestRunnable() { 
  12.             @Override 
  13.             public void runTest() throws Throwable { 
  14.                 // 测试内容 
  15.             } 
  16.         }; 
  17.         int runnerCount = 100; 
  18.                 //Rnner数组,想当于并发多少个。 
  19.         TestRunnable[] trs = new TestRunnable[runnerCount]; 
  20.         for (int i = 0; i < runnerCount; i++) { 
  21.             trs[i] = runner; 
  22.         } 
  23.                 // 用于执行多线程测试用例的Runner,将前面定义的单个Runner组成的数组传入 
  24.         MultiThreadedTestRunner mttr = new MultiThreadedTestRunner(trs); 
  25.         try { 
  26.                         // 开发并发执行数组里定义的内容 
  27.             mttr.runTestRunnables(); 
  28.         } catch (Throwable e) { 
  29.             e.printStackTrace(); 
  30.         } 
  31.     } 

 

执行一下,看看效果。怎么样,你的Junit也可以执行多线程测试用例了吧:)。

本文出自One Coder博客,出处: http://www.coderli.com/archives/multi-thread-junit-grobountils/

转载于:https://www.cnblogs.com/xujanus/p/5530444.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/490657.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习opencv 英文版_B站上适合程序员的学习资源【赶紧收藏!】

“二次元&#xff0c;鬼畜&#xff0c;动漫”是大家提到B站&#xff0c;最容易冒出来的关键词&#xff01;然而央视网一条微博却表示&#xff1a;过去一年有近2000万人在B站学习&#xff0c;相当于去年高考人数的2倍&#xff01;B站正在成为年轻人学习的首要阵地。下面整理一些…

Matlab读取json文件

Matlab读取json文件 在matlab中&#xff0c;可以将数据写入json文件&#xff0c;却没发现读取json的函数&#xff0c;网上查了一下&#xff0c;大部分是个人写的函数&#xff0c;再可执行性上可能会有一些问题。最终&#xff0c;还是发现了一个matlab解析json文件的工具包&…

追问人工智能

来源&#xff1a;人机与认知实验室前段时间&#xff0c;英国公司登记处的一份文件披露了 DeepMind 2018 年的财务状况&#xff1a;这家 AI 科技公司的净亏损由 2017 年的 3.41 亿美元增加至 2018 年的 5.72 亿美元&#xff0c;今年到期的债务高达 12.656 亿美元。如此巨额的亏损…

matplotlib旋转y轴标题为垂直方向

设置 rotation参数可以随意调节y轴标题方向&#xff0c; rotation默认为90&#xff0c;如果想将y轴标题调为垂直方向&#xff0c;则设为0 ax[0].set_ylabel(A, fontdict{size: 16}, rotation0) 但这样也会带来一些问题&#xff0c;比如旋转后的标题不是位于上下方向的居中位置…

安卓系统挂载NTFS格式硬盘_苹果电脑挥之不去的烦恼!怎样兼容NTFS格式的U盘移动硬盘?...

[PConline 应i用]很多用苹果电脑的朋友&#xff0c;都经常会遇到这样的烦恼&#xff1a;插入某个U盘或者移动硬盘&#xff0c;发现只能读取文件&#xff0c;没法把文件复制进去&#xff01;这是因为这个U盘或者移动硬盘&#xff0c;使用的是NTFS格式&#xff0c;这也是Windows御…

dubbo工作原理

part -- 外挂1.dubbo借助spring的schema启动和初始化 1.1 spring扫描所有jar下META-INF的spring.handlers和spring.schemas。 1.2 运行spring.handlers下定义的DubboNamespaceHandler的init方法。 1.3 spring加载xml&#xff0c;执行DubboBeanDefinitionParser的parse方法&…

问题:AttributeError: 'Tensor' object has no attribute 'creator'

AttributeError: Tensor object has no attribute creator 根据pytorch官方文档的说法&#xff0c;变量具有如上的三个属性&#xff0c;在获取y操作的creator属性时&#xff0c;却出现没有该属性的错误。 import torch from torch.autograd import Variable x Variable(torch…

matplotlib的colorbar自定义刻度范围

如以下程序将colorbar的范围从0-1变为0-10 import matplotlib.ticker as tickerdef fmt1(x,pos): # 设置colorbar的刻度值return int(x*10)fig plt.figure() ax fig.gca() im ax.imshow(np.random.random([10, 10])) plt.colorbar(im, fraction0.03, pad0.05, formattick…

ACL 2019年度回顾:自然语言处理发展趋势

大数据文摘出品来源&#xff1a;mihaileric编译&#xff1a;赵伟、邢畅、张秋玥今年7月底&#xff0c;计算语言学协会年会&#xff08;ACL&#xff09;在风景优美的佛罗伦萨召开。会场设在了一座古老的Medici家族的城堡中。作为NLP研究最大规模的会议之一&#xff0c;ACL 2019的…

Python基础:获取迭代器下一项目的常见操作

目录 获取迭代器下一项目通常有三种方法 python3中最常见的一种错误使用 获取迭代器下一项目通常有三种方法 next()函数iterator.__next__()属性for循环 next()函数 iterator iter([1,2,3,4,5,6]) a next(iterator) print(a) b next(iterator) print(b) 输出&#xff1…

电商项目的并发量一般是多少_掌握这些,高并发秒杀系统就不用担心了!

很多小伙伴反馈说&#xff0c;高并发专题学了那么久&#xff0c;但是&#xff0c;在真正做项目时&#xff0c;仍然不知道如何下手处理高并发业务场景!图片来自 Pexels甚至很多小伙伴仍然停留在只是简单的提供接口(CRUD)阶段&#xff0c;不知道学习的并发知识如何运用到实际项目…

7.python xmlrpclib及allownone作用

__author__ Administrator from xmlrpclib import ServerProxy connServerProxy("http://192.168.8.137:2003") aconn.black_remove("192.168.12.187") bconn.commit_now() print a xmlrpc是基于http协议的远程函数调用&#xff0c;xmlrpc中具有一个你常…

matplotlib的colorbar设置显示的刻度个数和指定的刻度值

通过matplotlib.ticker.MaxNLocator(nbinsn)来设置colorbar上的刻度值个数 import matplotlib.ticker as ticker fig plt.figure() ax fig.gca() im ax.imshow(np.random.random([10, 10])) cb1 plt.colorbar(im, fraction0.03, pad0.05) tick_locator ticker.MaxNLocato…

Windows下MySQL数据库更改数据存储位置

Windows下MySQL数据库更改数据存储位置 1、创建一个新的存储数据文件 比如&#xff0c;我创建了一个文件 E:\MySQL_Service &#xff0c;用来放mysql数据。 2、找到配置文件my.ini和mysql原本数据存放位置 之前用的是默认安装位置&#xff0c;我的电脑数据存放的默认路径为…

python中def main是什么意思_关于python:为什么使用def main()?

本问题已经有最佳答案&#xff0c;请猛点这里访问。 Possible Duplicate: What does if __name__"__main__" do? 我看过一些代码示例和教程 1 2 3 4 5def main(): # my code here if __name__ "__main__": main() 但是为什么呢&#xff1f;有没有什么理由…

华为5G手机芯片被唱衰:美研究机构拆解6款量产机,不谈能力对标高通骁龙X50...

来源&#xff1a;凹非寺全球5G手机芯片到底哪家强&#xff1f;能力上来看&#xff0c;量产的华为巴龙5000参数超过骁龙X50&#xff0c;但最近英国研究机构IHS Markit拆解6款5G手机后给出另一面结论&#xff1a;华为手机5G&#xff0c;没高通骁龙有竞争力。IHS的结论&#xff0c…

CSS3-06 样式 5

浮动&#xff08;Float&#xff09; 关于浮动&#xff0c;要说的可能就是&#xff1a;一个设置了浮动的元素会尽量向左移动或向右移动&#xff0c;且会对其后的元素造成影响&#xff0c;其后的元素会排列在其围绕在其左下或右下部。似乎就这么简单&#xff0c;但是在实际开发中…

python将数据写入Excel

import xlsxwriter workbook xlsxwriter.Workbook(D:\data.xlsx, {nan_inf_to_errors: True}) #创建一个Excel文件 worksheet workbook.add_worksheet() #创建一个sheettitle [U1,U2,U3,U4,U5,U6,U7,U8,U9,U10] #表格title worksheet.write_row(A1,title…

python脚本编程实例_从零学python系列之数据处理编程实例(一)

要求&#xff1a;分别以james&#xff0c;julie&#xff0c;mikey&#xff0c;sarah四个学生的名字建立文本文件&#xff0c;分别存储各自的成绩&#xff0c;时间格式都精确为分秒&#xff0c;时间越短成绩越好&#xff0c;分别输出每个学生的无重复的前三个最好成绩&#xff0…

量子纠缠为什么不能用于瞬时通讯?

来源&#xff1a;数学职业家什么是信息&#xff1f; 信息的一个比较被认可的定义是1948年数学家香农在论文中提出的&#xff1a;信息是用来消除随机不定性的东西。比如&#xff0c;盒子里有一个硬币&#xff0c;它可以是正面向上&#xff0c;也可以是反面向上&#xff0c;在打开…