2012年12月30日 星期日

[TDD] 使用 Google C++ Testing Framework

1. 下載:
http://code.google.com/p/googletest/downloads/detail?name=gtest-1.6.0.zip

2. 解壓並參考 README 檔中使用 cmake 編譯的方法
mkdir mybuild
cd mybuild
cmake -Dgtest_build_samples=ON ../

即會在 mybuild 資料夾裡看到 libgtest.a 及 libgtest_main.a
前著為 gtest 的 library, 後者我猜是用來呼叫測試 function 的 main()

另外還會產生幾個 sample/ 資料夾的測試程式,可以執行看看結果如何?

3. 測試用程式碼:

測試程式 square_test.c
#include "square.h"
#include "gtest/gtest.h"

TEST(SquareTest, integer) {
EXPECT_EQ(4, mysquare(2));
}

TEST(SquareTest, negtive) {
EXPECT_TRUE( mysquare(-2) > 0 );
}

TEST(BoundaryTest, large) {
EXPECT_EQ(10497436849, mysquare(102457));
}

假設我們要測一個 function, 它會傳回參數的平方,TEST() 的第一個引數為測試類別,名字自已取,第二個為測試名稱,一樣自已取。所以上述程式碼建立了三個測試,先測試傳入整數 2,並驗証傳回值是不是 4?第二個傳入負數 -2, 並檢查它是不是大於 0? 第三個測試 102457 的平方, 因為 mysquare() 的引數跟回傳值訂為 int,所以值一定會太大沒辦法用 int 表示,這個測試應該要失敗。

接下來是 square.h 及 square.c, 即 mysquare() 這個 function 的實作:

square.h 的內容:
int mysquare(int val);

square.c 的內容:
#include "mysquare.h"
int mysquare(int val)
{
return val*val;
}

4. 編譯及連結:
g++ -I./ -I${GTEST_DIR}/include -c square_test.c -o square_test.o
g++ -I./ -I${GTEST_DIR}/include -c square.c -o square.o
g++ -L../mybuild/ -lgtest_main -lgtest square.o square_test.o -o test

5. 測試結果:

由測試結果可以看到,有兩個 testcase, 即 SquareTest 跟 BoundaryTest,有三個 test,即 integer 跟 negtive 以及 large。

成功的測試以綠色表示,失敗的測試以紅色表示。這即是 TDD 開發方法中提及的 Red-Green-Refactor 三元素的前面兩個。先寫出測試程式讓測試不過,再實作 function 讓測試通過,最後重構以改進程式碼。




沒有留言: