【问题标题】:How to avoid mixing test and production code using GoogleTest?如何避免使用 GoogleTest 混合测试和生产代码?
【发布时间】:2016-02-27 03:29:39
【问题描述】:

我开始使用 GoogleTest。似乎它需要一个主文件来运行测试:

Separate test cases across multiple files in google test

但目前在我的演示应用程序中,我已经有一个主文件:

src/
-> MyType.h
-> main.cpp
-> Makefile

这最终将成为我的“生产”应用程序。我不想用 gtest 包含、宏等来弄乱它。

我是否应该在另一个文件夹中创建另一个 main.cpp 文件,例如:test/,它将包含所有特定的 gtest 配置,所以我最终会得到:

src/
-> MyType.h
-> main.cpp
-> Makefile // Makefile for producing production code/binaries
Test/
-> MyTypeTest.h // Unittest for MyType
-> main.cpp // The "Test runner"
-> Makefile // Makefile for producing test executable

编辑:

根据 cmake 找到这个:

http://www.kaizou.org/2014/11/gtest-cmake/

这似乎正是我想要的。

【问题讨论】:

  • 您可能希望在项目变大之前切换到不同的构建系统。对于较大的项目,Makefile 往往会变得非常复杂,除非您已经拥有丰富的 Makefile 管理经验。
  • 我倾向于为每个项目/库设置一个测试子目录,并为每个测试源文件生成一个谷歌测试二进制文件。这样,即使一个测试用例导致应用程序崩溃,所有其他测试和测试用例仍将运行。 (我使用CMake 作为构建工具并使用ctest 运行所有测试)
  • 我一直很喜欢将测试放在单独的目录中的想法。

标签: c++ makefile googletest


【解决方案1】:

对此最明智的方法是为您的生产代码创建一个库,然后创建两个可执行文件,一个用于生产,另一个用于测试:

|-lib/
| |-Makefile
| |-mytype.h
| `-mytype.cpp
|-app/
| |-Makefile
| `-main.cpp
`-test/
  |-Makefile
  `-mytypetest.cpp

请注意,gtest 发行版提供了 gtest 库和 gtest_main 库,其中包含用于测试可执行文件的标准 main 函数。因此,除非您需要自定义 main(极少数情况),否则您不需要为您的测试提供 main.cpp,并且可以简单地链接到 gtest_main,例如$(CC) mytypetest.cpp -o apptests -lapplib -lgtest_main -lgtest.

库方法涉及稍微复杂的Makefiles,但它在编译时间上得到了回报,因为没有它意味着您需要编译mytype.cpp 一次用于生产应用程序,一次用于测试可执行文件。

【讨论】:

  • 是的,这与我的想法类似,我发现了这个:kaizou.org/2014/11/gtest-cmake,它提供了有关您建议使用 cmake 的结构的更多详细信息。我会试试看。
  • 这是我当前主要 C++ 项目的源代码结构。如果您打算使用 cmake,您可以从它的 ExternalProject 模块中受益,将 gtest 库导入您的项目。查找此here 的示例。
  • 酷看看那个!顺便说一句,您使用什么编辑器?我想与 Git 集成并能够通过单击/快捷键来构建/运行,所以我尝试了 eclipse,但它并没有真正做到我想要的:stackoverflow.com/questions/35668159/… 也许我在这里有点过于雄心勃勃/需要选择更简单/更手动的方法?
  • 我不是 IDE 的忠实粉丝,所以我只在小型项目中使用 vim。我最近一直在将 QtCreator 用于一个中型 Qt 项目,它运行良好,它有一个 vim 编辑器模式,还有一个 Google Test 插件。它肯定比 Eclipse CDT 响应更快,更简洁。
  • 刚刚按照您的建议尝试了 QT Creator,它就像一个魅力,这真的很棒,我没有遇到任何我在这里描述的 Eclipse 的问题:stackoverflow.com/questions/35673956/… 更好的印象所以与 QT Creator 相去甚远
【解决方案2】:

可能有很多方法可以做到这一点,但一般来说,是的,你应该在你的项目中添加一个特定于测试的 main 函数。这使得编译有点复杂,因为您必须生成两个单独的二进制文件(一个用于您的应用程序,另一个用于您的测试),但这是一个相当典型的设置。

【讨论】:

  • 好吧,有道理,想在 src/ 和 test/ 文件夹上一层创建一个 makefile,然后像 test 和 prod 目标一样放在那里,“make test”将创建测试可执行文件并且“make prod”会创建 prod 可执行文件是违反所有约定还是合理的?
  • 这听起来很合理,当然。我使用过的大多数 Makefile 项目都为测试和生产可执行文件定义了单独的目标。即make bin 将创建生产二进制文件,make tests 将创建测试可执行文件,make runtests 将运行测试等。不过,对于任何比玩具项目更大的东西,我建议研究 CMake。这比手动编辑 Makefile 好多了 :)
【解决方案3】:

我只需添加一个带有 main 的 test.cpp 文件并在我的 makefile 中创建一个 test 目标,这样我就可以 make - 构建我的生产代码 - 或 make test - 构建测试.在实际项目中,我以非常相似的方式使用 cmake(我有时将所有常见的依赖项捆绑在 core.a 库中,然后链接 main 并针对它进行测试)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多