C++ 单元测试,模拟对象

标签 c++ unit-testing

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

  1. boost.test 中似乎没有模拟工具,但我很难想象在不创建模拟对象/函数的情况下进行单元测试。您将如何在 boost.test 中执行此操作,您是手动执行(如何?我的意思是,我可以想到几种方法,但没有一种看起来不错),或者您只是在没有模拟对象的情况下执行此操作?

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

最佳答案

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

    1. 按照通用 google mock 文档中指定的虚拟方式实现所有内容。
    2. 分析您的代码以找出不足之处
    3. high-perf dependency injection 替换那些配置文件部分(或者更确切地说,表明性能有问题的代码段)相反。
    4. 不要用高性能 DI 替换所有东西,因为那样会导致编译时间过长。

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

编辑:我在上面的问题 #2 中漏掉了非常重要的词not -- 您担心性能。如果是这样的话,那么我的回答是你真的完蛋了。 C++ 中的普通函数或方法调用会生成普通方法调用,您没有机会更改该调用点的位置。在大多数情况下,这不需要太多的代码更改,因为正确的 C++ 代码会尽可能使用引用,尽管正在使用虚拟,但不需要修改这些引用。但是,您必须注意任何使用值语义的人,因为他们会遇到切片问题。

关于C++ 单元测试,模拟对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4309410/

相关文章:

c++ - 使用 lambda 函数对 STL 容器进行排序

c++ - C++ 11 中的锁是否保证访问数据的新鲜度?

C++ vector 模板迭代器结束函数

c# - 为什么列表比较失败,如果列表(似乎)相同

java - 启动两个 Junit 测试套件

c++ - 以 cv::Point 为键的 std::map

c++ - 通过指针从c++中的函数返回数组,但是程序如何知道数组大小?

c# - 我如何编写这些单元测试?

unit-testing - Angular 2 在不使用 Testbed 的情况下测试注入(inject) Http 的服务

java - 如何为使用网络连接的类编写 jUnit 测试