Junit的安装

Junit的安装还是很简单的,直接将Junit3.8.3放在一个目录下,现在假社这个目录为D:\Junit3.8.1, 那么我们就在CLASSPATH中添加D:\Junit3.8.1\Junit.jar这个路径就可以使用了。当然如果你在其他目录那么相应路径就是   : 其他目录:\ Junit3.8.1\Junit.jar

 

接下来谈下Junit框架的组成

Junit TC                          测试目标与测试方法的集合

TS TestSuite                测试包

TR TestTusult               测试结果的描述

Test Listener                测试实践监听者

Test Failure                 测试过程中出现的与预期不一致的地方

AssertionFailedError   测试过程中出现的异常

Junit的各种断言:

1 ,assertEquals([String message],

                    expected,

                    actual)

这是使用得最多的断言形式。

expected-是你的期望值(通常要硬编码)

actual-被测代码实际产生的值

message-可选的消息,如果提供的话,将会在发生错误的时候报告这个消息。

2 ,assertNull([String message],java.lang.Object object)

assertNotNull([String message],java.lang.Object object)

验证一个给定的对象是否为Null(或者为非Null),如果答案为否,则将会失败。message参数是可选的。

3 ,assertSame( [String message],

                    expected,

                    actual)

验证expected参数和actual

参数所引用的是否为同

一对象,如果不是的

话,将会失败。Message

参数是可选的。

4 ,assertTrue( [String message], boolean  condition)

           assertFalse( [String message],boolean condition)

验证给定的二元条件是否为真,如果为假的话,将会失败。Message参数是可选的。

验证给定的二元条件是否为假,如果不为假的话,将会失败。Message参数是可选的

5,fail( String message )

使测试立即失败,其中message参数使可选的。

这种断言通常被用于标记某个不应该到达的分支(例如,在一个预期发生的异常之后)

 

 

首先,第一行的import声明引入了必须的junit类。

定义一个类,从TestCase继承下来

定义一个构造函数

测试类中包含名为test……的方法


 
Junit的框架

 

 1 import  junit.framework. * ;                       
 2  
 3     
 4
 5 public   class  TestSimple  extends  TestCase {
 6
 7 punlic TestSimple (String name) {
 8
 9 super (name);}

10
11 public   void  testAdd() {
12
13 assertEquals( 2 , 1 + 1 );
14
15 }

16
17

 

 

JUnit中常用的接口和类:

Test接口——运行测试和收集测试结果

TestCase抽象类——定义测试中固定方法

Assert静态类——一系列断言方法的集合

TestSuite测试包类——多个测试的组合

TestResult结果类和其它类与接口

一些使用JUnit经验 :

 

不要用TestCase的构造函数初始化,而要用setUp()和tearDown()方法。

不要依赖或假定测试运行的顺序,因为JUnit利用Vector保存测试方法。所以不同的平台会按不同的顺序从Vector中取出测试方法。

避免编写有副作用的TestCase。例如:如果随后的测试依赖于某些特定的交易数据,就不要提交交易数据。简单的回滚就可以了。

当继承一个测试类时,记得调用父类的setUp()和tearDown()方法。
将测试代码和工作代码放在一起,一边同步编译和更新。

测试类和测试方法应该有一致的命名方案。如在工作类名前加上test从而形成测试类名。

确保测试与时间无关,不要依赖使用过期的数据进行测试。导致在随后的维护过程中很难重现测试。

如果你编写的软件面向国际市场,编写测试时要考虑国际化的因素。不要仅用母语的Locale进行测试。

尽可能地利用JUnit提供地assert/fail方法以及异常处理的方法,可以使代码更为简洁。

测试要尽可能地小,执行速度快

 Junit的扩展:

JUnit + HttpUnit=WEB功能测试工具
JUnit + hansel =代码覆盖测试工具
JUnit + abbot =界面自动回放测试工具
JUnit + dbunit =数据库测试工具
JUnit + junitperf=性能测试工具

 

现在来实践一下吧! Junit应用举例:

 

 1 public   class  Money  {
 2
 3      private   int  fAmount; // 余额
 4
 5      private  String fCurrency; // 货币类型
 6
 7      public  Money( int  amount, String currency)  {
 8
 9         fAmount =  amount;
10
11         fCurrency =  currency;
12
13     }

14
15      public   int  amount()  {
16
17          return  fAmount;
18
19     }

20
21      public  String currency()  {
22
23          return  fCurrency;
24
25     }

26
27      public  Money add(Money m)  { // 加钱
28
29          return   new  Money(amount() + m.amount(), currency());
30
31     }

32
33      public   boolean  equals(Object anObject)  { // 判断钱数是否相等
34
35          if  (anObject  instanceof  Money)  {
36
37             Money aMoney =  (Money)anObject;
38
39              return  aMoney.currency().equals(currency())
40
41                  &&  amount()  ==  aMoney.amount();
42
43         }

44
45          return   false ;
46
47     }
    
48
49 }

50

 

测试程序:

 1 package  test.JunitTest;
 2
 3 import  junit.framework.TestCase;
 4 import  junit.framework. * ;
 5
 6 public   class  MoneyTest  extends  TestCase  {
 7     
 8     
 9      private   Money f12CHF;  //  提取公用的对象 
10      
11      private   Money f14CHF;   
12
13
14      protected   void  setUp()  throws  Exception  {
15         f12CHF = new  Money( 12 , " CFH " );
16         f14CHF = new  Money( 14 , " CFH " );
17     }

18
19      protected   void  tearDown()  throws  Exception  {
20          super .tearDown();
21     }

22
23      /*
24      * Test method for 'test.JunitTest.Money.addMoney(Money)'
25       */

26      public   void  testAddMoney()  {
27         Assert.assertEquals(f12CHF.addMoney(f14CHF), new  Money( 26 , " CFH " )); 
28     }

29
30      /*
31      * Test method for 'test.JunitTest.Money.equals(Object)'
32       */

33      public   void  testEqualsObject()  {
34         Assert.assertEquals(f12CHF,f12CHF);
35     }

36
37 }

运行结果 :runs  2/2  error: 0  failur:0

测试对于保证软件开发质量有着非常重要的作用,单元测试更是必不可少,JUnit是一个非常强大的单元测试包,可以对一个/多个类的单个/多个方法测试,还可以将不同的TestCase组合成TestSuit,使测试任务自动化。Eclipse同样集成了JUnit,可以非常方便地编写TestCase。

我们创建一个Java工程,添加一个example.Hello类,首先我们给Hello类添加一个abs()方法,作用是返回绝对值:


下一步,我们准备对这个方法进行测试,确保功能正常。选中Hello.java,右键点击,选择New->JUnit Test Case:

Eclipse会询问是否添加junit.jar包,确定后新建一个HelloTest类,用来测试Hello类。



选中setUp()和tearDown(),然后点击“Next”:



选择要测试的方法,我们选中abs(int)方法,完成后在HelloTest.java中输入:

 

JUnit会以以下顺序执行测试:(大致的代码

try {
    HelloTest test = new HelloTest(); // 建立测试类实例
    test.setUp(); // 初始化测试环境
    test.testAbs(); // 测试某个方法
    test.tearDown(); // 清理资源
}
catch…

setUp()是建立测试环境,这里创建一个Hello类的实例;tearDown()用于清理资源,如释放打开的文件等等。以test开头的方法被认为是测试方法,JUnit会依次执行testXxx()方法。在testAbs()方法中,我们对abs()的测试分别选择正数,负数和0,如果方法返回值与期待结果相同,则assertEquals不会产生异常。

如果有多个testXxx方法,JUnit会创建多个XxxTest实例,每次运行一个testXxx方法,setUp()和tearDown()会在testXxx前后被调用,因此,不要在一个testA()中依赖testB()。

直接运行Run->Run As->JUnit Test,就可以看到JUnit测试结果:



绿色表示测试通过,只要有1个测试未通过,就会显示红色并列出未通过测试的方法。可以试图改变abs()的代码,故意返回错误的结果(比如return n+1;),然后再运行JUnit就会报告错误。

如果没有JUnit面板,选择Window->Show View->Other,打开JUnit的View:



JUnit通过单元测试,能在开发阶段就找出许多Bug,并且,多个Test Case可以组合成Test Suite,让整个测试自动完成,尤其适合于XP方法。每增加一个小的新功能或者对代码进行了小的修改,就立刻运行一遍Test Suite,确保新增和修改的代码不会破坏原有的功能,大大增强软件的可维护性,避免代码逐渐“腐烂”。





断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为 true。如果表达式计算为 false,那么系统会报告一个 Assertionerror。它用于调试目的:
assert(a > 0); // throws an Assertionerror if a <= 0
断言可以有两种形式:
assert Expression1 ;
assert Expression1 : Expression2 ;
Expression1 应该总是产生一个布尔值。
Expression2 可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的 String 消息。
断言在默认情况下是禁用的。要在编译时启用断言,需要使用 source 1.4 标记:
javac -source 1.4 Test.java
要在运行时启用断言,可使用 -enableassertions 或者 -ea 标记。
要在运行时选择禁用断言,可使用 -da 或者 -disableassertions 标记。
要系统类中启用断言,可使用 -esa 或者 -dsa 标记。还可以在包的基础上启用或者禁用断言。
可以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数。不过,断言不应该用于验证传递给公有方法的参数,因为不管是否启用了断言,公有方法都必须检查其参数。不过,既可以在公有方法中,也可以在非公有方法中利用断言测试后置条件。另外,断言不应该以任何方式改变程序的状态。