我遇到了类似的情况,就编译器而言,我的设置方式有效地实现了 Mike Kinghan 的回答的相同目标,但从用户的角度来看却以不同的方式进行。
我所做的是创建一个我称之为“测试”的自定义配置。您可以通过打开项目设置、选择“配置管理器...”并在配置选择框中选择“新建...”来创建新配置。
当出现提示时,我选择从默认的“调试”配置中复制设置,这样我就可以像在“调试”配置中一样使用调试器进行测试。
在新的测试配置下,我将编译器和链接器的选项设置为像往常一样使用 google test。
属性的重要变化是我定义了一个预处理器变量,我称之为“TESTING”。
我重写了我的“main.cpp”,看起来像这样:
...
// includes
// functions
// whatever
...
#ifdef TESTING
#include <gtest/gtest.h>
#endif
int main(int argc, char **argv) {
#ifdef TESTING
::testing::InitGoogleTest(&argc, argv);
int val = RUN_ALL_TESTS();
getchar(); // not necessary, but keeps the console open
return val;
#endif
// rest of main() as normal...
}
我想表明的是,我只在定义 main 的地方更改了几行,我不必在整个文件中进行大的更改。
现在这一切都设置好了,我只是为我的测试创建了一个新的源文件夹,并在其中创建“.cpp”文件。为了避免膨胀正常的可执行文件,我用检查 TESTING 变量来包装这些文件,所以我有这样的东西:
tests/Test.cpp:
#ifdef TESTING
#include <gtest/gtest.h>
#include "my_class_header.h"
TEST(TestMyClass, test_something) {
// perform some test on class
}
#endif
我认为这些文件仍然会在 Debug 和 Release 配置下被编译器“命中”,因此拥有大量这些文件可能会减慢构建速度,但 Debug 和 Release 对象不会因测试代码而变得臃肿。
两个要点是:
- 使用此方法,测试代码仍然与应用程序代码分开组织,但它仍然驻留在同一个 Visual Studio 项目中,这可能有益,也可能无益。就我个人而言,我喜欢不必管理/担心第二个项目。
- 就像 Mike Kinghan 所说,自己管理和链接
.obj 文件可能会成为一件苦差事,但通过使用这种方法,默认的 Visual Studio 设置会为您管理。
一个缺点是所有对象文件的有效冗余副本将在“测试”输出目录中创建。有了更多的配置,肯定有办法“共享”调试对象文件,但我没有理由走那么远。
这是一种非常简单的方法,它可能比将应用程序重构为单独的库和主库要容易得多。我不喜欢使用预处理器,但在这种情况下,它相当简单,没有太多的代码膨胀,并且完全完成了它需要做的事情。您总是可以通过其他方式触发测试,而无需使用预处理器。