2010-02-14 100 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 */ 

然后你写一个小脚本。宏有很多不能做的事情,为了减少写入而模糊代码很少是一个好主意。因此编写更新五个位置的脚本。