1. 程式人生 > >如何編寫單元測試程式碼

如何編寫單元測試程式碼

                                         如何編寫單元測試程式碼

     本文通過介紹簡單測試程式碼的編寫來進一步闡述單元測試的基本原理和方法,下面用最容易理解和測試的加法函式來介紹測試程式碼的編寫,函式程式碼如下:

int add(int a,int b)

{

    return a + b;

}

測試程式碼如下:

void test_add()

{

       //設定輸入

     int a = 1;

     int b = 1;

       //執行被測程式

     int ret = add(a, b);

       //

判斷輸出是否符合預期

       TEST_ASSERT(ret == 2);

}

TEST_ASSERT()是一個巨集,定義如下:

#define TEST_ASSERT(exp) test_assert(exp,__FILE__,__LINE__)

這個巨集呼叫了函式test_assert(),定義如下:

int assertCount = 0;

int errorCount = 0;

void test_assert(int b, constchar

 *file,int line)

{

    assertCount++;

   if(!b)

    {

        printf("error: %s Line %d!\n", file, line);

        errorCount++;

    }

}

test_assert()是一個測試斷言函式,測試斷言的功能是當預期的輸出與實際的輸出不符時,自動報告錯誤。test_assert()有三個引數:

int b,傳遞預期輸出的計算結果,0表示false,即測試未通過;

constchar *file,所在檔案;

int line,所在行號。

test_assert()函式的功能很簡單:統計斷言數和錯誤數,當引數bfalse時,列印一條錯誤資訊。

有了以上定義,就可以用以下程式碼判斷預期輸出:

TEST_ASSERT(ret == 2);

現在還有一些問題:多個用例如何比較簡單地編寫程式碼?如何便於以後的擴充?例如,每個用例執行前可能要做共同的初始化,執行後要做相同的清理。我們可以定義以下程式碼:

externvoid setUp();                 //公共前置操作

externvoid tearDown();              //公共後置操作

#define CASE_BEGIN()     {setUp();

#define CASE_END()       tearDown();}

setUp()為公共前置操作,用於初始化,tearDown()為公共後置操作,用於清理資料。

用例程式碼改為:

CASE_BEGIN()

int a = 1;

int b = 1;

int ret = add(a, b);

TEST_ASSERT(ret == 2);

CASE_END();

        現在,用例的前後加了{},每個用例獨佔一個域,可以使用相同的變數名,更多的用例可以採用拷貝並修改輸入輸出值的方式建立,下面是第二個用例:

CASE_BEGIN()

int a = 10;

int b = 10;

int ret = add(a, b);

TEST_ASSERT(ret == 20);

CASE_END();

      通常,不同的用例之間只是個別輸入輸出不同,拷貝修改是比較簡單高效的方法。