java – 如何使用线程执行单元测试?

前端之家收集整理的这篇文章主要介绍了java – 如何使用线程执行单元测试?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
执行摘要:当线程中抛出断言错误时,单元测试不会死机.这是有道理的,因为一个线程不应该被允许崩溃另一个线程.问题是如何1)当第一个辅助线程崩溃或2)循环并确定每个线程的完整状态(参见下面的代码)后,使整个测试失败.执行后者的一种方法是通过具有每个线程状态变量,例如“布尔值[]状态”,并且具有“status [i] == false”意味着线程失败(这可以被扩展以捕获更多信息).但是,这不是我想要的:我想要失败就像任何其他单元测试当断言错误被抛出.这甚至可能吗是否可取?

我感到无聊,我决定在我的单元测试中产生一堆线程,然后让它们调用一个服务方法,只是为了它的一切.代码看起来大致如下:

Thread[] threads = new Thread[MAX_THREADS];
for( int i = 0; i < threads.length; i++ ) {
    threads[i] = new Thread( new Runnable() {
        private final int ID = threadIdSequenceNumber++;
        public void run() {
            try {
                resultRefs[ID] = runTest( Integer.toString( ID ) ); // returns an object
            }
            catch( Throwable t ) { 
                // this code is EVIL - it catches even
                // Errors - don't copy it - more on this below
                final String message = "error testing thread with id => "
                            + ID;
                logger.debug( message,t );
                throw new IllegalStateException( message,t ); 
                // need to wrap throwable in a 
                // run time exception so it will compile
            }
        }
    } );
}

之后,我们将循环遍历线程数组并启动每个线程.之后,我们将等待他们完成.最后,我们将对结果引用进行一些检查.

for( Thread thread : threads )
    thread.start();

logger.debug( "waiting for threads to finish ..." );
boolean done = false;
while( !done ) {
    done = true;
    for( Thread thread : threads )
        if( thread.isAlive() )
            done = false;
}

for( int i = 0; i < resultRefs.length; i++ ) {
    assertTrue( "you've got the world messed,dawg!",myCondition(resultRefs[i]) );

这是问题.你有没有注意到令人讨厌的try-catch-throwable块?我只是补充说,作为一个暂时的黑客,所以我可以看到发生了什么.在runTest(String)中,做了一些断言,例如assertNotNull(null),但由于它在不同的线程中,它不会导致单元测试失败!!!

我的猜测是,我们需要以某种方式遍历线程数组,检查每个线程的状态,如果线程以令人讨厌的方式终止,则手动引发断言错误.给出此信息的方法名称(死线程的堆栈跟踪).

解决方法

并发是单元测试非常困难的事情之一.如果您只是试图测试每个线程中的代码正在做什么应该测试,可能你应该只是测试这个隔离上下文的代码. 如果在这个例子中线程协作来达成一个结果,那么你可以在不使用线程的情况下测试该协作.这将通过顺序执行所有协作部分来完成. 如果你想测试种族条件和这些事情,单位测试不是最好的方法.你会得到有时失败的测试,有时不会失败. 总而言之,我认为可能是你的问题是你的单位测试水平太高. 希望这可以帮助

猜你在找的Java相关文章