Googletest Eclipse C++:如何同时具有测试和生产可执行文件?

2024-02-08

我有一个基本问题谷歌测试 https://code.google.com/p/googletest/在 Eclipse 中。

我正在使用测试运行者 https://github.com/xgsa/cdt-tests-runner/wiki/Tutorial插入运行 Googletests。 但我需要指定一个运行我的单元测试的二进制文件(当然这是有道理的。)

问题是,在我的项目中,我现在有两个主要功能,一个用于运行实际程序,另一个用于运行实际程序。

int main(int argc, char** argv) {
  ::testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}

运行谷歌测试。

每次我想运行一个时,我都会注释掉另一个,这当然是愚蠢的。

但是你用什么做法来处理这种情况呢?


Googletest C++ 是一个单元测试框架。这意味着它是用于测试的 C++ API 的实现。它不是为了测试而设计的programs.

出于实际目的,C++ API 就是您在 C++ 头文件中获得的内容。这 这样一个 API 的实现可能是:

  • 只是头文件本身。 (实现完全是内联的)
  • 头文件加上单个 C++ 源文件
  • 头文件加上一堆C++源文件

概括地说,C++ API 的实现是一个头文件加上 0 个或多个源文件。

说出你的程序my_prog调用您或您的团队开发的 API 用于管理小发明。实现是这样的:

gizmo.h
[gizmo_0.cpp,...gizmo_N.cpp]

where [...] means 可选...

Maybe my_prog依赖于您或您的团队负责的其他 API, 但我们会坚持只用一个。my_prog通过以下方式使用 Gizmo API:-

  • Using #include "gizmo.h"在一些源文件中。
  • 编译[gizmo_0.cpp,...gizmo_N.cpp]源文件(如果有)。
  • 链接[gizmo_0.o,...gizmo_N.o]目标文件(如果有)。

(gizmo_0.obj等(如果您使用的是 Windows)

应该使用 Googletest 测试 Gizmo API 的实现 确认此实施是正确的,独立于my_prog或任何其他依赖它来管理小玩意的程序。所以合并 实施的单元测试在实施中 my_prog被误导了:-

也许你的同事编写了另一个也需要管理小玩意的程序 通过这个实施。或许you再写一篇。这是谁写的 其他程序应该重复合并 Gizmo 单元测试的过程 进入它 - 相同的?不同的? - 并有条件地制定程序 编译为小发明测试工具或现实生活中的任何内容?

你怎么知道小发明的实现没有以某种方式与 独特的功能my_prog,或者通过实施一些 其他APImy_prog以同样的方式使用 - 这样当你或某人 否则尝试在另一个程序中重用它,它会损坏或行为错误吗?

任何依赖于这个小发明实现的程序都不是放置的地方 它的单元测试。制作my_prog有条件地编译不同的main功能所以它可以 双重作为你的小发明库的单元测试工具类似于在 牛仔裤的胯部,让你的头可以穿过。

对 Gizmo 库进行单元测试的方法是编写一个程序is这 这个库的测试工具,仅此而已。这个程序,说gizmo_test, 将要 使用 Gizmo API 的方式与任何其他程序使用它的方式相同,但是 仅用于测试 Gizmo 库。所有这些gizmo_test要做的就是执行测试 通过调用其 API 来访问 Gizmo 库。

作为第一个近似值,GoogleTest 配方为gizmo_test is:

写一个头文件,gizmo_test.h

#include "gizmo.h" in it

#include <gtest/gtest.h> in it

然后在里面写你的Googletest测试用例

编写如下源文件gizmo_test.cpp

#include "gizmo_test.h"

int main(int argc, char** argv) {
  ::testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}

创建一个项目gizmo_test- 在 Eclipse 或您使用的任何开发环境或构建系统中 - 构建了gizmo_test可执行文件:

  • 编译源文件gizmo_test.cpp + [gizmo_0.cpp,...gizmo_N.cpp]
  • 链接生成的目标文件gizmo_test.o + [gizmo_0.o,...gizmo_N.o], plus libgtest以及您的 Gizmo 库所依赖的任何其他库

你有two项目。那个使my_prog和那个使gizmo_test。在您的开发环境中或 构建系统,构建my_prog取决于构建gizmo_test,这样当你改变任何影响 Gizmo 库并重建my_prog, gizmo_test首先被重建。

这是第一个近似值。你有没有注意到不久前我开始谈论你的小玩意library?就是这样 你已经(或应该)了。在 C++ 和一般编程中,API 的实现称为library.

也许您还注意到了配方中的一些脆弱性、不便性和浪费。gizmo_test。您有相同的 Gizmo 源文件集[gizmo_0.cpp,...gizmo_N.cpp]在这两个项目中。因此,您可以在两个项目中以不同的方式编辑、编译和链接它们。它们将在两个项目中进行编译,无论是不同的, 这是wrong,或者相同,这是毫无意义的。

当然,如果这组源文件是空的 - gizmo 库只不过是gizmo.h- 不存在这样的问题。但如果不为空的话 有。

如您所知,在 C++ 中,我们不会通过在每个使用库的程序中构建其源文件来使用库 - 除非它是仅包含头文件的库。 库本身构建成object库(静态或动态),并且要使用它,程序只需包含该库的 头文件并链接对象库。

这也是程序应该如何使用你的小工具库的方式。所以最终的近似值:-

  • 做一个项目libgizmo构建一个 gizmo 对象库(静态或动态,如您认为合适)。
  • 做一个项目gizmo_test如上所述,只不过不是编译和链接[gizmo_0.cpp,...gizmo_N.cpp],它只是链接libgizmo,并使这个项目 取决于libgizmo项目。
  • 做一个项目my_prog正如你现在所拥有的,但不是编译和链接[gizmo_0.cpp,...gizmo_N.cpp],只需链接libgizmo,并使这个项目 取决于gizmo_test项目。

所以你有了three当您构建第一个使用 gizmo 库的程序时,您就可以完成项目了。每个使用 gizmo 库的后续程序都需要一个 更多项目,例如my_prog项目。

Googletest 是为测试 C++ 而设计的图书馆,这就是你应该如何使用它。

现在我对你的程序一无所知,也不知道你目前如何在你的项目中部署 Googletest 测试用例。也许有没有任何一个其中有明确定义的 API 实现 这些测试用例应该可以运行,您可以将其分解到独立的库中。可能是因为你的程序非常简单 对其“组件”进行单元测试是不适用的,您最好编写程序的黑盒测试。更有可能的是因为到目前为止你已经失败了 设计一个能够进行单元测试的程序架构。如果这就是你所发现的,你需要修复它,然后以正确的方式应用Googletest。这将是值得的 努力。

如果需要指出的话,单元测试不是program测试,以及对您的程序所依赖的任何库进行单元测试,如果它们是您的责任,那么您also需要对您的程序进行黑盒测试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Googletest Eclipse C++:如何同时具有测试和生产可执行文件? 的相关文章

  • 套接字编程-listen() 和accept() 有什么区别?

    我一直在读本教程 http www cs rpi edu moorthy Courses os98 Pgms socket html了解套接字编程 看来listen and accept 系统调用都做同样的事情 即阻塞并等待客户端连接到使用
  • 读取大文件并制作字典

    我有一个大文件 我需要读取它并从中制作字典 我希望这一切能够尽可能快 然而我的Python代码太慢了 这是一个显示问题的最小示例 首先制作一些假数据 paste lt seq 20000000 lt seq 2 20000001 gt la
  • 如何使用最小起订量模拟私有只读 IList 属性

    我试图嘲笑这个列表 private readonly IList
  • 是否有可能将 *.pdb 文件包含到发布版本中以查看错误行号?

    我做了一个项目 所有设置都是默认的 当我在调试模式 构建配置 调试 下运行它并遇到异常时 它转储到我的自定义日志记录机制 其中包含错误行号 但是当我运行发布构建时 记录相同的异常 没有行号 只有方法抛出和记录调用堆栈 是否有可能在发布配置
  • std::bind2nd 和 std::bind 与二维数组和结构数组

    我知道 C 有 lambda 并且 std bind1st std bind2nd 和 std bind 已弃用 然而 从C 的基础开始 我们可以更好地理解新特性 所以 我从这个非常简单的代码开始 使用int 数组s 第一个例子 与std
  • 如何在 ASP.NET Core 6.0 Web API 项目中启用 cors?

    在我的 ASP NET Core 6 0 Web API 项目中配置了 CORS 但预检请求收到 http 405 错误 换句话说 不允许使用 HTTP OPTION 看起来 cors 没有启用 我见过的例子config EnableCor
  • 在 Eclipse RCP 应用程序中禁用插件贡献

    我经常遇到这个问题 但尚未找到解决方案 每当我编写一个新的基于 Eclipse RCP 的应用程序并包含来自 Eclipse 平台的插件时 我都会 继承 其中一些插件的 UI 贡献 大多数贡献 菜单项 键盘快捷键 属性页 都很有用 但有时我
  • 如何从 C# 调用 F# 类型扩展(静态成员函数)

    FSharp 代码的结构如下 我无法控制源代码 namespace FS
  • 应用新设置时如何防止 GraphicsDevice 被丢弃?

    我的游戏窗口允许手动调整大小 这意味着它可以像任何其他普通窗口一样通过拖动其边缘来调整大小 游戏还利用了RenderTarget2D rt2d 在主 Draw 方法中设置主渲染目标 GraphicsDevice SetRenderTarge
  • 为什么 rand() 总是返回相同的值? [复制]

    这个问题在这里已经有答案了 可能的重复 在C中生成随机数 https stackoverflow com questions 3067364 generating random numbers in c 使用 rand 生成随机数 http
  • 从二进制文件读取字节到 long int

    我有两个问题 我有二进制文件的数据 我想使用 read 函数读取前 8 个字节以签署 long int 但我不能 你知道我该怎么做吗 如何直接读取一块数据到字符串中 我可以像所示那样阅读吗 前任 ifstream is is open te
  • 原子的 C++ 内存屏障

    在这方面我是个新手 谁能提供以下内存屏障之间差异的简化解释 窗户MemoryBarrier 围栏 mm mfence 内联汇编asm volatile memory 内在的 ReadWriteBarrier 如果没有简单的解释 一些好文章或
  • C# 反序列化过程中创建指向父对象的指针

    我有这样的课程 Serializable public class child public Parent parent Serializable public class Parent public List
  • 确定相关词的编程方式?

    使用网络服务或软件库 我希望能够识别与词根相关的单词 例如 座位 和 安全带 共享词根 座位 但 西雅图 不会被视为匹配 简单的字符串比较对于这类事情似乎是不可行的 除了定义我自己的字典之外 是否有任何库或 Web 服务不仅可以返回单词定义
  • 这些工作队列标志意味着什么?

    在研究工作队列时 我遇到了内核中定义的工作队列标志和常量 我有以下我无法理解的疑问 这里的排水和救援到底是什么意思 WQ DRAINING 1 lt lt 6 internal workqueue is draining WQ RESCUE
  • 按 Enter 继续

    这不起作用 string temp cout lt lt Press Enter to Continue cin gt gt temp cout lt lt Press Enter to Continue cin ignore 或更好 in
  • Web API 2.0 使用 pascalcase 模型接收驼峰式命名的 JSON 数据

    我正在尝试对我的 Web API 进行 PUT 调用 我在 WebApiConfig cs 中设置了以下内容 以处理以驼峰形式将数据发送回我的 Web 项目 config Formatters JsonFormatter Serialize
  • Android Studio图形界面中的ViewFlipper切换?

    感谢您抽出时间并在有时间的情况下回答我的问题 我对 Android 编程相当陌生 所以任何帮助都很棒 我正在使用 Android Studio 并且编写了一个包含多个布局的 XML 布局 我可以在使用 ViewFlipper showNex
  • 如何获取运行或段落的高度

    我找到了Run or Paragraph in FlowDocument现在我需要知道HEIGHT of it i e while navigator CompareTo flowDocViewer Document ContentEnd
  • 线程安全的有限大小队列,不使用锁

    我正在尝试编写一个主题队列 但遇到死锁和其他多线程问题 我想用Interlocked CompareExchange避免lock用法 但这段代码并没有按预期工作 它只是擦除整个队列 我在这里做错了什么 public class FixedS

随机推荐

  • Swift:沿路径部分移动 UIImage

    我正在使用此代码沿曲线移动 UIImage paint curve for sun let path UIBezierPath let imageSunName small sun png let imageSun UIImage name
  • 如何在 Quarkus 中以编程方式注册 bean?

    我正在尝试找到一种在 quarkus DI 中以编程方式创建 bean 的方法 但没有成功 在这个框架下可以吗 看起来BeanManager尚未实现所需的方法 首先我们要明确什么 以编程方式创建bean 确切的意思是 但首先我们应该定义什么
  • 从 NSDate 对象获取 UTC 时间和本地时间

    在 Objective C 中 以下代码使用以下命令生成 UTC 日期时间信息date API NSDate currentUTCDate NSDate date 然而在斯威夫特中 let date NSDate date 结果为本地日期和
  • 如何在 Golang 的单元测试中测试 net.Conn?

    我目前正在考虑为 Go 中的 net Conn 接口以及在该功能之上构建的其他函数创建一些单元测试 我想知道在 Google Go 中进行单元测试的最佳方法是什么 我的代码如下所示 conn net Dial tcp 127 0 0 1 8
  • 对 SQL Server 存储过程进行版本控制的最佳方法是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 设置 rhc(红帽客户端工具)时出错

    我已经按照 Openshift 网站上的说明安装了 rhc 当我跑步时一切看起来都很好gem install rhc and hgem update rhc但当我尝试打电话时rhc我在下面收到以下消息 我尝试重新安装 ruby 和 git
  • SSD 驱动器会让 Maven 构建更快吗?

    好帖子在这里 https stackoverflow com questions 4557934 would a ssd vs fast hdd drive make my eclipse run compile faster据说使用 SS
  • 如何使用公共函数从 Bytes 返回 KB、MB 和 GB

    我正在编写一个返回文件大小 以 B KB MB GB 为单位 的 函数 VB Net 代码总是首先获取以字节为单位的大小 因此当文件的大小 以字节为单位 小于 100 时 它返回 B 如果它 gt 1000 则将其除以 1000 然后返回
  • EJB 3.1 |通过 JNDI 调用远程会话 bean 时出错

    我试图从 Java SE 简单类 调用一个简单的无状态会话 bean 这是我的豆子 import javax ejb Stateless author MMRUser Stateless public class CapitalBean i
  • Android 11 5G 获取小区参数

    我正在新的 Android studio 预览版上尝试网络类型 5G 上的 Android 11 我的目标是获取单元信息详细信息 但是 方法 getAllCellInfo 在模拟器上返回空 空列表 Android 11 之前的所有模拟器都会
  • Android 在可扩展列表视图中禁用自动滚动

    我在可扩展列表视图中使用 当我打开列表视图中的某个项目时 我的滚动会自动聚焦在打开的项目上 我可以阻止列表聚焦在新项目上并停留在同一个地方吗 我尝试从打开的视图中删除可聚焦的内容 但它不起作用 您需要重写 OnGroupClickListe
  • 无法从 EC2 实例元数据服务检索凭证

    我正在尝试使用 SDK 通过 AWS SES API 发送电子邮件 我的代码基于此处的官方文档 https docs aws amazon com ses latest DeveloperGuide examples send using
  • 最少使用的 unicode 分隔符

    我正在尝试在特定位置使用分隔符标记我的文本 稍后将使用该分隔符进行解析 我想使用最不常用的分隔符 我当前正在查看 2 或 U 0002 字符 使用起来足够安全吗 还有哪些其他建议 文本为 unicode 同时包含英语和非英语字符 A想要使用
  • 字体真棒图标在 Chrome 中显示为正方形?

    我正在尝试在按钮中使用字体很棒的图标 该图标在 Firefox 中工作正常 但当我在 Chrome 中使用它时 它显示为正方形 我环顾四周 唯一发现的是字体的路径可能不正确 但我后来尝试了 cdn 版本here http www boots
  • PacMan:主要使用哪些启发式方法?

    除了 A BFS DFS 等之外 Pacman 中还广泛使用其他哪些好的寻路算法 启发式算法 如果吃豆人可以找到不止一种水果 我认为我提到的那些不会起作用 我需要一些好的寻路算法 PacMan 可以使用它们以尽可能少的步数完成迷宫 我试图四
  • 接口上的属性有什么用?

    使用 Resharper 我提取了现有类的接口 这个类在一些成员上设置了一些属性 Resharper 也将这些属性放在接口成员上 我可以从界面中删除这些属性吗 实现接口时不会继承接口上的属性 对吧 它们不被实现类使用 但仍然可能很关键 例如
  • 反应路由器索引路由始终处于活动状态

    我正在尝试使用 React 来设计我的导航activeClassName属性 到目前为止 它按预期工作 但有一个问题 我的第一个导航链接指向根路线 因此 即使在另一个 URL 上 它也会将该 URL 例如 skills 和 root 注册为
  • JQUERY UI - 根据验证选择选项卡

    我将 Jquery UI 选项卡式表单与需要验证的每个选项卡上的输入放在一起 理想情况下 我想验证当前可见的选项卡 然后选择下一个不验证的选项卡 最好的方法是什么 我的代码如下 div ul li a href tab1 One a li
  • 发送带有源端口但不绑定的 UDP 数据包

    我想在 Python 中发送 UDP 数据包并指定源端口但不绑定 与 hping3 等效 hping3 s sourceport p remoteport udp file message bin d 1024 c 1 remoteaddr
  • Googletest Eclipse C++:如何同时具有测试和生产可执行文件?

    我有一个基本问题谷歌测试 https code google com p googletest 在 Eclipse 中 我正在使用测试运行者 https github com xgsa cdt tests runner wiki Tutor