JUnit3的使用 (转)

上一篇 / 下一篇  2014-05-21 17:39:32 / 个人分类:Java

JUnit3的使用


简要说JUnit的4大功能
1.管理测试用例。修改了哪些代码,这些代码的修改会对哪些部分有影响,通过JUnit将这次的修改做个完整测试。这也就JUnit中所谓的TestSuite
2.定义测试代码。这也就是JUnit中所谓的TestCase,根据源代码的测试需要定义每个TestCase,并将TestCase添加到相应的TestSuite方便管理。
3.定义测试环境。在TestCase测试前会先调用“环境”配置,在测试中使用,当然也可以在测试用例中直接定义测试环境。
4.检测测试结果。对于每种正常、异常情况下的测试,运行结果是什么、结果是否是我们预期的等都需要有个明确的定义,JUnit在这方面提供了强大的功能。

      以上部分与我们平常使用IDE调试的过程是完全一样的,只不过是增加了测试用例管理、测试结果检测等功能,提高了单元的效率,保证了单元测试的完整性,明确了单元测试的目标。
 
一. 测试用例
packagecan.test;    

importjava.util.ArrayList;    
importjava.util.Collection;    
importjunit.framework.TestCase;    

publicclassSampleTestextendsTestCase {    

        protectedvoidsetUp() {    
                /* 开始test前的准备操作:初始化,获取数据连接... */    
                                
        }    
                    
        protectedvoidtearDown() {    
                /* 完成test后的清理工作:关闭文件, 关闭数据连接... */    
                                    
        }    
                    
        publicvoidtestEmpty() {    
                /* test case 1*/    
                Collection collection =newArrarList();    
                assertTrue(collection.isEmpty());    
        }    
                    
        publicvoidtestCase2() {    
                /* test case 2*/    
                ArrayList emptyList =newArrayList();
                try{
                        Object o = emptyList.get(0);
                        fail("Should raise an IndexOutOfBoundsException");
                }catch(IndexOutOfBoundsException expected) {
                        assertTrue(true);
                }
        }    
}

1. 当需要进行test前后操作,则对setUp(), tearDown()这两个方法进行重写。

 
2. 每进行一个test case前后,都会调用setUp(), tearDown()。注意,不是一次调用setUp(), 然后进行多个test case,最后才调用tearDown()。而且选择test case的次序是不确定的。所以调用次序可能是:
     1  setUp()
     2  testYYY()
     3  tearDown()
     4  setUp()
     5  testXXX()
     6  tearDown()
     所以每个testcase不要存在数据上的前后联系。
 
3. 编译&运行
    compile:  javac  -cp ../lib/junit.jar  can/junit/ SampleTest.java
    run:  (文本界面)   java  -cp  .;../lib/junit.jar  junit.textui.TestRunner  can.junit.SampleTest
      (图形界面)    java  -cp  .;../lib/junit.jar  junit.swingui.TestRunner  can.junit.SampleTest
 
     如果提示can.junit.SampleTest not found,则注意命令中红色处,.表示把当前目录添加到classpath,便于junit能够在该目录找到can.junit.SampleTest
 
4. 加上main(可选)
    如果你觉得每次都要在命令中指定文本界面或图形界面,有点麻烦,那可以添加一下代码到SampleTest类中:
importjunit.framework.Test;
importjunit.framework.TestSuite;


        publicstaticTest suite() {
                /* 添加SampleTest类到TestSuite*/
                returnnewTestSuite(SampleTest.class);
        }

        publicstaticvoidmain(String args[]) {
                /* 指定文本界面*/
                junit.textui.TestRunner.run(suite());
        }
 或者
        publicstaticvoidmain(String args[]) {
                junit.textui.TestRunner.run(SampleTest.class);
        }
    这样run: java  -cp  .;../lib/junit.jar    can.junit. SampleTest
 
二. 测试单元
      当需要对多个类或者模块进行unit test的时候,我们都会写好每个类的testcase,然后写一个Suite来将它们串联起来。
packagecan.junit;

importjunit.framework.Test;
importjunit.framework.TestSuite;

publicclassSampleTestSuite {

        publicstaticTest suite() {
                TestSuite suite =newTestSuite("Sample Tests");
                
                /* 逐一添加testCase类 */
                suite.addTestSuite(SampleTest.class);
                
                /* 逐一添加test suite(注意,这是递归调用的) */
                suite.addTest(AnotherTestSuite.suite());

                returnsuite;
        }

        publicstaticvoidmain(String args[]) {
                junit.textui.TestRunner.run(suite());
        }
}
 
刚 才说了,每进行一个test case,setUp()和tearDown()都会调用。而有的时候,在setUp()中相当耗费资源,我们想进行所有的test case仅调用一次setUp()和tearDown(),这样需要把TestSuite包装到TestSetup类中:
importjunit.framework.*;    
importjunit.extensions.TestSetup;    

publicclassAllTestsOneTimeSetup {    

        publicstaticTest suite() {    
            
                TestSuite suite =newTestSuite();    
                suite.addTest(SomeTest.suite());    
                suite.addTest(AnotherTest.suite());    

                TestSetup wrapper =newTestSetup(suite) {    
                        protectedvoidsetUp() {    
                                oneTimeSetUp();    
                        }    

                        protectedvoidtearDown() {    
                                oneTimeTearDown();    
                        }    
                };    
                returnwrapper;    
        }    

        publicstaticvoidoneTimeSetUp() {    
                // one-time initialization code    
        }    

        publicstaticvoidoneTimeTearDown() {    
                // one-time cleanup code    
        }        
}
 
三. 其他
对于protected方法的test,可以把test case放在被test的类同一目录。
 

TAG:

 

评分:0

我来说两句

Open Toolbar