39

我试图了解Googlegoogle-mockC++ 模拟框架的目的。

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

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

4

4 回答 4

47

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

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

于 2012-12-04T06:21:54.147 回答
31

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

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

于 2013-04-19T10:15:47.120 回答
14

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

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

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

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

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

于 2015-04-13T19:54:24.090 回答
5

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

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

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

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

于 2019-04-29T10:21:36.473 回答