2010-02-14 103 views
0

背景
我目前編寫的網絡協議的客戶端測試用例。作爲測試的一部分,我必須模擬來自服務器的幾種不同的預期和意外的響應(錯誤的報頭,連接丟失,意外的消息,超時)。
這些測試用例中的每一個都可以通過它的唯一地址訪問。
我的問題
目前的實現被分爲幾個部分:乾淨的方式來重構測試代碼

  • 包含的測試案例中的所有地址的枚舉
  • 包含所有測試,靜態函數的類測試
  • 將函數名稱映射到相應的枚舉的多個定義
  • 將函數和名稱作爲參數的包裝類
  • 它返回包裝類對象的列表的方法,對於每個測試用例

對於接收到的服務器中的每個消息中的一個對象檢查的測試案例列表,要麼執行對應於測試案例地址或回退到默認響應。
問題
這個實現要求我爲每個新的測試用例更新至少五個不同的位置,並且類Test增長相當快。有沒有一種重構它的好方法?
示例代碼:(該代碼是無效的C++)

enum TestAddress 
{ 
    TEST_CONNECTION_BREAKDOWN = 0x100, 
    TEST_ALL_IS_GOOD = 0x101, 
} 


class Wrapper : AbstrTestCase //AbstrTestCase requires applies and test implementations 
{ 
typedef testFun; 
Wrapper(TestAddress addr,testFun func,string name) 
boolean applies(int ad,...){return addr == ad;} 
int test(...){return func(...);} 
} 
class Test 
{ 
static int testConnectionBreakDownFunc (...) 
static int testAllIsGoodFunc(...) 
} 
#define TEST_CONNECTION_BREAKDOWN_FUNC Test::testConnectionBreakDownFunc 
#define TEST_ALL_IS_GOOD_FUNC Test::testAllIsGoodFunc 

list<AbstrTestCase*> GetTests() 
{ 
    list<AbstrTestCase*> tlist; 
    tlist.push_back(new Wrapper(TEST_ALL_IS_GOOD,TEST_ALL_IS_GOOD_FUNC,"TEST_ALL_IS_GOOD")); 
    ... 
    tlist.push_back(new Wrapper(TEST_CONNECTION_BREAKDOWN,TEST_CONNECTION_BREAKDOWN_FUNC,"TEST_CONNECTION_BREAKDOWN_FUNC")); 
    return tlist; 
} 

相關:我最後atemp至少清理GetTests()的代碼是一個附加的限定用於包裝物的參數

#define WRAP_ARGS(N) N,N##_FUNC,#N 
tlist.push_back(new Wrapper(WRAP_ARGS(TEST_CONNECTION_BREAKDOWN)); 
#undef WRAP_ARGS(N) 

,而它導致更乾淨外觀的代碼,它只是隱藏像你一樣我有過類似的問題,這個問題

回答

0

。我通常採用的方法是通過腳本來管理它,以便自動將代碼添加到不同的地方。評論標誌着腳本處理文件的意義,因此您不需要編寫複雜的解析器。例如:

/* automatic code insertion point. Don't remove this comment */ 

然後你寫一個小腳本。宏有很多不能做的事情,爲了減少寫入而模糊代碼很少是一個好主意。因此編寫更新五個位置的腳本。