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

DaV*_*nci 9 c++ unit-testing

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

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

  2. googletest和googlemock看起来像mockingupport的好库,但它需要每个被模拟的对象都是虚拟的.我不是很喜欢这个,并不是我担心性能(我可以定义一个宏来解决它的生产代码)但是我觉得这非常具有侵入性.我想知道是否有另一种解决方案不需要对现有代码进行太多更改?(喜欢那里的clojure)

Bil*_*eal 6

  1. Boost :: Test没有模拟框架或库.如果你想要嘲笑,你必须自己做,或者使用像GMock这样的东西.当然,你可以使用谷歌模拟与Boost :: Test没有问题.
  2. 你还有什么期望可以模仿的东西?这就是它在其他所有编程语言中的工作方式!(好吧,不是使用duck typing,但是它比虚拟方法带来更多的开销)如果你关心性能:

    1. 根据一般谷歌模拟文档中指定的虚拟实现所有内容.
    2. 为不够的地方描述您的代码
    3. 使用高性能依赖注入替换那些已分析的部分(或者更确切地说,代码段表示性能是一个问题).
    4. 不要用高性能DI替换所有东西,因为这会将编译时间发送到屋顶.

    尽管如此,我认为虚拟呼叫不会在性能方面产生巨大差异.虚拟是坏的一种情况是它们位于内部循环内部(例如在iostream库中可能为输入或输出的每个字符调用它们),甚至仅在性能敏感的代码中.

编辑:我错过了很重要的词没有在上面的问题#2 -你是 不是担心性能.如果是这样的话,那么我的回答是你有效地搞砸了.C++中的普通函数或方法调用生成普通方法调用,并且没有机会让您更改调用指向的位置.在大多数情况下,这不需要太多的代码更改,因为正确的C++代码尽可能使用引用,尽管正在使用虚拟,但不需要修改引用.但是,对于使用值语义的人来说,你必须要小心,因为它们会受到切片问题的影响.


Dav*_*ams 6

Turtle明确设计用于Boost.Test,看起来对我很好.