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)
,而它導致更乾淨外觀的代碼,它只是隱藏像你一樣我有過類似的問題,這個問題