【问题标题】:unit-test for c - how to test a 'unit' without recompiling/relinking?c 的单元测试 - 如何在不重新编译/重新链接的情况下测试“单元”?
【发布时间】:2014-10-01 11:53:21
【问题描述】:

我是单元测试的新手,但不是 C(在嵌入式环境中)- 我有一个概念问题,我确信有一个简单的答案......我只是很难得到这个答案。

在阅读了几本关于该主题的书籍之后,我开始尝试单元测试 - 书中的示例总是看起来很清楚,但微不足道,但都没有真正触及我所缺少的部分(或者如果确实如此,它超出了我的想象)。

我已经开始在我们的一个协议栈上进行单元测试实验,该协议栈有四个层(应用程序、演示、会话、传输)。为了清楚起见,保持示例简单,每一层可能有一个到多个功能。如果我想对 App 层进行单元测试,我想我应该明白我会“存根”表示层的接口(或为表示层创建一个模拟?),以便隔离应用层.我已经尝试过了,一切似乎都很好。

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

感谢您的洞察力。

【问题讨论】:

  • 图层的公共接口是什么?您可以从单独的可执行文件中使用 API>
  • 一些单元测试库要求您使用一些自定义标志来构建以模拟全局函数。为什么要避免重建?无论如何它应该很快。

标签: c++ c unit-testing


【解决方案1】:

我不确定 C++,但如果是 C, 一种建议的方法是进行条件编译。这样您就可以编译为真实项目或进行单元测试。所以在单元测试中,存根被执行。

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

【讨论】:

    【解决方案2】:

    免责声明,我在 Typemock 工作。

    您可以使用Typemock Isolator++ 在 c\c++ 中模拟您需要的任何内容。 隔离器在运行时工作,因此您无需重新编译或更改您的生产代码,see example:

    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);
    }
    

    您还可以以相同的方式模拟具体的类、静态和全局函数。

    【讨论】:

      猜你喜欢
      • 2017-12-01
      • 2015-01-12
      • 1970-01-01
      • 1970-01-01
      • 2023-01-09
      • 2013-11-24
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      相关资源
      最近更新 更多