測試驅動開發(Test Driven Development, TDD)在敏捷開發流程(Agile Process)中扮演了一個很重要的角色,不過本文的重點在於TDD,不談Agile,實際上我也不懂,不懂的東西我也不談。
第一次接觸TDD,是在開發JSR-184時。在你的JSR(Java Specification Requests)實作和VM整合之前,VM Vendor會要求你的實作至少要通過TCK(Technology Compatibility Kit)。TCK是透過JCP(Java Community Process)取得,目的是用來驗證某JSR的實作品是否符合規範。實際上TCK就是一組使用JavaTest harness的測試包,包含了各種用來測試JSR的單元測試(Unit Test)。
以TCK for JSR-184來說,總共包含了161個測試項目,每一個測試項目裡面又再包含了2至10個子測試項目,而每一個子測試項目裡面又有不定數量的更小的測試。JavaTest是個自動化測試的環境,只要載入JSR-184的測試包,設定好環境之後就可以執行自動測試,然後看看結果如何。
JavaTest的測試都是Java寫的,雖然是Java新手,但是當時在發開發的過程中也能感受到TDD的威力。舉個簡單的例子:對於像我這樣不懂3D的人來說,還可以開發3D引擎,你說利不利害。我只需要想盡辨法讓測試能過關就行了,很多細節其實也不懂。這樣說雖然是比較誇張點,但我想要表達的是,TDD果然是神。
;
話說回來,C/C++是我使用最多的程式語言,所以我如果也要使用TDD的話,就需要找一套支援C/C++的TDD程式工具。因為我沒那麼聰明,所以都只挑簡單易用的,最後終於讓我找到了CppUnitLite這個工具。實際上是在閱讀<修改代碼的藝術>這本書時,從中學到的,CppUnitLite是作者設計實作的一套短小精幹的UnitTest工具,簡單易用。
這本書的內容我全部忘光光了,但我學會了使用CppUnitLite就算是值回票價了。現在底下內容要作個簡單的介紹,看看如何撰寫單元測試。
;
下載後解開檔案,我們只需要將om/CppUnitLite裡的檔案加到我們自己的專案就可以了,om/CppUnitLite裡的Cpp和CppUnitLite資料夾不用管它。
接下來就可以開始撰寫測試了,底下示範一個超簡單的測試。
Failure: "b == c" line 12 in d:\vs.net\testc\main.cpp
There were 1 failures
如果把第三條測試改為CHECK(b != c),則測試就能夠通過,輸出結果如下:
There were no test failures
很簡單吧。完。
;
目前使用CppUnitLite在smallworld2的開發上。每次新增功能,我的步驟是先設計介面,然後撰寫測試,最後實作。使用CppUnitLite可以很簡單的撰寫單元測試,但真正困難的是如何撰寫出好的測試,這是另外一個課題了。最後要補充說明的是,測試單元也是代碼,所以不要以為測試代碼不會有Bug。
第一次接觸TDD,是在開發JSR-184時。在你的JSR(Java Specification Requests)實作和VM整合之前,VM Vendor會要求你的實作至少要通過TCK(Technology Compatibility Kit)。TCK是透過JCP(Java Community Process)取得,目的是用來驗證某JSR的實作品是否符合規範。實際上TCK就是一組使用JavaTest harness的測試包,包含了各種用來測試JSR的單元測試(Unit Test)。
以TCK for JSR-184來說,總共包含了161個測試項目,每一個測試項目裡面又再包含了2至10個子測試項目,而每一個子測試項目裡面又有不定數量的更小的測試。JavaTest是個自動化測試的環境,只要載入JSR-184的測試包,設定好環境之後就可以執行自動測試,然後看看結果如何。
JavaTest的測試都是Java寫的,雖然是Java新手,但是當時在發開發的過程中也能感受到TDD的威力。舉個簡單的例子:對於像我這樣不懂3D的人來說,還可以開發3D引擎,你說利不利害。我只需要想盡辨法讓測試能過關就行了,很多細節其實也不懂。這樣說雖然是比較誇張點,但我想要表達的是,TDD果然是神。
;
話說回來,C/C++是我使用最多的程式語言,所以我如果也要使用TDD的話,就需要找一套支援C/C++的TDD程式工具。因為我沒那麼聰明,所以都只挑簡單易用的,最後終於讓我找到了CppUnitLite這個工具。實際上是在閱讀<修改代碼的藝術>這本書時,從中學到的,CppUnitLite是作者設計實作的一套短小精幹的UnitTest工具,簡單易用。
這本書的內容我全部忘光光了,但我學會了使用CppUnitLite就算是值回票價了。現在底下內容要作個簡單的介紹,看看如何撰寫單元測試。
;
下載後解開檔案,我們只需要將om/CppUnitLite裡的檔案加到我們自己的專案就可以了,om/CppUnitLite裡的Cpp和CppUnitLite資料夾不用管它。
接下來就可以開始撰寫測試了,底下示範一個超簡單的測試。
#include "CppUnitLite/TestHarness.h"以上,我們寫了一個簡單的測試單元:TEST(test, test1)。每一個測試用TEST這個Macro指定,名稱由二部份組成。它作了三個小測試,二二比較變數。前二個測試內容為真,所以沒問題可以通過,不過第三個測試b==c就不為真了,所以測試到這裡就失敗了。輸出結果如下:
TEST(test, test1)
{
int a = 1;
int b = 1;
int c = 2;
CHECK(a == b);
CHECK(a != c);
CHECK(b == c);
}
int main()
{
TestResult tr;
TestRegistry::runAllTests(tr);
}
Failure: "b == c" line 12 in d:\vs.net\testc\main.cpp
There were 1 failures
如果把第三條測試改為CHECK(b != c),則測試就能夠通過,輸出結果如下:
There were no test failures
很簡單吧。完。
;
目前使用CppUnitLite在smallworld2的開發上。每次新增功能,我的步驟是先設計介面,然後撰寫測試,最後實作。使用CppUnitLite可以很簡單的撰寫單元測試,但真正困難的是如何撰寫出好的測試,這是另外一個課題了。最後要補充說明的是,測試單元也是代碼,所以不要以為測試代碼不會有Bug。
留言
張貼留言