清理重构测试代码的方法

时间:2010-02-14 14:13:40

标签: c++ testing refactoring coding-style

背景
我目前正在为网络协议的客户端编写测试用例。作为测试的一部分,我必须模拟来自服务器的几个不同的预期和意外响应(错误的标题,连接丢失,意外消息,超时)。
每个测试用例都可以通过其唯一的地址访问 我的问题
当前的实现分为几个部分:

  • 包含测试用例的所有地址的枚举
  • 包含所有测试作为静态函数的类测试
  • 将函数名称映射到相应的枚举+ _FUNC
  • 的许多定义
  • 一个包装类,它将一个函数和一个名称作为参数
  • 返回包装类对象列表的方法,每个测试用例的一个对象

对于收到的每条消息,服务器都会检查测试用例列表,并执行与该地址对应的测试用例或回退到默认响应。
问题
这个实现要求我为每个新的测试用例更新至少五个不同的位置,并且类测试增长得相当快。有没有一种很好的方法来重构它? 示例代码 :(此代码无效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;
}

相关:我最后一次尝试至少清理GetTests()中的代码是对包装器参数的另一个定义

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

虽然它会产生更清晰的代码,但它只能隐藏问题

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题。我通常采用的方法是通过脚本来管理它,以便自动将代码添加到不同的地方。注释标记脚本处理文件的重点,因此您无需编写复杂的解析器。类似的东西:

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

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