论坛首页 Java企业应用论坛

关于JUNIT的多线程测试问题

浏览 11282 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (5) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-01-09  
发现在junit模拟多线程测试的话
新启动的线程并不一定都能完全执行
用main就没有问题了

这两个方法,一个通过junit来执行,基本不能保证10次都运行
main方法则十次都能运行的。有没有对junit的多线程测试有接触研究的?
一起探讨啊
@Test
        public void testMultiThreadRecord() throws RmsException {
                for (int i = 1; i <= 10; i++) {
                        Worker w = new Worker();
                        w.start();
                }

        }

        public static void main(String[] args) {

                for (int i = 1; i <= 10; i++) {
                        Worker w = new Worker();
                        w.start();
                }

        }
   发表时间:2008-01-09  
JUNIT 不支持多线程,有扩展的第三方包,你可以去搜索下
0 请登录后投票
   发表时间:2008-01-09  
使用P-unit吧。即可以确认代码正确,也可以获得代码性能。p-unit兼容junit测试
0 请登录后投票
   发表时间:2008-01-09  
http://p-unit.sourceforge.net/
ok,找到了
多谢
0 请登录后投票
   发表时间:2008-01-09  
呵呵,你可以去看看junit的源代码,junit主线程在最后是执行System.exit(0)来退出的。连jvm一起关闭,当然期间启动的其他线程就都没有办法工作了,jvm都关了有什么办法。

除上面几位的方法外,还有一个简单(当然也比较简陋)的方法,就是在覆盖TestCase的teardown(不知道有没有记错,和setup对应的最后执行的方法),在里面循环Sleep,然后检查是否还有其他活动线程,有就继续sleep,如果其他线程都退出了就跳出循环,让teardown方法退出,之后junit再System.exit(0)。

当然这个方法不是很通用,只适合那种简单的启动一个工作线程干点活就退出的那种情况。
0 请登录后投票
   发表时间:2008-01-10  
上面这位兄台对junit有研究啊
如果类中有private的算法支撑方法,不能被junit引用到
一般测定时候都只写main来测试private方法中的逻辑
兄台是怎么处理的?
0 请登录后投票
   发表时间:2008-01-10  
具体分析吧,如果这个private 方法有被其他public方法直接调用,而且逻辑清晰,则直接测试这个public方法。

如果这个private方法隐藏的很深,而且逻辑复杂,其他public方法离这个private的"距离"非常远。那就要考虑一下这个类的设计了,不容易测试的类,往往是功能过多,代码太大的类,建议拆分。

比如一个业务处理类,在复杂的业务逻辑处理过程中通过调用一个private方法做加密,而这个加密算法需要测试。类似这种情况,最好的办法就是将加密算法单独提取出一个类,功能非常单一的类,不要献小。然后对它进行junit测试,原来的类只要直接调用这个类就可以了。

这个也就是junit带来的一个推动力,为了达到测试友好,就必须保证代码清晰,相互耦合小。
0 请登录后投票
   发表时间:2008-01-10  
有道理,可测试性,也是设计的一个目标了... ...
7 请登录后投票
   发表时间:2008-01-11  
用junitperf模擬多線程吧
0 请登录后投票
   发表时间:2008-01-11  
我以前的做法是用thread.join()方法,这样可以保证每个线程都死掉后主线程才继续执行。
不知道有没有什么不对。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics