在開發過程中怎樣利用單元和功能測試
在過去的幾年中,單元測試逐漸成為我編寫軟體的核心內容,在這裡要感謝一種叫做極端程式設計-XP(注1)(見“資源”一節)的簡便程式設計方 法。這種方法要求我為新加入的每個函式都編寫單元測試,並且維護這些測試。沒有通過單元測試,我就不能將任何一個的程式碼加到模組中。在程式碼基數增長的同 時,這些測試允許開發者有依據地將改變整合起來。起初,我認為這些單元測試就足以應付全域性,沒有必要涉及到功能測試。噢,又錯了。功能測試和單元測試完全 不同的兩者。我花費了很長的時間才理解到兩者的區別,以及如何將它們結合起來,用以改進開發程式。
本文探討了單元測試和功能測試之間的差別,同時介紹在你的日常開發的過程中如何來利用它測試和開發過程作為一個開發人員,測試如此之重要,以至於你甚至應該花費幾乎所有的時間來完成它。它不僅需要只被劃分為開發過程中的某個特定階段。顯然,它不該是在你把系統交付給客戶之前完成的最後一項任務。然而,你又如何得知它在何時結束呢?或是你如何得知是否因為修改一個微小的bug而破壞了系統的主要功能呢?或是系統可能會演化成超乎現在想象的模樣?測試,單元的和功能的都應該是開發的過程中的一部分。
單元測試應成為你編寫程式碼的核心環節,尤其當你在從事一個專案時,緊張的時間約束你的開發進度,你也很想讓它是在可控的有序下進行。我希望測試也是在你編寫程式碼之前編寫測試時的重要內容。
一套適用的單元測試應具備以下功能:
說明可能的最佳適用設計
提供類文件的最佳格式
判斷一個類何時完成增強開發人員對程式碼的信心
是快速重構的基礎
在系統中自然要包含單元測試所需的設計文件。重新閱讀它,你會發現這是軟體開發程式中的聖盃,文件跟隨系統的變化而逐步演化。為每一個類提供完備的文件比起為它提供一系列的使用框架,或是一系列可控的輸入要好得多。這樣,設計文件就會因為單元測試的逐步通過而隨時更新。
你應該在你編寫程式碼之前完成編寫測試的工序。這樣做會為測試所涉及的類提供設計方案,並促使你關注程式碼中更小的程式模組。這種練習也會使設計方案變得更加簡單。你不能試圖去了解將來的情形,去實現不必要的功能。編寫測試工作也會讓你清楚類會在什麼時間結束。可以說,當所有的測試通過時,任務也就完成了。
最後,單元測試會提供給你更高階別的依據,這絕對會滿足開發者的。如果你在改動程式碼的同時,進行單元測試,你就會在你破壞的同時立即察覺到事態的發生。
功能測試甚至比單元測試更加重要,因為它們說明了你的系統就要預備釋出了。功能測試將把你的工作系統放置於一個可用的狀態中。
一套適用的功能測試應具備以下功能:
有效地掌握使用者的需求
向專案組成員(包括使用者和開發者)給出系統面臨這些需求的依據
功能測試要在有效地情況下掌握使用者的需求。而傳統的開發者是在使用的過程中發現需求的。通常,人們贊同使用專案工程並且花費相當的時間去重新定製它們。當它們被完成時,它們所得到的僅僅是一堆廢紙。功能測試雷同於自行生效的使用專案的情況。極端程式設計方法(ExtremeProgramming)能夠說明這種概念。XP 的說法就是對未來發生在使用者和開發者之間的交流技巧的描述。功能測試也是這種交流的結果。而沒有功能測試,這種說法也不會建立起來的。
功能測試恰好填充了在單元測試和向專案小組提交的程式碼依據之間的空隙。單元測試會漏過許多的bug.它可以給出程式碼中你所需的所有有效部分,它也會 給你所需的整個系統。功能測試可以使單元測試裡漏掉的問題曝光。一系列可維護的,自動化的功能測試也會有漏網的情況,但是它至少比獨立地進行最全面的單元 測試要有用得多。
單元測試VS 功能測試
單元測試告訴開發者程式碼使事情正確地被執行,而功能測試所說的則是程式碼在正確地發揮功效。
單元測試
單元測試是從開發者的角度來編寫的。它們確保類的每個特定方法成功執行一系列特定的任務。每一個測試都要保證對於給定的一個已知的輸入應該得到所期望的輸出。
編寫一系列可維護、自動化、沒有測試框架的單元測試幾乎是不可能的。在你開始之前,選擇一個專案小組都認可的框架。不斷地應用它,逐漸地喜歡它。在極端程式設計的介紹網頁上(見資源一節),有很多適用的單元測試框架。我喜歡用的是Juint 來進行Java 程式碼的測試。
功能測試
功能測試則是從使用者的角度來編寫的。這些測試保證系統能夠按照使用者所期望的那樣去執行。很多時候,開發一個完整的系統更像是建造一座大樓。當然,這種比喻並不是完全地恰當,但我們可以擴充套件它,來理解單元測試和功能測試之間的區別。
注:以上內容來自網路,本人不承擔任何連帶責任
文章轉自:http://se.csai.cn/testtech/200801300052411345.htm
相關文章
- 在.NET開發中的單元測試工具之——NUnit
- 軟體開發過程中值不值得寫單元測試?
- iOS 開發-單元測試iOS
- 單元測試:單元測試中的mockMock
- iOS開發中的單元測試(三)——URLManager中的測試用例解析iOS
- Laravel 測試驅動開發 -- 正向單元測試Laravel
- Maven執行和跳過單元測試Maven
- 單元測試在Unity中的應用Unity
- 在Nodejs中貫徹單元測試NodeJS
- 開發必備之單元測試
- 測試開發之單元測試-禪道結合ZTF驅動單元測試執行
- 怎樣使用Spring Boot專案的單元測試Spring Boot
- 怎樣使用Spring Boot專案的單元測試?Spring Boot
- Mock 在 Python 單元測試中的使用MockPython
- 利用HSQLDB 進行Hibernate單元測試SQL
- java中的單元測試Java
- c#中單元測試C#
- 在單元測試中使用EasyMockMock
- 軟體測試中的功能測試和非功能測試
- 測試 之Java單元測試、Android單元測試JavaAndroid
- 關於前端開發談談單元測試前端
- Windows phone 應用開發[9]-單元測試Windows
- 怎樣在敏捷開發中做到“事半功倍”敏捷
- 在平時的測試過程中,測試需要做推進工作嗎?
- 【軟體測試】軟體及其開發過程
- [譯] 通過 Quick 和 Nimble 在 Swift 中進行測試驅動開發UISwift
- Laravel 單元測試實戰(2)- 編寫實際功能並讓程式碼測試透過Laravel
- iOS 單元測試和 UI 測試快速入門iOSUI
- .Net單元測試xUnit和整合測試指南(1)
- 開發人員必備的技能——單元測試
- 前端開發自動化單元測試趨勢前端
- 開發祕籍——單元測試的迷惑與思考
- puppeteer在開發過程中的實踐
- 微軟為VS.net新增單元測試功能微軟
- 系統測試-從研發到測試過程
- 安卓單元測試 (十一):非同步程式碼怎麼測試安卓非同步
- 測試員進階技能:如何有效地利用單元測試報告?測試報告
- ORACLE儲存過程中建立子過程的測試!Oracle儲存過程