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; i++)
{

            new SimpleThread().start();

        }

    }

private static class SimpleThread extends Thread
{

        @Override

        public void run()
{

            try {

                System.out.println(this.getName()
+ ":" + SimpleDateFormatUtil.parse("2015-12-23
15:00:00"));

            } catch (ParseException e)
{

                e.printStackTrace();

            }

        }

    }

        在多线程环境下,程序退出的条件是,所有的非Daemon线程都正常结束或者某个线程条用了system.exit方法,导致进程强行退出。

JunitCore类的main函数如下:

public static transient void main(String
args[]){

        runMainAndExit(new RealSystem(),
args);

    }

private static transient void runMainAndExit(JUnitSystem
system, String args[]){

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

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

    }

很明显,其调用了System.exit函数,将导致线程结束,而多线程甚至都来不及运行。

那么,我们该如何在多线程先进行Junit测试呢?【用main函数测试也是OK的】

@Test

public void threadTest() throws Throwable {

        TestRunnable[] testRunnables = new TestRunnable[NUM_THREAD];

        for (int i =
0; i < testRunnables.length; i++)
{

            testRunnables[i]
= new SimpleThread();

        }

        final MultiThreadedTestRunner multiThreadedTestRunner = new MultiThreadedTestRunner(testRunnables);

        multiThreadedTestRunner.runTestRunnables();

    }

 

private static class SimpleThread extends TestRunnable {

        @Override

        public void runTest()
{

            try {

                System.out.println(this.toString()
+ ":" + SimpleDateFormatUtil.parse("2015-12-23
15:00:00"));

          //
System.out.println(this.toString()); // 正常输出所有线程名

            } catch (ParseException e)
{

                e.printStackTrace();

            }

        }

    }

时间: 2024-07-31 18:38:01

JUnit多线程Test的相关文章

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

Junit4教程

我们在编写大型程序的时候,需要写成千上万个方法或函数,这些函数的功能可能很强大,但我们在程序中只用到该函数的一小部分功能,并且经过调试可以确定,这 一小部分功能是正确的.但是,我们同时应该确保每一个函数都完全正确,因为如果我们今后如果对程序进行扩展,用到了某个函数的其他功能,而这个功能有bug的话,那绝对是一件非常郁闷的事情.所以说,每编写完一个函数之后,都应该对这个函数的方方面面进行测试,这样的测试我们称之为单元测试. 传统的编程方式,进行单元测试是一件很麻烦的事情,你要重新写另外一个程序,在

银行取款[多线程]{未进行线程同步}(junit不适合多线程并发单元测试)

        由于计算机多任务.多进程.多线程的支持,使得计算机资源的服务效率提高,服务器对请求的也使用线程来相应,所有,代码中涉及到同时对共享数据的操作,将在 多线程环境中操作数据,导致数据安全问题.      经典例子:老婆(朱丽叶)老公(罗密欧),使用银行卡和存折,或者网银等,同时对同一账户操作的安全问题.      如果要保证多线程下数据安全,就要实现线程同步(例如:一间小厕所,就得有一个锁,保证同一时间为一个人服务).其他文章讲: 此处用多线程实现,同时取款的模拟实现,未进行线程同步

轻松构建和运行多线程的单元测试

简介:随着多核处理器成为主流,开发并行程序随之成为一种必然要求.但是我们都知道并行程序存 在着很大的不确定性,这使得开发和测试并行程序有一定的难度,因此对于并行程序的单元测试变得尤为 重要.但是,创建多线程的单元测试并不容易,测试需要考虑测试线程间的同步,数据共享等.针对 Java 并行程序的测试,结合扩展 JUnit 的多线程测试工具,本文介绍了一种在集成开发环境中,创建符 合用户要求的多线程单元测试用例的完整过程,使得用户只用关心测试本身的逻辑和结果,而不用去了解 测试用例并行执行的琐碎细节

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

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

银行取款[多线程]{使用重入锁Lock接口ReentrantLock锁确保线程同步}

经典例子:老婆(朱丽叶)老公(罗密欧),使用银行卡和存折,或者网银等,同时对同一账户操作的安全问题.  此处用多线程实现,同时取款的模拟实现,使用使用Lock接口ReentrantLock锁确保线程同步,查看取款安全隐患问题,代码如下: -----------------------------------------------------------------------------------------------------------------------------------

银行取款[多线程]{使用volatile修饰共享变量,但此场景并不保证线程同步}

经典例子:老婆(朱丽叶)老公(罗密欧),使用银行卡和存折,或者网银等,同时对同一账户操作的安全问题. 此处用多线程实现,同时取款的模拟实现,使用volatile修饰共享变量,但此场景并不保证线程同步,查看取款安全隐患问题,代码如下: 我学习地址(Thanks for auther): Java 理论与实践: 正确使用 Volatile 变量 java中volatile关键字的含义 ----------------------------------------------------------

银行取款[多线程]{使用ThreadLocal管理共享变量,但此场景并不保证线程同步}

经典例子:老婆(朱丽叶)老公(罗密欧),使用银行卡和存折,或者网银等,同时对同一账户操作的安全问题. 此处用多线程实现,同时取款的模拟实现,使用ThreadLocal管理共享变量,但此场景并不保证线程同步,查看取款安全隐患问题,代码如下: ----------------------------------------------------------------------------------------------------------------------------------

银行取款[多线程]{使用同步方法确保线程同步}

  经典例子:老婆(朱丽叶)老公(罗密欧),使用银行卡和存折,或者网银等,同时对同一账户操作的安全问题.  此处用多线程实现,同时取款的模拟实现,使用同步方法确保线程同步,查看取款安全隐患问题,代码如下: -------------------------------------------------------------------------------------------------------------------------------------------  * 线程同步