当前位置:编程学习 > JSP >>

JUnit实施--2.回归测试框架-JUnit

答案:2.回归测试框架-JUnit
通过前面的介绍,我们对JUnit有了一个大概的轮廓。知道了它是干什么的。现在让我们动手改写上面的测试类testCar使其符合Junit的规范--能在JUnit中运行。
    //执行测试的类(JUnit版)    import junit.framework.*;        public class testCar extends TestCase {                protected int expectedWheels;        protected Car myCar;                public testCar(String name) {            super(name);        }                protected void setUp() {            expectedWheels = 4;            myCar = new Car();        }                public static Test suite() {            /*             * the type safe way             *            TestSuite suite= new TestSuite();            suite.addTest(                new testCar("Car.getWheels") {                     protected void runTest() { testGetWheels(); }                }            );            return suite;            */                /*             * the dynamic way             */                    return new TestSuite(testCar.class);        }                public void testGetWheels() {            assertEquals(expectedWheels, myCar.getWheels());        }    }    
改版后的testCar已经面目全非。先让我们了解这些改动都是什么含义,再看如何执行这个测试。

1>import语句,引入JUnit的类。(没问题吧)

2>继承 TestCase 。可以暂时将一个TestCase看作是对某个类进行测试的方法的集合。详细介绍请参看JUnit资料

3>setUp()设定了进行初始化的任务。我们以后会看到setUp会有特别的用处。

4>testGetWheeels()对预期的值和myCar.getWheels()返回的值进行比较,并打印比较的结果。assertEquals是junit.framework.Assert中所定义的方法,junit.framework.TestCase继承了junit.framework.Assert。

5>suite()是一个很特殊的静态方法。JUnit的TestRunner会调用suite方法来确定有多少个测试可以执行。上面的例子显示了两种方法:静态的方法是构造一个内部类,并利用构造函数给该测试命名(test name, 如 Car.getWheels ),其覆盖的runTest()方法,指明了该测试需要执行那些方法--testGetWheels()。动态的方法是利用内省(reflection )来实现runTest(),找出需要执行那些测试。此时测试的名字即是测试方法(test method,如testGetWheels)的名字。JUnit会自动找出并调用该类的测试方法。

6>将TestSuite看作是包裹测试的一个容器。如果将测试比作叶子节点的话,TestSuite就是分支节点。实际上TestCase,TestSuite以及TestSuite组成了一个composite Pattern。 JUnit的文档中有一篇专门讲解如何使用Pattern构造Junit框架。有兴趣的朋友可以查看JUnit资料

如何运行该测试呢?手工的方法是键入如下命令:
    [Windows] d:>java junit.textui.TestRunner testCar        [Unix] % java junit.textui.TestRunner testCar    
别担心你要敲的字符量,以后在IDE中,只要点几下鼠标就成了。运行结果应该如下所示,表明执行了一个测试,并通过了测试:
    .    Time: 0        OK (1 tests)    
如果我们将Car.getWheels()中返回的的值修改为3,模拟出错的情形,则会得到如下结果:
    .F    Time: 0    There was 1 failure:    1) testGetWheels(testCar)junit.framework.AssertionFailedError: expected:<4> but was:<3>            at testCar.testGetWheels(testCar.java:37)    FAILURES!!!    Tests run: 1,  Failures: 1,  Errors: 0        
注意:Time上的小点表示测试个数,如果测试通过则显示OK。否则在小点的后边标上F,表示该测试失败。注意,在模拟出错的测试中,我们会得到详细的测试报告“expected:<4> but was:<3>”,这足以告诉我们问题发生在何处。下面就是你调试,测试,调试,测试...的过程,直至得到期望的结果。

上一个:我们个人认为写java程序的一般境界莫过于此了 ^_^ (转贴)
下一个:当前流行的J2EE WEB应用架构分析(转)

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,