`
daoyongyu
  • 浏览: 123535 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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操作结束");
	}
}

参考文章:
[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]
1
1
分享到:
评论
1 楼 cosmo1987 2012-03-28  
感觉这样是不是要把原本写的继承自Thread的类全部改写成继承自TestRunnable,并且其中的run方法改写成runTest。

可能自己不知道如何把执行方法和线程创建分离开来。如果按照目前贴出的代码的话,我测试完线程之后,要把所有类改写回去也是一个麻烦事。如果类一多的话,问题就来了。难免会遗漏。

不知道有没有更加好的方法来实现多线程测试?

相关推荐

Global site tag (gtag.js) - Google Analytics