2014-01-27 141 views
0

我有一个现有的C/C++应用程序,它通过多个接口(TCP,DB,共享内存)与其他应用程序/系统进行通信。我想在真实环境下运行一次应用程序,然后“记录”所有函数调用及其返回值(或者更改缓冲区作为参数传递)。我只用“间谍”记录与外部接口(TCP,DB)有关的呼叫。然后我可以再次运行应用程序,但使用应该返回以前记录值的“假”功能。这样我就可以“重放”执行,并检查结果是否与原始执行相匹配。用于集成测试的模拟库

一个重要的功能是模拟时间函数(睡眠,时间,GetLocalTime),因为(例如)对数据库的调用可能在选择中具有当前日期或时间。能够比原始执行更快地“重放”所有的呼叫会更好(可以在几分钟内重播一天的执行)。例如,呼叫睡眠(1000)应该不等待就返回,但对GetLocalTime的连续调用应该返回1秒多。这应该考虑到其他线程在时间上应该具有一致的值(例如,库允许一个线程休眠1次调用(1000),另一个线程休眠10次调用(100))。

理想情况下,它不应该对应用程序进行很多更改或重构,只需重新定义对时间函数的调用以及对外部接口(DB,TCP)库的调用即可。

我想知道是否存在实现这些功能的库或框架,或者可能是一个好的起点。

我已经为类似的问题实现了几次解决方案,但对于非常简单的模块,例如嘲笑TCP连接来测试协议实现,但我觉得每次都重新发明轮子,而这些简单的解决方案不会缩放以及更多线程或更多接口的交互。

回答

2

既然你提到你的应用程序是C/C++,我会假设你有能力使用C框架。我会在这个答案中讨论CMock和Unity。如果面向对象的原则在你的任务中更普遍,那么你可以看看类似于CMock的googlemock,但是为​​C++开发并为类进行账户。

-

CMock与团结的组合可以为您的测试需求的框架。

CMock为您提供了轻松模拟公共接口的能力。例如,如果您有以下测试代码:

void sendPacket(char * packet, int packetLen, int tcpSocket) 
{ 
    if (packet) 
    { 
     send(tcpSocket, packet, packetLen, 0); 
    } 
} 

您可以使用CMock创建发送调用的模拟。这将允许您验证传递给发送的参数,从而验证缓冲区中的内容。您还可以验证发送返回的大小。模拟发送函数的CMock的ExpectAndReturn变体允许您执行这两个验证。

CMock还允许您通过StubWithCallback变体为模拟函数提供回调。除了进行特殊检查之外,StubWithCallback还允许您手动验证每个呼叫。你将能够利用StubWithCallback来记录一个函数被调用的次数,或者几乎任何你能想象的东西。您还可以随时间,睡眠等使用StubWithCallback来满足您的需求。您可以使用不同的存根回调模拟个别调用 - 一些线程将以存根睡眠回调开始,该回调立即返回,而您为测试指定的线程可以使用执行完整睡眠的存根睡眠回调。

你可以找到关于CMock这里的更多信息:http://throwtheswitch.org/white-papers/cmock-intro.html

+0

即使CMock似乎不具有记录和重放系统,我问一下,它的代码生成可以使我的生活更轻松。 – user2518618

相关问题