JUNIT4 GroboUtils多线程测试
利用JUNIT4,GroboUtils进行多线程测试
多线程编程和测试一直是比较难搞的事情,特别是多线程测试。只用充分的测试,才可以发现多线程编码的潜在BUG。下面就介绍一下我自己在测试多线程并发程序时用的一个比较简单好用的测试工具类库。即JUNIT4和GroboUtils。
废话不多说,把代码贴出来,大家一看就明白了。
- import java.util.ArrayList;
- import java.util.HashSet;
- import java.util.Hashtable;
- import java.util.List;
- import java.util.Map;
- import java.util.Set;
- import net.sourceforge.groboutils.junit.v1.MultiThreadedTestRunner;
- import net.sourceforge.groboutils.junit.v1.TestRunnable;
- import org.junit.After;
- import org.junit.Before;
- import org.junit.Test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- public class MutiThreadTest {
- //此处可以声明一些公共变量
- static ApplicationContext context = null;
- static String[] path = new String[] { "" };
- static Map<String, String> countMap = new Hashtable<String, String>();
- static Map<String, String> countMap2 = new Hashtable<String, String>();
- static Set<String> countSet = new HashSet<String>();
- static List<String> list = new ArrayList<String>();
- @Before
- public void setUp() throws Exception {
- context = new ClassPathXmlApplicationContext(path);
- }
- @After
- public void tearDown() throws Exception {
- context = null;
- }
- /**
- * JUNIT会运行这个方法,是主线程
- */
- @Test
- public void testThreadJunit() throws Throwable {
- //TestRunnable,实例化自定义的7个线程
- TestRunnable tr1, tr2, tr3, tr4, tr5, tr6, tr7;
- tr1 = new ThreadA();
- tr2 = new ThreadB();
- tr3 = new ThreadC();
- tr4 = new ThreadD();
- tr5 = new ThreadE();
- tr6 = new ThreadF();
- tr7 = new ThreadG();
- //必须声明为一个数组,把该数组当参数传递给 MultiThreadedTestRunner
- TestRunnable[] trs = { tr1, tr2, tr3, tr4, tr5, tr6, tr7 };
- //不需改动
- MultiThreadedTestRunner mttr = new MultiThreadedTestRunner(trs);
- //执行MTTR和7线程
- mttr.runTestRunnables();
- }
- /**
- * 要运行多线程,首先要实现自定义的线程</br>
- * 如下我定义了A,B,C,D,E,F,G七个线程</br>
- * 注意:自定义线程必须要继承TestRunnable</br>
- * 并且覆盖runTest()方法
- *
- */
- private class ThreadA extends TestRunnable {
- @Override
- public void runTest() throws Throwable {
- //线程要调用的方法或者要执行的操作
- myCommMethod2();
- }
- }
- private class ThreadB extends TestRunnable {
- @Override
- public void runTest() throws Throwable {
- myCommMethod2();
- }
- }
- private class ThreadC extends TestRunnable {
- @Override
- public void runTest() throws Throwable {
- myCommMethod2();
- }
- }
- private class ThreadD extends TestRunnable {
- @Override
- public void runTest() throws Throwable {
- myCommMethod2();
- }
- }
- private class ThreadE extends TestRunnable {
- @Override
- public void runTest() throws Throwable {
- myCommMethod2();
- }
- }
- private class ThreadF extends TestRunnable {
- @Override
- public void runTest() throws Throwable {
- myCommMethod2();
- }
- }
- private class ThreadG extends TestRunnable {
- @Override
- public void runTest() throws Throwable {
- myCommMethod2();
- }
- }
- /**
- * 线程要调用的方法。在此方法中</br>
- * 实现你的多线程代码测试。
- * @throws Exception
- */
- public void myCommMethod2() throws Exception {
- System.out.println("线程===" + Thread.currentThread().getId() + "执行myCommMethod2操作开始");
- for (int i = 0; i <10; i++) {
- int a = i*5;
- System.out.println(a);
- }
- System.out.println("线程===" + Thread.currentThread().getId() + "执行myCommMethod2操作结束");
- }
- }
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.Set; import net.sourceforge.groboutils.junit.v1.MultiThreadedTestRunner;
import net.sourceforge.groboutils.junit.v1.TestRunnable; import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class MutiThreadTest {
//此处可以声明一些公共变量
static ApplicationContext context = null;
static String[] path = new String[] { "" };
static Map<String, String> countMap = new Hashtable<String, String>();
static Map<String, String> countMap2 = new Hashtable<String, String>();
static Set<String> countSet = new HashSet<String>();
static List<String> list = new ArrayList<String>();@Before
public void setUp() throws Exception {
context = new ClassPathXmlApplicationContext(path);
} @After
public void tearDown() throws Exception {
context = null;
}
/**
* JUNIT会运行这个方法,是主线程
*/
@Test
public void testThreadJunit() throws Throwable {
//TestRunnable,实例化自定义的7个线程
TestRunnable tr1, tr2, tr3, tr4, tr5, tr6, tr7;
tr1 = new ThreadA();
tr2 = new ThreadB();
tr3 = new ThreadC();
tr4 = new ThreadD();
tr5 = new ThreadE();
tr6 = new ThreadF();
tr7 = new ThreadG();
//必须声明为一个数组,把该数组当参数传递给 MultiThreadedTestRunner
TestRunnable[] trs = { tr1, tr2, tr3, tr4, tr5, tr6, tr7 };
//不需改动
MultiThreadedTestRunner mttr = new MultiThreadedTestRunner(trs);
//执行MTTR和7线程
mttr.runTestRunnables();
} /**
* 要运行多线程,首先要实现自定义的线程</br>
* 如下我定义了A,B,C,D,E,F,G七个线程</br>
* 注意:自定义线程必须要继承TestRunnable</br>
* 并且覆盖runTest()方法
*
*/
private class ThreadA extends TestRunnable {
@Override
public void runTest() throws Throwable {
//线程要调用的方法或者要执行的操作
myCommMethod2();
}
} private class ThreadB extends TestRunnable {
@Override
public void runTest() throws Throwable {
myCommMethod2();
}
} private class ThreadC extends TestRunnable {
@Override
public void runTest() throws Throwable {
myCommMethod2();
}
} private class ThreadD extends TestRunnable {
@Override
public void runTest() throws Throwable {
myCommMethod2();
}
} private class ThreadE extends TestRunnable {
@Override
public void runTest() throws Throwable {
myCommMethod2();
}
} private class ThreadF extends TestRunnable {
@Override
public void runTest() throws Throwable {
myCommMethod2();
}
} private class ThreadG extends TestRunnable {
@Override
public void runTest() throws Throwable {
myCommMethod2();
}
} /**
* 线程要调用的方法。在此方法中</br>
* 实现你的多线程代码测试。
* @throws Exception
*/
public void myCommMethod2() throws Exception {
System.out.println("线程===" + Thread.currentThread().getId() + "执行myCommMethod2操作开始");
for (int i = 0; i <10; i++) {
int a = i*5;
System.out.println(a);
}
System.out.println("线程===" + Thread.currentThread().getId() + "执行myCommMethod2操作结束");
}
}
参考文章:
[url]
http://www.ibm.com/developerworks/cn/java/j-lo-test-multithread/index.html?ca=drs-
[/url]
[url]
http://groboutils.sourceforge.net/index.html[/url]
<ul>
<li><a href="http://dl.iteye.com/topics/download/9a171d91-b8f2-34cd-934e-5207ccdb61ab">JUNIT多线程测试.rar</a> (141.5 KB)</li>
<li>下载次数: 104</li>
</ul>
JUNIT4 GroboUtils多线程测试的更多相关文章
- Junit使用GroboUtils进行多线程测试
写过Junit单元测试的同学应该会有感觉,Junit本身是不支持普通的多线程测试的,这是因为Junit的底层实现上,是用System.exit退出用例执行的.JVM都终止了,在测试线程启动的其他线程自 ...
- 关于JUnit4无法支持多线程测试的解决方法
转自:https://segmentfault.com/a/1190000003762719 其实junit是将test作为参数传递给了TestRunner的main函数.并通过main函数进行执行. ...
- 使用Spring+Junit4.4进行测试(使用注解)
http://nottiansyf.iteye.com/blog/345819 使用Junit4.4测试 在类上的配置Annotation @RunWith(SpringJUnit4ClassRunn ...
- 用Spring+Junit4.4进行测试(使用注解)
http://nottiansyf.iteye.com/blog/345819 使用Junit4.4测试 在类上的配置Annotation @RunWith(SpringJUnit4ClassRunn ...
- 使用Spring+Junit4.4进行测试
http://nottiansyf.iteye.com/blog/345819 使用Junit4.4测试 在类上的配置Annotation @RunWith(SpringJUnit4ClassRunn ...
- testng入门教程12 TestNG执行多线程测试
testng入门教程 TestNG执行多线程测试 testng入门教程 TestNG执行多线程测试 并行(多线程)技术在软件术语里被定义为软件.操作系统或者程序可以并行地执行另外一段程序中多个部分或者 ...
- TestNG多线程测试-注解方式实现
用@Test(invocationCount = x,threadPoolSize = y)声明,invocationCount表示执行次数,threadPoolSize表示线程池大小. packag ...
- TestNg之XMl形式实现多线程测试
为什么要使用多线程测试? 在实际测试中,为了节省测试时间,提高测试效率,在实际测试场景中经常会采用多线程的方式去执行,比如爬虫爬数据,多浏览器并行测试. 关于多线程并行测试 TestNG中实现多线程并 ...
- TestNG 多线程测试
TestNG以注解的方式实现多线程测试 import org.testng.annotations.Test; public class TreadDemo { // invocationCount ...
随机推荐
- linux 系统时间 硬件时间
Linux时钟分为系统时钟(System Clock)和硬件时钟(Real Time Clock,简称RTC).系统时钟是指当前Linux Kernel中的时钟:而硬件时钟则是主板上由电池供电的时钟, ...
- mysql FIRST()函数 语法
mysql FIRST()函数 语法 作用:返回指定的字段中第一个记录的值.直线电机选型 语法:SELECT FIRST(column_name) FROM table_name 注释:可使用 ORD ...
- .NET面试题系列(二十)XX
遍历树.实现造成锁的代码.在线音乐网站 抽象工厂和工厂的区别 简单工厂 : 用来生产同一等级结构中的任意产品.(对于增加新的产品,无能为力) 工厂方法 :用来生产同一等级结构中的固定产品.(支持增加任 ...
- BZOJ 3193: [JLOI2013]地形生成 计数 + 组合 + 动态规划
第一问: 先不考虑山的高度有相同的:直接按照高度降序排序,试着将每一座山插入到前面山的缝隙中. 当然,这并不代表这些山的相对位置是固定的,因为后面高度更低的山是有机会插入进来的,所以就可以做到将所有情 ...
- C/C++中的转义字符
在C语言中有三种转义字符,它们是:一般转义字符.八进制转义字符和十六进制转义字符. 1.一般转义字符 这种转义字符,虽然在形式上由两个字符组成,但只代表一个字符.常用的一般转义字符为: \a \n \ ...
- Mysql安装及用简单用法
Mysql安装和初始化 初见: Mysql软件 - 服务端软件 - 服务端程序 - 解析指令 - 对文件的操作 - 客户端软件 - 客户端程序 - 发送指令(sql语句) - 解析指令 其他类似软件: ...
- 基于OpenCV/TensorFlow的手写MNIST文字匹配
手写文字具有哪些统一特征?用ML和SVM是如何做到的? 检测 特征匹配 文字识别 毕竟汉语言文字奇形怪状,很不好辨认,尤其是手写体,跟英文字母不同. MNIST一共有哪些库 现实环境更是复杂 有时还只 ...
- 苹果cms开启防红跳转后,提示模板文件不存在解决方法
1,苹果cms开启防红跳转后,提示模板文件不存在(如下图)这是因为你使用的模板里面缺少苹果cms自带的防红跳转模板导致,遇到这种状况后需要把苹果cms默认自带的( template/default_p ...
- vue.js 深度监测
1.select 控件赋值改变,但是无法获取 解决方法,在监测时手动赋值新值 'model.UseType': { handler(newVal, oldVal) { $("#UseType ...
- Spring Cloud Stream教程(四)消费群体
虽然发布订阅模型可以轻松地通过共享主题连接应用程序,但通过创建给定应用程序的多个实例来扩展的能力同样重要.当这样做时,应用程序的不同实例被放置在竞争的消费者关系中,其中只有一个实例预期处理给定消息. ...