摘要:該文介紹了在軟件測試課程的教學過程中,結合學生所學的Java的相關知識,用案例教學法來講解面向?qū)ο髥卧獪y試這一教學內(nèi)容,讓學生既能理解理論知識又能掌握實踐技能,提高學生的學習興趣,培養(yǎng)學生的動手能力。
關鍵詞:Java類;面向?qū)ο蟮膯卧獪y試;測試用例
中圖分類號:G642文獻標識碼:A文章編號:1009-3044(2008)35-2435-02
Object-oriented Unit Testing of the Case Teaching Method
ZHENG Li-xiang
(Quanzhou Senior Technical School, Quanzhou 362000, China)
Abstract: This article describes a software testing in the curriculum, students have learned the combination of Java-related knowledge, the case teaching method used to explain the object-oriented unit testing the contents of teaching so that students can understand the theory of knowledge can master the practical skills and to improve their interest in learning to cultivate the ability of students.
Key words: Java class; object-orient unit test; test case
1 引言
面向?qū)ο蟮膯卧獪y試(簡稱為OO Unit Test)是檢驗面向?qū)ο蟪绦蜃钚挝唬礄z查類有無錯誤的測試工作。因為類是面向?qū)ο蟪绦蛑凶罨镜膯挝唬詫τ陬惖臏y試必須要100%通過,這樣面向?qū)ο髥卧獪y試就顯得非常重要了。面向?qū)ο蟮母拍罴俺绦蛟O計方法本身就是一個難點,那么要幫助學生理解和掌握面向?qū)ο髥卧獪y試就更困難了。學生們對此也覺得很枯燥,聽不懂,學不會,最后放棄了。為了讓學生掌握這方面的知識和技能,我采用的方法是以Java類為例,講解面向?qū)ο髥卧獪y試的基本操作過程,以案例代替概念,理論與實踐相結合,采用案例教學法。
為什么要采用Java類作為案例進行教學呢?這主要是考慮到以下兩點:
一是Java語言是當前應用前景非常好的軟件設計開發(fā)語言,現(xiàn)在的計算機專業(yè)一般都會開設這一課程,并且是在《軟件測試》之前開設,學生有知識基礎。
二是Java語言是純面向?qū)ο蟮恼Z言,它摒棄了C/C++中的一些不易掌握的結構,如指針等,其最小處理單位就是類,而且Java語言的程序非常簡潔,理解起來比較容易。
當然作為案例的Java類不能太難了,否則一開始學生就看不懂該Java類的功能,更不用說理解該類的測試過程了。
為了讓學生能夠掌握面向?qū)ο髥卧獪y試技術,我根據(jù)學生的知識水平,選用合適的被測試的Java類,為其設計測試用例,執(zhí)行測試并生成測試文檔,用完整的案例進行教學。
2 針對面向?qū)ο笳Z言的特征,選擇自動化的單元測試方法
在一個典型的軟件項目中,有兩種類型的測試最為重要:程序員測試和用戶測試,或稱為單元測試和驗收測試。單元測試由程序設計師自行編寫測試代碼,目的在于驗證程序設計師所撰寫的代碼是否依據(jù)其所設想的方式執(zhí)行而產(chǎn)生符合預期的結果。即驗證程序代碼的正確性。如果是對采用面向?qū)ο蠓椒ㄔO計的軟件進行單元測試,就是面向?qū)ο髥卧獪y試了。
通常,在進行面向?qū)ο蟮膯卧獪y試前,我們都要分析幾個問題:
1) 面向?qū)ο蟮膯卧獪y試的對象是誰?
2) 采用人工測試還是自動化測試?
3) 如果是自動化測試,那么使用什么樣的工具合適?
4) 如何進行面向?qū)ο蟮膯卧獪y試?
對于不同的程序代碼來說,以上的問題可能都有不同的答案與之相對應,那么如果使用的是Java語言所編寫的代碼的話,該怎樣決定呢?
首先,我們知道Java語言是一種高級的、通用的、完全面向?qū)ο蟮某绦蛟O計語言,其程序的基本處理單位是類。所以單元測試的對象就是類,即Java的單元測試指的是面向?qū)ο蟮膯卧獪y試。
其次,隨著軟件的復雜程度越來越高,面向?qū)ο髥卧獪y試的工作量也隨之增加了,若采用人工測試恐怕難以完成。因此,自動化的單元測試要比人工測試要來得適用。再者,自動化測試的另一個好處是能生成測試文檔,這樣也可以減少文檔的撰寫工作。
當然,如果選擇了自動化測試就需要工具來支持了,使用何種工具比較合適呢。在此,推薦使用JUnit,這是一種輕量級的測試框架。JUnit是一個開發(fā)源代碼的Java測試框架,用于編寫和運行可重復的測試。它是用于單元測試框架體系xUnit的一個實例(用于Java語言)。主要用于白盒測試,回歸測試。JUnit一般不需要另行安裝,通常集成的程序設計平臺,如Eclipse、JBuilder等都會裝有JUnit。
3 設計簡單的Java類的單元測試用例來解析面向?qū)ο髥卧獪y試
3.1 選取待測試的Java類
為使學生更易理解,案例的選擇要先易后難。我們可以用HelloWorld為例說明JUnit是如何進行單元測試的,因為每一種語言在其學習用書的第一個例子通常都是HelloWorld,它最簡單了。以下是代碼:
// HelloWorld.java
packageHelloWorld ;
public class helloWorld {
public String sayHello( ) {// 返回測試字符串的方法
returnstr;
}
private String str;
}
3.2 設計測試用例,幫助學生掌握測試步驟
為了對HelloWorld類進行測試,我編寫了以下測試用例,它本身也是一個Java類文件。代碼如下:
// HelloWorldTest.java;
package hello.Test ;
import helloWorld.*;
import junit.framework.*;// 引入junit.framework包
public class HelloWorldTest extends TestCase{
//繼承TestCase類
public HelloWorldTest ( String name ) {
super ( name );
}
public static Test suite ( ){
returnnewTestSuite ( HelloWorldTest.class );
}
public static void main ( String args[] ) { //主方法
junit.textui.TestRunner.run ( suite ( ) ) ;
}
// 實現(xiàn)對SayHello方法的測試
private static final String str=”Hello Java!”;
protected void setUp ( ) { // 覆蓋setUp( )方法
HelloWorld JString = newHelloWorld ( ) ;
}
public void testSayHello ( ) {// 測試SayHello方法
assertEquals ( “Hello Java!”,JString.sayHello ( ) );
//通過使用標準的Objcet.equals()方法檢查兩個值是否相等
}
}
3.3 總結測試案例,得出一般性結論
面向?qū)ο髥卧獪y試的類,不論多復雜,測試的基本步驟都是不變的,也就是定義測試類文件,在測試類文件中對被測試的類實例化,然后進行測試,測試完成后釋放所占用的資源,而有變化的是測試的具體對象——類。在面向?qū)ο蟪绦蛑校瑢ο笫菍傩院头椒ǖ姆庋b體,面向?qū)ο髥卧獪y試針對的是類的成員方法(成員函數(shù))測試其是否能完成定義的功能。
該例有還另一個特殊之處:程序員在編寫Java程序時就要考慮到單元測試了。這是當前的一種比較先進的軟件工程方法——測試先行(TDD),所以該例子還讓學生初步了解了新的軟件工程方法學。
4 編寫xml代碼,用于生成單元測試文檔
在上述案例中沒有使用System.out.println()這一打印語句來顯示測試結果。這是因為,首先,如果是一個復雜的系統(tǒng),這種方法很難告訴我們系統(tǒng)是否正常運作。其次,該打印語句進行的是屏幕顯示,沒有保存結果,要查看結果,每次都要運行測試,這樣做費時又費力。所以在面向?qū)ο髥卧獪y試后還應編寫測試文檔。對于Java類的面向?qū)ο髥卧獪y試,我們使用Ant編寫生成測試文檔的代碼。
Another Neat Tool(Ant)是Apache Jakarta中一個很好用的Java開發(fā)工具。Ant將構建和部署的過程自動化,JUnit則將測試自動化。將這兩者擺在一起,Ant就能夠?qū)嫿ǎ渴鹨约皽y試的過程自動化。和JUnit一樣該工具也不需要另行安裝,在集成化的程序設計平臺上就有。
為生成HelloWold的測試文檔,我編寫了以下代碼:
<project name=”junitSample” default=”test”>
<target name=”init”>
<property name=”outdir”
value=”/tmp/junitSample” />
</target>
<target name=”prepare” depends=”init”>
<mkdir dir=”${outdir}” />
</target>
<target name=”compile” depends=”prepare”>
<javac srcdir=”.”destdir=”${outdir}”
classpath=”junit.jar” />
</target>
<taget name=”test” depends=”compile”>
<junit printsummary=”true”>
<formatter type=”xml” />
<test name=”junit.Samples.HelloWordTest” />
<classpath>
<pathelemnet location=”${outdir}” />
</classpath>
</junit>
</target>
</project>
該文件保存為build.xml,通過在含有build.xml文件的目錄中鍵入ant,build或 build.sh運行build.xml腳本就會輸出結果。因為formatter子元素的type屬性值為xml,這樣就可以把測試結果輸出成XML格式,即保存成一個永久文件,而且其結果還能顯示在一個網(wǎng)頁上。
以下即是運行build.xml文件后所生成的XML文件的內(nèi)容:
<?xml version=”1.0”?>
<testsuite errors=”0” failusres=”0”
name=”junit.samples.HelloWorldTest”
test=”6” time=”0.201”>
<testcase name=”testSayHello”
time=”0”></testcase>
</testsuite>
該文件顯示了測試的類文件的名稱junit.samples.
HelloWorldTest,所測試的方法的testSayHello,測試用時0.201,顯示結果testSayHello沒有錯誤。
生成測試文檔后,整個的Java面向?qū)ο髥卧獪y試的過程就完成了。
5 通過測試案例,總結出面向?qū)ο髥卧獪y試的技術方法
在結構化程序時代,單元測試所說的單元是指函數(shù),在當今的面向?qū)ο髸r代,單元測試所說的單元是指類。面向?qū)ο蟮膯卧獪y試沿用了單元測試的概念,但與傳統(tǒng)的單元測試針對的是程序的函數(shù)、過程或完成某一特定功能的程序塊相比面向?qū)ο髥卧獪y試實際測試的是類成員函數(shù)。從具體的實踐來看,為了降低以類作為測試單位的復雜性,提高其可操作性,可以類成員函數(shù)作為單元測試的測試單位,也可以用一個測試類來組織某個類的所有測試函數(shù)。
6 結束語
綜合以上所述,面向?qū)ο蟮膯卧獪y試不易理解與掌握,只講解概念上的理論知識,可能越講學生就越糊涂。因此,采用案例教學是一種不錯的選擇,它將枯燥的概念生動具體化了,學生學習起來也更有興趣了。而且,一般的軟件測試書籍,其內(nèi)容也是理論知識多,實際應用例子少。所以,不僅是面向?qū)ο蟮膯卧獪y試,其他的測試也應盡量地采用案例教學方法,以此幫助學生理解軟件測試的知識,并掌握相應的實際測試軟件的技能。
參考文獻:
[1] Hightower R.Java極限編程[M].北京:機械工業(yè)出版社,2004:137-148.
[2] 賀平.軟件測試教程[M].北京:電子工業(yè)出版社,2005:114-127.
[3] JoeWalnes,Arahanian A,Mike,et al.Java開放源碼編程[M].北京:電子工業(yè)出版社,2005:14-30.