Junit使用GroboUtils进行多线程测试

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


/**

* Run the tests contained in the classes named in the <code>args</code>.

* If all tests run successfully, exit with a status of 0. Otherwise exit with a status of 1.

* Write feedback while tests are running and write

* stack traces for all failed tests after the tests all complete.

* @param args names of classes in which to find tests to run

*/

public static void main(String... args) {

runMainAndExit(new RealSystem(), args);

}

/**

* Do not use. Testing purposes only.

* @param system

*/

public static void runMainAndExit(JUnitSystem system, String... args) {

Result result= new JUnitCore().runMain(system, args);

system.exit(result.wasSuccessful() ? 0 : 1);

}

RealSystem.java:

public void exit(int code) {

System.exit(code);

}

  所以要想编写多线程Junit测试用例,就必须让主线程等待所有子线程执行完成后再退出。想到的办法自然是Thread中的join方法。话又说回来,这样一个简单而又典型的需求,难道会没有第三方的包支持么?通过google,很快就找到了GroboUtils这个Junit多线程测试的开源的第三方的工具包。

  GroboUtils官网下载解压后 使用 GroboUtils-5\lib\core\GroboTestingJUnit-1.2.1-core.jar 这个即可

  GroboUtils是一个工具集合,里面包含各种测试工具,这里使用的是该工具集中的jUnit扩展.

  依赖好Jar包后就可以编写多线程测试用例了。上手很简单:

package com.junittest.threadtest;

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.Test;

public class MutiThreadTest {

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>();

@Test

public void testThreadJunit() throws Throwable {

//Runner数组,想当于并发多少个。

TestRunnable[] trs = new TestRunnable [10];

for(int i=0;i<10;i++){

trs[i]=new ThreadA();

}

// 用于执行多线程测试用例的Runner,将前面定义的单个Runner组成的数组传入

MultiThreadedTestRunner mttr = new MultiThreadedTestRunner(trs);

// 开发并发执行数组里定义的内容

mttr.runTestRunnables();

}

private class ThreadA extends TestRunnable {

@Override

public void runTest() throws Throwable {

// 测试内容

myCommMethod2();

}

}

public void myCommMethod2() throws Exception {

System.out.println("===" + Thread.currentThread().getId() + "begin to execute myCommMethod2");

for (int i = 0; i <10; i++) {

int a  = i*5;

System.out.println(a);

}

System.out.println("===" + Thread.currentThread().getId() + "end to execute myCommMethod2");

}

}

 运行时需依赖log4j的jar文件,GroboUtils的jar包。

  主要关注3个类:TestRunnable,TestMonitorRunnable,MultiThreadedTestRunner,全部来自包:net.sourceforge.groboutils.junit.v1.MultiThreadedTestRunner.

  (1) TestRunnable 抽象类,表示一个测试线程,实例需要实现该类的runTest()方法,在该方法中写自己用的测试代码.该类继承了jUnit的junit.framework.Assert类,所以可以在TestRunnable中使用各种Assert方法

  (可惜因为GroboUtils使用的jUnit版本较老,且久未更新,新版本的jUnit中已经不推荐使用这个类的方法了).该类实现了Runnable,在run方法中调用抽象方法runTest().

  (2)   MultiThreadedTestRunner

  这个类相当与一个ExecuteService,可以用来执行 TestRunnable,构造函数需要传入TestRunnable数组,表示需要测试的线程.调用MultiThreadedTestRunner.runTestRunnables() 方法启动测试线程,开始执行测试.

  这个方法默认让测试线程TestRunnable的run方法最多运行1天,也可以调用MultiThreadedTestRunner.runTestRunnables(long maxTime) 这个方法,然测试线程TestRunnable最多执行 maxTime 毫秒.如果超过maxTime毫秒之后,TestRunnable还没有执行完毕,则TestRunnable会被中断,并且MultiThreadedTestRunner 会抛出异常,导致测试失败fail("Threads did not finish within " + maxTime + " milliseconds.").每个TestRunnable中runTest需要能够控制自己在什么时间自己结束自己,精确控制测试时间,不要利用上面的maxTime.

  (3) TestMonitorRunnable

  表示监控线程,可以让每一个TestRunnable对应一个TestMonitorRunnable,在TestMonitorRunnable中监控TestRunnable.TestMonitorRunnable是TestRunnable的子类,提供了一些方便使用的方法.

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-11-10 08:26:56

Junit使用GroboUtils进行多线程测试的相关文章

多线程测试类,运行找不到main方法,求大神洞悉问题

问题描述 多线程测试类,运行找不到main方法,求大神洞悉问题 public class hello { static class hello1 extends Thread { public hello1() { } public hello1(String name) { this.name = name; } public void run() { for (int i = 0; i < 5; i++) { System.out.println(name + "运行 " +

TestNg多线程测试----平行化测试

原创文章,版权所有,允许转载,标明出处:http://blog.csdn.net/wanghantong/article/details/40394625 我们在开发过程中经常会遇到多线程的编程,比如最常见的几种情况: 1.互不通信的多线程模式 2.基于共享容器协同的多线程模式 3.通过事件协同的多线程模式  4.多进程的模式 这里我们不去详细讨论每种方式的开发方法,但是我们会首先想到一个问题,如何进行多线程代码的测试? TestNg给出了关于多线程平行化的测试解决方案: 通过在配置文件配置的方

一款C#多线程测试实例

一款c#多线程测试实例 简单实例 namespace xxx {     public class tclass     {          static tclass()          {              thread r = new thread(new threadstart(inusrgame));              r.start();          }     } } 详细多线程 using system; using system.threading;

多线程测试工具groboutils的使用

一直使用junit做为服务测试框架,感觉不错.最近有人反映在高并发的情况下,存在服务调不到.无奈再次打开单元测试模拟高并发的情况,却发现junit不支持并发测试 引入groboutils jar包,其实我主要使用MultiThreadedTestRunner类和TestRunnable类. 原有的junit框架不做改变,导入GroboTestingJUnit-1.2.1-core.jar包 代码如下 public class FaultServiceTest extends TestCase {

JUnit中按照顺序执行测试方式

很多情况下,写了一堆的test case,希望某一些test case必须在某个test case之后执行.比如,测试某一个Dao代码,希望添加的case在最前面,然后是修改或者查询,最后才是删除,以前的做法把所有的方法都集中到某一个方法去执行,一个个罗列好,比较麻烦.比较幸福的事情就是JUnit4.11之后提供了MethodSorters,可以有三种方式对test执行顺序进行指定,如下: /** * Sorts the test methods by the method name, in l

【多线程】java多线程 测试例子 详解wait() sleep() notify() start() join()方法 等

java实现多线程,有两种方法: 1>实现多线程,继承Thread,资源不能共享 2>实现多线程  实现Runnable接口,可以实现资源共享 *wait()方法 在哪个线程中调用 则当前线程处于等待状态[在main方法中调用A.wait(),则是main线程等待,而不是A线程等待] * join()方法 作用类似与wait()方法 理解:如上处调用join()方法 * [注意:在A线程中调用B.join()--------表示A一直等待,直到B运行完成后才继续运行A] * 在A线程中调用B.

单元性能测试之使用JUnitPerf测试多线程并发

简介: 单元测试和性能测试在测试领域属于要求相对较高的测试活动,也是测试工程师成长.向上发展的反向.单元测试评测我们的代码实现功能的情况,性能测试则企图分析应用程序的性能表现和负载能力.那么"单元性能测试"能做什么?我们可以这样说,单元性能测试以单元测试的形式对代码进行性能测试.单元性能测试像单元测试一样,需要测试人员编写测试代码,但现在关注的不是代码的功能实现情况了,而是想得到被测试代码的性能数据,包括执行方法耗时.多线程并发是否线程安全.内存是否泄漏.是否存在短期循环对象等.单元性

JUnit多线程Test

    今天测试SimpleDateFormat时用到多线程,但最初Junit并不理想,Mark一下.      Junit多线程测试如下,直接run会发现程序没有任何异常,但debug时SimpleDateFormatUtil却ParseException异常,说明Junit在多线程下Test是有bug的.[SimpleDateFormatUtil为Date解析工具类] @Test public void threadTest() {         for (int i = 0; i < 3

spring junit测试

利用spring的mock类进行单元测试: spring框架提供了大量测试的mock类,包括与jndi,porlet,web应用相关的mock类.尤其是web应用相关 的mock类,可以大大提高web组件测试的方便性. 打开spring的下载包的mock文件夹(路径...mock\org\springframework\mock\web),就发觉有如下几个 文件: MockHttpServletRequest:是HttpServletRequest接口的mock实现,用来模拟客户端的HTTP请求