例程13 代碼位置:光盤\TM\01\VWMS\VWMS\frmLogin.cs
private void txtName_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 13) //判斷是否按下Enter鍵
{
txtPwd.Focus(); //使“密碼”文本框獲得焦點(diǎn)
e.Handled = true;
}
}
private void txtPwd_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 13) //判斷是否按下Enter鍵
{
btnLogin.Focus(); //使“登錄”按鈕獲得焦點(diǎn)
e.Handled = true;
}
}
單擊“退出”按鈕,退出當(dāng)前應(yīng)用程序?!巴顺觥卑粹o的Click事件的代碼如下:
例程14 代碼位置:光盤\TM\01\VWMS\VWMS\frmLogin.cs
private void btnExit_Click(object sender, EventArgs e)
{
Application.Exit(); //退出當(dāng)前應(yīng)用程序
}
1.5.4 單元測試
在現(xiàn)代軟件開發(fā)過程中,測試不再作為一個獨(dú)立的生命周期。單元測試成為與編寫代碼同步進(jìn)行的開發(fā)活動。單元測試能夠提高程序員對程序的信心,保證程序的質(zhì)量,加快軟件開發(fā)速度,使程序易于維護(hù)。下面對單元測試及常用的單元測試工具進(jìn)行簡單介紹。
1.單元測試概述
單元測試是在軟件開發(fā)過程中要進(jìn)行的最低級別的測試活動,在單元測試活動中,軟件的獨(dú)立單元將在與程序的其他部分相隔離的情況下進(jìn)行測試。
在一種傳統(tǒng)的結(jié)構(gòu)化編程語言(如C語言)中,要進(jìn)行測試的單元一般是函數(shù)或子過程。在像C++這樣的面向?qū)ο蟮恼Z言中,要進(jìn)行測試的基本單元是類。單元測試不僅僅是作為無錯編碼的一種輔助手段在一次性的開發(fā)過程中使用,單元測試必須是可重復(fù)的,無論是在軟件修改,或是移植到新的運(yùn)行環(huán)境的過程中。因此,所有的測試都必須在整個軟件系統(tǒng)的生命周期中進(jìn)行維護(hù)。
經(jīng)常與單元測試聯(lián)系起來的另外一些開發(fā)活動包括代碼走讀(Code review)、靜態(tài)分析(Static analysis)和動態(tài)分析(Dynamic analysis)。靜態(tài)分析就是對軟件的源代碼進(jìn)行研讀、查找錯誤或收集一些度量數(shù)據(jù),并不需要對代碼進(jìn)行編譯和執(zhí)行。動態(tài)分析就是通過觀察軟件運(yùn)行時的動作,來提供執(zhí)行跟蹤、時間分析以及測試覆蓋度方面的信息。
2.單元測試的優(yōu)點(diǎn)
一種驗證行為
程序中的每一項功能都是通過測試來驗證它的正確性。它為以后的開發(fā)提供支援。就算是開發(fā)后期,也可以輕松地增加功能或更改程序結(jié)構(gòu),而不用擔(dān)心這個過程中會破壞重要的東西。而且它為代碼的重構(gòu)提供了保障。這樣,可以更自由地對程序進(jìn)行改進(jìn)。
一種設(shè)計行為
編寫單元測試將使我們從調(diào)用者的角度觀察、思考,特別是先寫測試(test-first),迫使我們把程序設(shè)計成易于調(diào)用和可測試的,即迫使我們解除軟件中的耦合。
一種編寫文檔的行為
單元測試是一種無價的文檔,它是展示函數(shù)或類如何使用的最佳文檔。這份文檔是可編譯、可運(yùn)行的,并且它保持最新,永遠(yuǎn)與代碼同步。
有回歸性
自動化的單元測試避免了代碼出現(xiàn)回歸,編寫完成之后,可以隨時隨地地快速運(yùn)行測試。
3.越到項目后期,單元測試為何越難進(jìn)行
在很多項目的初期,項目中的大部分程序員都能夠自覺地去編寫單元測試。隨著項目的進(jìn)行,任務(wù)加重、離交付時間越來越近、不能按時完成項目的風(fēng)險越來越大,單元測試就往往成為犧牲品了。項目經(jīng)理因為進(jìn)度的壓力不再重視,程序員也因為編碼的壓力和無人看管而不再為代碼編寫單元測試了。筆者親身經(jīng)歷的項目都或多或少地發(fā)生過類似的事情。越是在項目的后期,能堅持編寫單元測試的程序就在整個項目組中占很低的項目比例。
為了追趕項目進(jìn)度,多數(shù)程序員將沒有經(jīng)過任何測試的程序代碼上傳到版本控制系統(tǒng),項目經(jīng)理也不再追問,照單全收。這樣做的結(jié)果就是在項目后期,技術(shù)骨干人員只好加班加點(diǎn)進(jìn)行系統(tǒng)集成。集成完了之后,下發(fā)給測試人員測試時,BUG的報告數(shù)量翻倍增長。程序員開始修改BUG,但是還有非常多的BUG隱藏更深,一直潛伏到生產(chǎn)環(huán)境中去。
總之,在現(xiàn)代軟件開發(fā)過程中,測試不再作為一個獨(dú)立的生命周期。單元測試成為與編寫代碼同步進(jìn)行的開發(fā)活動。單元測試能夠提高程序員對程序的信心,保證程序的質(zhì)量,加快軟件開發(fā)速度,使程序易于維護(hù)。
4.NUnit單元測試工具的介紹與使用
NUnit使用前介紹
NUnit是一個單元測試工具,專門測試.NET開發(fā)的程序,同類產(chǎn)品還包括Junit(Java)、CPPUnit(C++),都屬于xUnit中的成員。NUnit是xUnit家族中的第4個主打產(chǎn)品,完全由C#語言來編寫,目前NUnit的最新版本是NUnit 2.4.3,可以到https://www.nunit.org/網(wǎng)址下載。
下面正式講解NUnit。在講解之前看一下單元測試的運(yùn)行效果圖,如圖1.12和圖1.13所示。
在圖1.12和圖1.13中,非常容易發(fā)現(xiàn)狀態(tài)條顏色不同,圖1.12中是綠色的,而圖1.13中是紅色的。因為如果所有測試案例運(yùn)行成功,就為綠色;反之,如果有一個不成功,則為紅色。
在右邊面板的中間,可以看到測試進(jìn)度條。進(jìn)度條的顏色反映了測試執(zhí)行的狀態(tài)。
? 綠色:表示目前所執(zhí)行的測試都通過。
? 黃色:意味某些測試忽略,但是這里沒有失敗。
? 紅色:表示有失敗。
? 使用NUnit進(jìn)行單元測試
下面按步驟講解如何在.NET中使用NUint工具。
(1)為單元測試代碼創(chuàng)建一個Visual Studio 2008 類庫項目,并命名為NUNIT,如圖1.14所示。
(2)增加一個NUnit框架引用。在創(chuàng)建NUNIT項目中需要增加一個nunit.framework.dll引用。首先,在菜單欄中選擇“項目”/“添加引用”命令,彈出如圖1.15所示的“添加引用”對話框,然后在安裝的Nunit 2.4.3單元測試工具的目錄下(安裝所在盤:\Program Files\Nunit 2.4.3\bin)找到nunit. framework.dll文件,單擊“確定”按鈕,即可引用到項目中。