商讯信箱
用户名: @
密  码:   注册|忘记密码
登录
个人用户经销商
您的位置:首页 > 技术频道 > 正文

有关Junit和多线程测试的问题

    如果你想验证下列代码,你需要下载并安装Junit。按着指示去做,以便能够在Junit的网站能够找到它。不要过分追求细节,我们将简要的介绍Junit是怎样工作的。要写一个Junit的测试,你必须首先创建一个扩展于junit.framework.TestCase(Juint中的基本测试类)的测试类。

    Main()方法和suite()方法被用启动测试。无论是从命令行还是IDE集成开发环境窗口,必须确保junit.jar在你的CLASSPATH环境变量里指定。然后为BadExampleTest.Class类编译运行下列代码:

import junit.framework.*; public class BadExampleTest extends TestCase { // For now, just verify that the test runs public void testExampleThread() throws Throwable { System.out.println("Hello, World"); } public static void main (String[] args) { String[] name = { BadExampleTest.class.getName() }; junit.textui.TestRunner.main(name); } public static Test suite() { return new TestSuite( BadExampleTest.class); } }
    运行BadExampleTest来验证所建立的每一件事情的正确性。一旦,main()被调用,Junit框架将自动的执行任意一个用“test”开关命名的方法。继续并试着运行测试类。如果你正确的做了每一件事,它应该在输出窗口打印出“Hello World”。
现在,我们要给程序添加一个线程类。我将通过扩展java.lang.Runnable接口来做这件事情。最后,我们将改变策略,并且扩展一个使线程自动创建的类。

    在DelayedHello的构造器中,我们创建一个新的线程并且调用它的start()方法。
import junit.framework.*; public class BadExampleTest extends TestCase { private Runnable runnable; public class DelayedHello implements Runnable { private int count; private Thread worker; private DelayedHello(int count) { this.count = count; worker = new Thread(this); worker.start(); } public void run() { try { Thread.sleep(count); System.out.println( "Delayed Hello World"); } catch(InterruptedException e) { e.printStackTrace(); } } } public void testExampleThread() throws Throwable { System.out.println("Hello, World"); //1 runnable = new DelayedHello(5000); //2 System.out.println("Goodbye, World"); //3 } public static void main (String[] args) { String[] name = { BadExampleTest.class.getName() }; junit.textui.TestRunner.main(name); } public static Test suite() { return new TestSuite( BadExampleTest.class); } }
    testExampleThread()方法实际上称不上是一个测试方法,实际上,你想使测试自动化,并且不想把检查结果输出到控制台,但是,这里却是这样的,因此,这一点示范了Junit是不支持多线程的。
注意:testExampleThread()方法执行三项任务:

1、 打印“Hello,World”;
2、 初始化并起动一个支持打印“Delayed Hello World.”线程;
3、 打印“Goodbye,World”。

    如果你运行这个测试类,你会注意到一些错误。TextHellWorld()方法像你期望的那样运行和结束。它没有发出任何有关线程的异常,但是你却不会接受到来自线程的返回信息。注意,你不会看到“Delayed Hello World”。为什么?因为线程还在激活状态的时候,Junit已经执行完成。问题发生在下面这行,使线程执行结束的时候,你的测试不能反映出它的执行结果。这个问题行是在Junit的TestRunner中。它没有被设计成搜寻Runnable实例,并且等待这些线程发出报告,它只是执行它们并且忽略了它们的存在。因为这个原因,几乎不可能在Junit中编写和维护多线程的单元测试。
1 2 3 4
【内容导航】
第1页: 介绍 第2页: 有关Junit和多线程测试的问题
第3页: 进入GroboUtils 第4页: 编写多线程测试
©版权所有。未经许可,不得转载。
[责任编辑:阿雪]
[an error occurred while processing this directive]