【问题标题】:C++ Unit Tests, mocking objectsC++ 单元测试,模拟对象
【发布时间】:2010-11-30 00:14:40
【问题描述】:

我目前正在查看一些 C++ 中的单元测试库并有一些问题:

  1. 在 boost.test 中似乎没有模拟工具,但我很难想到在不创建模拟对象/函数的情况下进行单元测试。你会如何在 boost.test 中做到这一点,你是手动做的(如何做?我的意思是,我能想到几种方法,这些方法看起来都不是很好)还是你只是在没有模拟对象的情况下做?

  2. googletest 和 googlemock 看起来像带有模拟支持的不错的库,但是,它要求每个要模拟的对象都是虚拟的。我真的不喜欢这样,并不是我担心性能(无论如何我都可以定义一个宏来将其从生产代码中取出),但我觉得这非常具有侵入性。我想知道是否有另一种不需要对现有代码进行太多更改的解决方案? (喜欢clojure)

【问题讨论】:

  • 手写你的模拟。您会发现使用该语言可以做什么,不能做什么。

标签: c++ unit-testing


【解决方案1】:
  1. Boost::Test 没有模拟框架或库。如果你想要模拟,你必须自己做,或者使用像 GMock 这样的东西。当然,您可以毫无问题地将 google mock 与 Boost::Test 一起使用。
  2. 您还能如何期望某些东西是可模拟的?这就是它在所有其他编程语言中的工作方式! (好吧,不是用鸭子打字,但这比虚拟方法带来更多的开销)如果您担心性能:

    1. 按照通用 google 模拟文档中的规定,按照虚拟对象实现所有内容。
    2. 分析您的代码以找出不够用的地方
    3. high-perf dependency injection 替换那些已分析的部分(或者更确切地说,代码中表明性能存在问题的部分)。
    4. 不要用高性能 DI 替换所有内容,因为那样会使编译时间过长。

    不过说真的,我认为虚拟通话不会对性能产生巨大影响。虚拟对象不好的一种情况是它们位于内部循环内部(例如在iostream 库中,可能会为输入或输出的每个字符调用它们),即使这样也仅在性能敏感代码中。

编辑:我错过了上述问题 #2 中非常重要的词 not -- 你 担心性能。如果是这样的话,那么我的回答是你实际上被搞砸了。 C++ 中的普通函数或方法调用会生成普通方法调用,您没有机会更改该调用指向的位置。在大多数情况下,这不需要太多 更改代码,因为正确的 C++ 代码会尽可能使用引用,尽管使用了虚函数,但不需要对其进行修改。但是,您必须注意任何使用值语义的人,因为他们将受到切片问题的影响。

【讨论】:

  • >>您还期望什么东西是可模拟的?这就是它在所有其他编程语言中的工作方式!例如,在 clojure 中,您可以使用绑定形式(binding [foo mock-foo] ...)动态和临时将一个函数重新绑定到另一个函数
  • @DaVinci:你可以在 C/C++ 领域使用宏或链接接缝来做同样的事情,当然这更尴尬。
  • 我可以理解 OP 是否存在性能限制,在这些限制条件下某些东西可能无法实现,但我不明白 关心性能可能意味着 OP被“有效地搞砸了”。
【解决方案2】:

Turtle 是专门为与 Boost.Test 一起使用而设计的,对我来说看起来很不错。

【讨论】:

    【解决方案3】:

    免责声明我在 Typemock 工作。

    Typemock Isolator++ 可以模拟任何东西!!你不需要虚拟 - 一切都是可模拟的

    explanation here

    因此您可以伪造公共、私有、抽象(无需实际创建具体类)、非虚拟、输出参数、实时实例等... 和... 它递归地伪造一切

    class MyClass
    {
       int GetResult() { return -1; }
    }
    

    我们将使用以下代码

    MyClass* fakeMyClass = FAKE<MyClass>(); // every call to fakeMyClass will be faked 
    WHEN_CALLED(fakeMyClass->GetResult()).Return(10);
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    相关资源
    最近更新 更多