用于集成测试的模拟库

时间:2014-01-27 09:17:17

标签: c++ c testing mocking integration-testing

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

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

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

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

我已经针对类似的问题实施了几次解决方案,但对于非常简单的模块,例如模拟TCP连接来测试协议实现,但我觉得每次重新发明轮子,这些简单的解决方案不能很好地扩展更多线程或与更多接口的交互。

1 个答案:

答案 0 :(得分:2)

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

-

CMock与Unity结合可能会为您的测试需求提供框架。

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