gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 17:24:14 24 4
gpt4 key购买 nike

我目前正在查看 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com