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

2023-11-27

我有一个基本问题谷歌测试在 Eclipse 中。

我正在使用测试运行者插入运行 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 库的单元测试工具,类似于在 牛仔裤的胯部,让你的头可以穿过。

对 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++:如何同时具有测试和生产可执行文件? 的相关文章

  • 如何从 C# 中的 dataTable.Select( ) 查询中删除单引号?

    所以我有一个经销商名称列表 我正在我的数据表中搜索它们 问题是 一些傻瓜必须被命名为 Young s 这会导致错误 drs dtDealers Select DealerName dealerName 所以我尝试替换字符串 尽管它对我不起作
  • 适合初学者的良好调试器教程[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有谁知道一个好的初学者教程 在 C 中使用调试器 我感觉自己好像错过了很多 我知道怎么做 单步执行代码并查看局部变量 虽然这常常给我带来问
  • 为什么pow函数比简单运算慢?

    从我的一个朋友那里 我听说 pow 函数比简单地将底数乘以它的指数的等价函数要慢 例如 据他介绍 include
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • 如何在C(Linux)中的while循环中准确地睡眠?

    在 C 代码 Linux 操作系统 中 我需要在 while 循环内准确地休眠 比如说 10000 微秒 1000 次 我尝试过usleep nanosleep select pselect和其他一些方法 但没有成功 一旦大约 50 次 它
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • 函数参数的默认参数是否被视为该参数的初始值设定项?

    假设我有这样的函数声明 static const int R 0 static const int I 0 void f const int r R void g int i I 根据 dcl fct default 1 如果在参数声明中指
  • 查看 NuGet 包依赖关系层次结构

    有没有一种方法 文本或图形 来查看 NuGet 包之间的依赖关系层次结构 如果您使用的是新的 csproj 您可以在此处获取所有依赖项 在项目构建后 项目目录 obj project assets json
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • 使用 LINQ to SQL 时避免连接超时的最佳实践

    我需要知道在 net 应用程序中使用 LINQ to SQL 时避免连接超时的最佳实践 特别是在返回时IQueryable
  • 为什么可以通过ref参数修改readonly字段?

    考虑 class Foo private readonly string value public Foo Bar ref value private void Bar ref string value value hello world
  • 在 NaN 情况下 to_string() 可以返回什么

    我使用 VS 2012 遇到了非常令人恼火的行为 有时我的浮点数是 NaN auto dbgHelp std to string myFloat dbgHelp最终包含5008角色 你不能发明这个东西 其中大部分为0 最终结果是 0 INF
  • 如何在 C 中安全地声明 16 位字符串文字?

    我知道已经有一个标准方法 前缀为L wchar t test literal L Test 问题是wchar t不保证是16位 但是对于我的项目 我需要16位wchar t 我还想避免通过的要求 fshort wchar 那么 C 不是 C
  • 为什么这个二维指针表示法有效,而另一个则无效[重复]

    这个问题在这里已经有答案了 这里我编写了一段代码来打印 3x3 矩阵的对角线值之和 这里我必须将矩阵传递给函数 矩阵被传递给指针数组 代码可以工作 但问题是我必须编写参数的方式如下 int mat 3 以下导致程序崩溃 int mat 3
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 使用 C 在 OS X 中获取其他进程的 argv

    我想获得其他进程的argv 例如ps 我使用的是在 Intel 或 PowerPC 上运行的 Mac OS X 10 4 11 首先 我阅读了 ps 和 man kvm 的代码 然后编写了一些 C 代码 include
  • 是否可以在不连接数据库的情况下检索 MetadataWorkspace?

    我正在编写一个需要遍历实体框架的测试库MetadataWorkspace对于给定的DbContext类型 但是 由于这是一个测试库 我宁愿不连接到数据库 它引入了测试环境中可能无法使用的依赖项 当我尝试获取参考时MetadataWorksp

随机推荐