人生的意义,在人生之外,就如同工作的意义,在工作之外。 Cherish the people you meet everyday

junit实例教程

上一篇 / 下一篇  2012-11-01 10:52:56 / 个人分类:UnitTest

1、概述51Testing软件测试网[3v)w;Hm)}3[)@
  Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。
d:lb9^D7M"x `W0  Junit本质上是一套框架,即开发者制定了一套条条框框,遵循这此条条框框要求编写测试代码,如继承某个类,实现某个接口,就可以用Junit进行自动测试了。51Testing软件测试网xw%iy,c!zo
  由于Junit相对独立于所编写的代码,可以测试代码的编写可以先于实现代码的编写,XP 中推崇的 test first design的实现有了现成的手段:用Junit写测试代码,写实现代码,运行测试,测试失败,修改实现代码,再运行测试,直到测试成功。以后对代码的修改和优化,运行测试成功,则修改成功。
"f CH T.X0  Java 下的 team 开发,采用 cvs(版本控制) + ant(项目管理) + junit(集成测试) 的模式时,通过对ant的配置,可以很简单地实现测试自动化。51Testing软件测试网h wIe lU:T%m*d

  对不同性质的被测对象,如Class,Jsp,Servlet,Ejb等,Junit有不同的使用技巧,以后慢慢地分别讲叙。以下以Class测试为例讲解,除非特殊说明。51Testing软件测试网'F~B0{ T2XGp0f

2、下载安装51Testing软件测试网,p+ag G'N}
51Testing软件测试网\n m,Hg9e

  • Junit主页下载最新版本3.8.1程序包junit-3.8.1.zip
    ~mt.{S'e+CEQ0
  • 用winzip或unzip将junit-3.8.1.zip解压缩到某一目录名为$JUNITHOME51Testing软件测试网D hy(]j Y S!n1v
  • 将junit.jar和$JUNITHOME/junit加入到CLASSPATH中,加入后者只因为测试例程在那个目录下。51Testing软件测试网Zh$ra"G7Guc z
  • 注意不要将junit.jar放在jdk的extension目录下51Testing软件测试网Xa0?T2z Hf5a\G
  • 运行命令,结果如右图。
    java junit.swingui.TestRunner junit.samples.AllTests

 51Testing软件测试网,`mI bm]e.Jp

3、Junit架构51Testing软件测试网'ZZnUf%U
  下面以Money这个类为例进行说明。

K8J+TiP~9n0
public class Money {51Testing软件测试网X)m(l&e3y8Tx3v
    private int fAmount;//余额
rQ/S v9PL:w*x]0    private String fCurrency;//货币类型

 51Testing软件测试网#MP(q`,N

    public Money(int amount, String currency) {51Testing软件测试网3g,uxPTZ*{L
        fAmount= amount;51Testing软件测试网+@Q\s#},b#l[
        fCurrency= currency;51Testing软件测试网} ~7t)r;|
    }51Testing软件测试网 v1f8H$Zc,h S V#G

    public int amount() {51Testing软件测试网(];Y5sW*VI,W8t'nD^1{9f
        return fAmount;
?+^b%Jge0    }51Testing软件测试网2W0y Y`P

    public String currency() {51Testing软件测试网x4gDsn
        return fCurrency;
qG7y)TPB0    }
k2F3l8wfC;M'y0    51Testing软件测试网o PKFs d4O(J*_)B:H
    public Money add(Money m) {//加钱
#H,i%W7d.k0        return new Money(amount()+m.amount(), currency());
4j/YO(R D4WG'b0    }51Testing软件测试网L b(]+l)Q@L+F`:tt2HI
    
5}*Ja+mi&y'yr0    public boolean equals(Object anObject) {//判断钱数是否相等51Testing软件测试网.t.lM2l1?Z;m |0S
        if (anObject instanceof Money) {
lUg!n9C0            Money aMoney= (Money)anObject;51Testing软件测试网NWb1ju'gV
            return aMoney.currency().equals(currency())
Dr9}0d @0                && amount() == aMoney.amount();
.z"EAFLR Kc'|d7kk0        }
,p5_Q3i'E?3h0        return false;51Testing软件测试网3je q9X~l!l
    }    
zJJ7dRN$o,c0}51Testing软件测试网i4I8mnp)m+]


  Junit本身是围绕着两个设计模式来设计的:命令模式集成模式.
  • 命令模式51Testing软件测试网c,jPDZ]w?
      利用TestCase定义一个子类,在这个子类中生成一个被测试的对象,编写代码检测某个 方法被调用后对象的状态与预期的状态是否一致,进而断言程序代码有没有bug。
    1`O.TS\ETk0  当这个子类要测试不只一个方法的实现代码时,可以先建立测试基础,让这些测试在同一个基础上运行,一方面可以减少每个测试的初始化,而且可以测试这些不同方法之间的联系。
    hd}*IgY n0  例如,我们要测试Money的Add方法,可以如下:
    public class MoneyTest extends TestCase { //TestCase的子类
    O3X@:NYlel)A]0    public void testAdd() { //把测试代码放在testAdd中51Testing软件测试网 m9QyM-Lgczz
            Money m12CHF= new Money(12, "CHF");  //本行和下一行进行一些初始化
    .A5[-\)]f5~ G%j0        Money m14CHF= new Money(14, "CHF");        51Testing软件测试网4Uk5A,X%\R
            Money expected= new Money(26, "CHF");//预期的结果
    8F e x\o8}7rS$Z|3P f,Q0        Money result= m12CHF.add(m14CHF);    //运行被测试的方法51Testing软件测试网MO g1J w
            Assert.assertTrue(expected.equals(result));     //判断运行结果是否与预期的相同
    RS:?z3S}*J~0    }
    GWh4w!w:[0}
    51Testing软件测试网CzT+AS h(Z
      如果测试一下equals方法,用类似的代码,如下:
    public class MoneyTest extends TestCase { //TestCase的子类51Testing软件测试网5Ik ?G@,Xo
        public void testEquals() { //把测试代码放在testEquals中
    6s~4jz)W*WO6e#E0        Money m12CHF= new Money(12, "CHF"); //本行和下一行进行一些初始化51Testing软件测试网je{ C%U5a4N'i3l
            Money m14CHF= new Money(14, "CHF");

     51Testing软件测试网 w-~fJ,[$qoF

            Assert.assertTrue(!m12CHF.equals(null));//进行不同情况的测试
    "o;TB$WZEf0        Assert.assertEquals(m12CHF, m12CHF);
    O m-C:DnH0        Assert.assertEquals(m12CHF, new Money(12, "CHF")); // (1)51Testing软件测试网X]5X]n'DA,^H
            Assert.assertTrue(!m12CHF.equals(m14CHF));51Testing软件测试网&N%@ o?)g \ha o
        }51Testing软件测试网Ps[7xo9Z!JDS7O
    }

    X,g1E D vD0

    ,X'F d%[VEGS0  当要同时进行测试Add和equals方法时,可以将它们的各自的初始化工作,合并到一起进行,形成测试基础,用setUp初始化,用tearDown清除。如下:
    public class MoneyTest extends TestCase {//TestCase的子类51Testing软件测试网U"Oz l-u T)[;W
        private Money f12CHF;//提取公用的对象51Testing软件测试网E j[*p.W
        private Money f14CHF;   

     51Testing软件测试网 e{ LT`:W

        protected void setUp() {//初始化公用对象51Testing软件测试网ic:P:S+^ lh
            f12CHF= new Money(12, "CHF");
    L)pU#B/[0        f14CHF= new Money(14, "CHF");51Testing软件测试网K)aE"cvR
        }
    c,l irZ"m0    public void testEquals() {//测试equals方法的正确性
    -w(Re?Y"F0        Assert.assertTrue(!f12CHF.equals(null));
    _js5?4l:D`0        Assert.assertEquals(f12CHF, f12CHF);51Testing软件测试网 ^o+a.}1g/H0n8obi
            Assert.assertEquals(f12CHF, new Money(12, "CHF"));51Testing软件测试网q3o Z NL~u[Rd
            Assert.assertTrue(!f12CHF.equals(f14CHF));
    2?z!ss _xN0    }
    (n.n3[9~9A0]9Z0    51Testing软件测试网 o0h0l'n M$T;P
        public void testSimpleAdd() {//测试add方法的正确性
    GsM3WZ2N}0        Money expected= new Money(26, "CHF");51Testing软件测试网4c H{X7Us+B W^
            Money result= f12CHF.add(f14CHF);51Testing软件测试网|!Yh gK4p _
            Assert.assertTrue(expected.equals(result));
    -_,e ?){i6Wn0    }51Testing软件测试网2L mw1]7Z}5A
    }

    Z:G_MLOa0
    51Testing软件测试网,\Vq7El9f3jz
      将以上三个中的任一个TestCase子类代码保存到名为MoneyTest.java的文件里,并在文件首行增加
    import junit.framework.*;
    ,都是可以运行的。关于Junit运行的问题很有意思,下面单独说明。51Testing软件测试网;?5Rm cUw
      上面为解释概念“测试基础(fixture)”,引入了两个对两个方法的测试。命令模式与集成模式的本质区别是,前者一次只运行一个测试。
    q5f&I8v{O#G1`L0
  • 集成模式
    %Z%K~ \E Eh]B0  利用TestSuite可以将一个TestCase子类中所有test***()方法包含进来一起运行,还可将TestSuite子类也包含进来,从而行成了一种等级关系。可以把TestSuite视为一个容器,可以盛放TestCase中的test***()方法,它自己也可以嵌套。这种体系架构,非常类似于现实中程序一步步开发一步步集成的现况。51Testing软件测试网I'^a9C3|5SRD
      对上面的例子,有代码如下:
    public class MoneyTest extends TestCase {//TestCase的子类
    N#T,f.nT:T$C0n0    ....
    YV DL3q;JeK0    public static Test suite() {//静态Test
    HE.?a#\j0        TestSuite suite= new TestSuite();//生成一个TestSuite
    7|*bE*n[g0        suite.addTest(new MoneyTest("testEquals")); //加入测试方法51Testing软件测试网%{'cGXZL
            suite.addTest(new MoneyTest("testSimpleAdd"));51Testing软件测试网$y `iqr*g5v
            return suite;51Testing软件测试网!W*g1V-_!o$V
        }
    3O:vgH_;q6g?0}
    51Testing软件测试网.Qh;^R8H lh
      从Junit2.0开始,有列简捷的方法:      //这个还不太理解。Allen
    public class MoneyTest extends TestCase {//TestCase的子类51Testing软件测试网Sm/v!~2oT
        ....51Testing软件测试网R)N3g#P!]4x
        public static Test suite() {静态Test
    @ rS@"FN(mA#G0        return new TestSuite(MoneyTest.class); //以类为参数51Testing软件测试网BLj0e!R_
        }
    e!m#m)KTr.|0}

    @._H tv| P0  TestSuite见嵌套的例子,在后面应用案例中有。
    )MO$o)pZ2YXZ-^0  

 

I*[r5w4B,^w#K0

4、测试代码的运行51Testing软件测试网:P9| ix/qt
  先说最常用的集成模式。51Testing软件测试网,?:}9~9a Q,]a1D2jh
  测试代码写好以后,可以相应的类中写main方法,用java命令直接运行;也可以不写main方法,用Junit提供的运行器运行。Junit提供了textui,awtui和swingui三种运行器。
)^ o-g%Dyqal0u:nb0  以前面第2步中的AllTests运行为例,可有四种:51Testing软件测试网r qx1Hokj8A

java junit.textui.TestRunner junit.samples.AllTests51Testing软件测试网Z:p/S*e&I wW Z4a
java junit.awtui.TestRunner junit.samples.AllTests
!`3x3kSS0be~0java junit.swingui.TestRunner junit.samples.AllTests
AQ J k!Q\X(jl0java junit.samples.AllTests

  main方法中一般也都是简单地用Runner调用suite(),当没有main时,TestRunner自己以运行的类为参数生成了一个TestSuite.
  
  对于命令模式的运行,有两种方法。
  • 静态方法51Testing软件测试网 kg~j#U.B9f
    TestCase test= new MoneyTest("simple add") {
    2n@ xo H){0public void runTest() {51Testing软件测试网.j(B!iw ~3q
    testSimpleAdd();51Testing软件测试网$P)?J$Z-S
    }
    u'Ii Zf7l*X0};
    51Testing软件测试网6~$]\-v3{v t"]J
  • 动态方法
    jSh,@&Z m2\ck/I0
    TestCase test= new MoneyTest("testSimpleAdd");

  我试了一下,好象有问题,哪位朋友成功了,请指点我一下。确实可以。
import junit.framework.*;

 51Testing软件测试网Z o9h,s;X;G F C

public class MoneyTest extends TestCase {//TestCase的子类51Testing软件测试网(FP/w:A gr v}
    private Money f12CHF;//提取公用的对象51Testing软件测试网 X.h9`*`$sZ1l5T7`k
    private Money f14CHF;   51Testing软件测试网pu-x*z Y3W
    public MoneyTest(String name){
PKi.M@0        super(name);
Go V vu5N0    }
t;z7f]BX0    protected void setUp() {//初始化公用对象51Testing软件测试网;JEz~(H%l l1A
        f12CHF= new Money(12, "CHF");
cjv0m;Zdl0        f14CHF= new Money(14, "CHF");51Testing软件测试网)K#Sk^{(WV)I
    }51Testing软件测试网4W I'oNa(n ^s
    public void testEquals() {//测试equals方法的正确性51Testing软件测试网1S7@X)F5Z{,Jt
        Assert.assertTrue(!f12CHF.equals(null));51Testing软件测试网'uXN:LS$}9FD.j
        Assert.assertEquals(f12CHF, f12CHF);
1d$m8N$qM6U$pV-i,k0        Assert.assertEquals(f12CHF, new Money(12, "CHF"));51Testing软件测试网|'|v3p8U*@
        Assert.assertTrue(!f12CHF.equals(f14CHF));
)d3G MEI\f0    }
XMs @)_ V{rX7F0    
*AJt0?M0    public void testAdd() {//测试add方法的正确性51Testing软件测试网$y[-s[6Xun^:S
        Money expected= new Money(26, "CHF");
/y"F.O(hfwxF t0        Money result= f12CHF.add(f14CHF);51Testing软件测试网8B-}|5ztyT
        Assert.assertTrue(expected.equals(result));
6XNm&P|+dI0    }
h?X9R ~MJ+x8S0//    public static void main(String[] args) {51Testing软件测试网o;O\ G*T$R6M
//        TestCase test=new MoneyTest("simple add") {
V!s#G^$v4Jw0//                public void runTest() {51Testing软件测试网Z;J$u,D!^+WO
//                    testAdd();51Testing软件测试网2Ua D0A~+y+_G
//                }
9o0o+~4O#{Xn,~V0//            };
c|L tvDL \0//        junit.textui.TestRunner.run(test);51Testing软件测试网0U.Ws*z3K#APF
//    }51Testing软件测试网/|;D.\4z,s
    public static void main(String[] args) {
'D&mH.S P8o!W6}/e]0        TestCase test=new MoneyTest("testAdd");
ng4p'T/Xy(W0        junit.textui.TestRunner.run(test);
/sz| TBR`0    }51Testing软件测试网 ciHQ9P L_
}51Testing软件测试网x,E+\o?S&@/t1b


再给一个静态方法用集成测试的例子:
public static Test suite() {
.U _G_ CzAPh)c0    TestSuite suite= new TestSuite();
~6\i M'v+f+W:f8^0    suite.addTest(
@P El$w'p0Y vz0        new testCar("getWheels") {51Testing软件测试网D1QK&ZX&wC
            protected void runTest() { testGetWheels(); }51Testing软件测试网'cmH](gQ@ fL"|
        }51Testing软件测试网1m*KPz!vSr$w D
    );

 51Testing软件测试网dSANv ` H+B/M

    suite.addTest(
)IJw:`s0        new testCar("getSeats") {51Testing软件测试网V pj[`:dw
            protected void runTest() { testGetSeats(); }
$Au:w"G&c;O,HR8x0        }
5e}fL!@6W0    );51Testing软件测试网!V%Sw ]#p
    return suite;51Testing软件测试网ts)|P;Ssfz5@
}

HIi aU0

TAG:

常春华的个人空间 引用 删除 常春华   /   2016-10-21 16:19:02
喜欢。
常春华的个人空间 引用 删除 常春华   /   2016-10-21 16:18:52
5
 

评分:0

我来说两句

allenzgw

allenzgw

美国, 佛罗里达 Enjoy sand, sunshine, sailing.

日历

« 2024-04-13  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 163081
  • 日志数: 119
  • 图片数: 1
  • 书签数: 2
  • 建立时间: 2007-01-28
  • 更新时间: 2016-06-03

RSS订阅

Open Toolbar