gtest 和 gmock 有啥区别?

Posted

技术标签:

【中文标题】gtest 和 gmock 有啥区别?【英文标题】:What is the difference between gtest and gmock?gtest 和 gmock 有什么区别? 【发布时间】:2012-12-04 05:01:05 【问题描述】:

我正在尝试了解google-mock、Google's C++ mocking framework 的用途。

我之前已经与gtest 合作过,但我仍然无法理解gmock 是什么。为什么我们需要它?

gtest 用于单元测试。如果unit testing 需要gmock,那么我们需要gmock 做什么?

【问题讨论】:

"...没有单元测试框架,模拟框架什么都不是..."来自:electronvector.com/blog/… 【参考方案1】:

“Google Mock 本身并不是一个测试框架。相反,它需要一个用于编写测试的测试框架。Google Mock 与 Google Test 无缝协作。它附带了一个 Google Test 副本。从版本 1.1.0 开始,您也可以将它与您选择的任何 C++ 测试框架一起使用。" - Google Mock,系统要求

Mock 就像对象一样,被定义为通过提供受控行为来模仿真实交易。例如,要测试股票报价应用程序,您将创建一个虚假股票数据提供者,该提供者创建虚假股票报价来测试您的代码。想想模拟这个词,字面意思是“模仿”。

【讨论】:

【参考方案2】:

软件单元并不生活在绿色的草地上。他们经常需要一些同行来做这项工作。在实际系统中,这些对应物属于系统本身。在单元测试中,它们被替换为模拟。

Gtest 是一个单元测试框架。 Gmock 是一个在单元测试期间模仿系统其余部分的框架。

【讨论】:

【参考方案3】:

假设您正在编写一段代码,该代码需要与不可预测的、昂贵的外部系统(例如网站、大型数据库、物理传感器等)进行交互。系统超时,或者给你错误信息,或者给你不一致的数据。如何测试您的代码是否真正满足这些要求?

好吧,您可以针对实际的网站/数据库/传感器/其他任何东西运行它很多次,并希望您能幸运地遇到您的代码应该处理的所有错误情况。显然是一种相当昂贵且不可靠的测试策略。

因此,您编写的内容满足与网站/数据库/传感器/其他任何接口相同的接口,但您已对其进行编程以产生某些“预设”响应(错误、超时、不一致的数据等)。测试现在将运行得更快(因为它们不会面临真实网站/数据库/传感器/任何东西的开销),而且它们是可预测的。不幸的是,为您需要测试的每个场景编写一个单独的“模拟”网站/数据库/传感器/任何东西都需要大量编码。工作越多,你做的可能性就越小。结果:未充分测试的代码。

Gmock 和它的亲戚自动化了很多这些东西,因此您可以在测试本身的中间指定所需的“固定”行为,而只需几行代码。如果测试很容易编写,您可能会编写更多测试,因此更有可能在发布代码之前发现错误:-)

顺便说一句,这意味着您还需要“依赖注入”:您的代码需要接受接口类型的参数,并且您需要能够传入模拟对象(用于单元测试)或“真实的”网站/数据库/传感器/任何东西(供实际使用)。

【讨论】:

【参考方案4】:

假设你想写一些东西到文件中。

您必须测试系统内存是否已满。

你会让系统内存满来测试这个吗?没有。

您的朋友 Google mock 将在这里为您提供帮助。

【讨论】:

清晰、简单、简短的解释!

以上是关于gtest 和 gmock 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

嵌入式平台gtest白盒测试

Gtest和Gmock使用指南 (3) - 简化掉main()函数

如何使用 GMock 模拟 OpenCV 相机,或者如何使用带有 GTest 的相机测试方法?

如何解决 GTest 和 LibTorch 联动冲突

gmock函数参数输出 备忘录

Google Mock:测试对象的某个属性