C 的单元测试 - 如何在不重新编译/重新链接的情况下测试'unit'?

unit-test for c - how to test a 'unit' without recompiling/relinking?

本文关键字:测试 情况下 单元测试 unit 链接 新链接 新编译 编译      更新时间:2023-10-16

我是单元测试的新手,但不是C(在嵌入式环境中)-我有一个概念问题,我确信有一个简单的答案…我只是想不出那个答案。

我已经开始尝试单元测试,在阅读了几本关于这个主题的书之后——书中的例子总是看起来很清楚,但是琐碎,但是没有真正触及到我所缺失的部分(或者如果有,它超出了我的头脑)。

我已经开始在我们的一个协议栈上进行单元测试,该协议栈有四层(应用程序,演示,会话,传输)。为了保持示例的简单性,每个层可能有一到几个函数。如果我想对应用程序层进行单元测试,我想我应该明白,为了隔离应用程序层,我应该将接口"存根"到表示层(或者为表示层创建一个模拟?)。我已经试过了,一切似乎都很好。

然而,我的问题是,如何在不重新编译或重新链接目标的情况下对表示层进行单元测试,从而生成一堆可执行文件?

我不确定c++,但在C的情况下,一个建议的方法是进行条件编译。这样您就可以将其编译为实际项目或单元测试。所以在单元测试中,存根会被执行。

但是因为你不想重新编译它,有一个非常粗鲁的方法,那就是有两个部分的函数依赖于一个标志。因此,在运行时,如果您更改标志值,则执行第二部分,因此在这种情况下,您的实际函数可以充当存根。

免责声明,我在Typemock工作。

你可以使用Typemock isolator++来模拟任何你在c++中需要的东西。隔离器在运行时工作,因此您不需要重新编译或更改生产代码,请参见示例:

production.dll中的production.cpp

class MyPureClass
{
public:
   virtual int GetResult() = 0;
}

test.dll中的test.cpp

TEST_METHOD(Method1)
{   
    //mock the class = its methods will return fake objects (recursively) or default values
    MyPureClass* fakeMyClass = FAKE<MyPureClass>(); 
    //assign specific return value to a method
    WHEN_CALLED(fakeMyClass->GetResult()).Return(10);
}

你还可以模拟具体类,静态和全局函数…

相关文章: