36-结果分析
结果分析
在本节中,我们利用 MultithreadedTC
库测试了 LinkedTransferQueue
类,而其他应用同样可以使用 MultithreadedTC
库及其节拍器进行测试。本案例实现了一个经典的生产者/消费者模型,其中包含两个消费者和一个生产者,并测试了以下情形:第一个 String
型对象进入队列后被到达缓冲区的第一个消费者消费了,而第二个 String
型对象进入队列后被到达缓冲区的第二个消费者消费了。
对开发者来说,我们通常使用JUnit库测试Java应用,而 MultithreadedTC
正是一款基于JUnit的库。为了使用 MultithreadedTC
库进行测试,开发者需要继承 Multithreaded TestCase
类。 MultithreadedTestCase
是一个继承 junit.framework.AssertJUnit
的类,同时它也包含了所有校验测试结果的方法,不过由于 MultithreadedTC
并没有继承 junit.framework.TestCase
类,因此你并不能把 MultithreadedTC
和其他的JUnit测试集成在一起。
可以根据需求实现以下方法。
initialize()
:此方法的实现是可选的。它是在开始测试时执行的,因此,你可以使用它初始化使用测试的对象。finish()
:此方法的实现是可选的。它是在结束测试时执行的,因此,可以用它关闭或者释放占用的资源,或者校验测试结果。- 构成测试的方法集:这些方法集构成了测试过程的全部逻辑,这些方法名都以
thread
关键词开始,后面包含任意字符串,如thread1()
。
为了控制线程的执行顺序,需要使用 waitForTick()
方法,此方法接收一个整数值作为参数,并使执行该方法的线程休眠,直到测试过程中运行的所有线程都阻塞。在所有线程都阻塞以后, MultithreadedTC
将会恢复这些由 waitForTick()
阻塞的线程。
作为 waitForTick()
方法的参数传递的整数将用于控制执行顺序。在 MultithreadedTC
的节拍器内部包含一个计数器。当所有线程都阻塞后, MultithreadedTC
将计数值递增到 waitForTick()
方法指定的下一个数字。
在内部,当 MultithreadedTC
库开始执行测试时,首先执行的是 initialize()
方法,然后根据 thread
关键词开始的方法,分别创建对应的测试线程(在本案例中分别对应 thread1()
、 thread2()
和 thread3()
)。在所有的测试线程都完成执行后,调用 finish()
方法。最后开发者需要通过 TestFramework
类的 runOnce()
开始执行本次测试。