單元測試是一個檢測bug的方法。首先,單元測試適用于單獨的代碼片斷。例如函數,方法。除非這些最小的代碼片斷是正確的,否則,整個軟件的“大廈“將會倒塌。其次,單元測試讓代碼的編寫者也同時來參與代碼的測試。通過測試能夠查出bug,但程序員除了編碼不愿花費時間在其他任何事上。
JUnit是一個開放源代碼的Java類庫,目的是讓單元測試更簡單、有趣。事實上JUnit是如此的有趣以至于程序員會愛上編寫測試代碼。Kent Beck和Erich Gamma從Beck的SmallTalk測試框架中獲得了靈感并建立了JUnit項目。最初的想法是讓編碼和測試能同時進行。程序員寫若干行的代碼,然后為這幾行的代碼編寫測試。如果沒有通過測試,就改正程序中的bug;如果正常通過測試,就繼續編碼和測試。所有的測試碼隨著代碼的變化而變化,一旦運行代碼發生變化,通過回歸測試的方法能保證整個軟件不會因為這些變化而遭到破壞。
編碼和測試的整合是極限編程XP(eXtreme Programming)和敏捷軟件開發活動的中心環節。在敏捷軟件開發過程中,軟件通過不斷增加實現功能來構建,簡言之就是活動的突發催生軟件功能的完善。)為了達到這個目的則必須保證所有已經完成的代碼都是正確的,只有這樣才能有自信在這些代碼的基礎上進行后續開發。
一、JUnit簡介
在單元測試中,我們經常編寫這樣的代碼:按實際需求提供輸入的代碼和以輸出結果形式展示的代碼的運行情況。程序員長期使用的一個簡單的方法是:編寫一系列的if條件語句與預期的結果來進行比較。在JUnit中,我們并不需要這些if語句,而是寫斷言(assertion)。斷言是這樣一個方法:預先標志出期望的結果,并將得到的結果與之進行比較,如果匹配,則斷言成功,否則斷言失敗。
一般的說,測試需要建立“測試框架”:例如初始化變量,創建對象等。在JUnit中,準備工作被稱為裝配(setup)。setup和assertions是相互獨立的,所以相同的測試框架可適用于若干獨立的測試。setup過程在測試以前執行。
而當一個測試結束的時候,可能需要對測試框架進行一些清理活動。在JUnit中,清理活動被稱為拆卸(TearDown)。它保證每一個測試不會留下任何的影響。如果接下來有另一個測試活動開始了,那么這個測試的setup過程就能被正確得執行。setup和teardown被成為一個測試的固定環節
單獨的測試被稱為測試用例(Test Cases),測試用例幾乎不存在于真空中。如果一個項目經歷了若干個單元測試,就能積累一定數量的測試用例集。程序員往往將這些測試一起運行。如果測試一起運行,就將測試聯合成為測試組(test suites)。這種情況下,程序員將多個測試用例組合成為一個測試組(test suites),作為一個單獨的整體來運行。 [Page]
二、一個例子
用實踐來理解JUnit往往更簡單。設想我們需要一個Complex類(當然不是從其他地方得到現成的)。這個Complex類應當包含常規的復數運算和操作,我們會對這些方法進行測試。
首先,新建一個TestCase子類。在這個子類中,為fixture的每一部分(setup和teardown)新建實例變量。然后重寫setUp()(注意保留)方法以初始化變量,重寫tearDown()方法以清理所有測試過程中使用的資源從而避免任何的副作用。在這個例子中,所有的操作并沒有副作用,所以我們并不需要重寫tearDown()方法。Figure 1(a)中展示了如何創建一個TestCase子類并重寫setUp()方法。
(a)
import junit.framework.TestCase;
import junit.framework.Test;
import junit.framework.TestSuite;
public class ComplexTest extends TestCase {
private Complex a;
延伸閱讀
文章來源于領測軟件測試網 http://www.k11sc111.com/