一個(gè)單元(Unit)是指一個(gè)可獨(dú)立進(jìn)行的工作,獨(dú)立進(jìn)行指的是這個(gè)工作不受前一次或接下來(lái)的工作的結(jié)果影響,簡(jiǎn)單的說(shuō),是不與上下文(Context)發(fā)生關(guān)?。
如果是在Java程式中,具體來(lái)說(shuō)一個(gè)單元可以是指一個(gè)方法(Method),這個(gè)方法不依賴于前一次運(yùn)行的結(jié)果,也不牽涉到后一次的運(yùn)行結(jié)果。
舉例來(lái)說(shuō),下面這個(gè)程式的gcd()方法可視為一個(gè)單元:
MathTool.java
package onlyfun.caterpillar;
public class MathTool
{
public static int gcd(int num1, int num2)
{
int r = 0;
while(num2 != 0)
{
r = num1 % num2;
num1 = num2;
num2 = r;
}
return num1;
}
}
下面的gcd()方法不視為一個(gè)單元,要完成GCD的計(jì)算,您必須呼叫setNum1()、setNum2()與gcd()三個(gè)方法:
MathFoo.java
package onlyfun.caterpillar;
public class MathFoo
{
private static int num1;
private static int num2;
public static void setNum1(int n)
{
num1 = n;
}
public static void setNum2(int n)
{
num2 = n;
}
public static int gcd()
{
int r = 0;
while(num2 != 0)
{
r = num1 % num2;
num1 = num2;
num2 = r; }
return num1;
}
}
然而要完全使用一個(gè)方法來(lái)完成一個(gè)單元操作在實(shí)行上是有困難的,所以單元也可廣義解釋為數(shù)個(gè)方法的集合,這數(shù)個(gè)方法組合為一個(gè)單元操作,完成一個(gè)工作。
不過(guò)設(shè)計(jì)時(shí)仍優(yōu)先考慮將一個(gè)公開的(public)方法要設(shè)計(jì)為單元,而?量不用數(shù)個(gè)公開的方法來(lái)完成一件工作,以保持介面簡(jiǎn)潔與單元邊界清晰。
將工作以一個(gè)單元進(jìn)行設(shè)計(jì),這可以使得單元可以重用,并且也使得單元可以進(jìn)行測(cè)試,進(jìn)而促進(jìn)類別的可重用性。
單元測(cè)試(Unit Test)指的自然是對(duì)每一個(gè)工作單元進(jìn)行測(cè)試,?解其運(yùn)行結(jié)果是否符合我們的預(yù)期,例如當(dāng)您撰寫完MathTool類別之后,您也許會(huì)這么作個(gè)小小的測(cè)試程式:
UnitTestDemo.java
package onlyfun.caterpillar.test;
import onlyfun.caterpillar.MathTool;
public class UnitTestDemo
{
public static void main(String[] args)
{
if(MathTool.gcd(10, 5) == 5)
{
System.out.println("GCD Test OK!");
}
else
{
System.out.println("GCD Test Fail!");
}
}
}
這個(gè)動(dòng)作是開發(fā)人員很常作的動(dòng)作,然而您必須自行看著測(cè)試程式的輸出結(jié)果來(lái)?解測(cè)試是否成功,另一方面,測(cè)試程式本身也是個(gè)程式,在更復(fù)雜的測(cè)試中,您也許會(huì)遇到測(cè)試程式本身出錯(cuò),而導(dǎo)致無(wú)法驗(yàn)證結(jié)果的情況。
JUnit是個(gè)測(cè)試框架,藉由它所提供的工具,您可以減少撰寫錯(cuò)誤測(cè)試程式的機(jī)會(huì),而另一方面,您可以有更好的方法來(lái)檢驗(yàn)測(cè)試結(jié)果,而不是看著一長(zhǎng)串輸出的文字。