如何有效地在 googletest 中组织单元测试
How to organize unit tests in googletest efficiently
我目前正在考虑重构我项目中的单元测试。我使用 Googletest 作为测试框架。我的项目由几个一起构建和测试的共享库组成。
随着单元测试数量的增加,我发现 google 测试中单元测试的组织变得越来越难,因为我在测试所在的位置包含了大量头文件。这会导致在构建项目时出现巨大的对象大小,我已经不得不打开 大对象编译 ,以使构建成功。
考虑如下所示的项目结构
root
├── src
│ └── libs
| ├── libA
| ├── libB
| ├── ....
│ └── libN
└── tests
└── unit_tests
├── libA
| ├──tst_group1.h
| ├──tst_group2.h
| └──tst_group3.h
├── libB
| ├──tst_group1.h
| ├──tst_group2.h
| └──tst_group3.h
├── ....
├── libN
└── main.cpp
我的 main.cpp
看起来像这样:
#include "libA/tst_group1.h"
#include "libA/tst_group2.h"
#include "libA/tst_group3.h"
#include "libB/tst_group1.h"
#include "libB/tst_group2.h"
#include "libB/tst_group3.h"
[...]
#include <gmock/gmock-matchers.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
int main(int argc, char* argv[])
{
:testing::InitGoogleMock(&argc, argv);
::testing::InitGoogleTest();
return RUN_ALL_TESTS();
}
我真的很想在这里进行某种模块化,在这里我可以以某种方式拆分代码,最终为不同的模块提供单独的编译单元,这样我就没有这个丑陋的 大对象编译问题,但是我不知道使用google测试的正确方法是什么,其中所有这些测试宏都必须存在于头文件中。
谁能分享一些建议?
如果您查看 the samples provided in the sources,测试宏不应出现在 header 文件中。
根据 this answer :
The RUN_ALL_TESTS() macro run all instances of test class dynamically, which means it got the test cases during run time.
所以基本上,您的 main 应该只包含 gtest headers,您的测试应该在 .cpp 文件中,每个测试只包含您需要的库。
我目前正在考虑重构我项目中的单元测试。我使用 Googletest 作为测试框架。我的项目由几个一起构建和测试的共享库组成。
随着单元测试数量的增加,我发现 google 测试中单元测试的组织变得越来越难,因为我在测试所在的位置包含了大量头文件。这会导致在构建项目时出现巨大的对象大小,我已经不得不打开 大对象编译 ,以使构建成功。
考虑如下所示的项目结构
root
├── src
│ └── libs
| ├── libA
| ├── libB
| ├── ....
│ └── libN
└── tests
└── unit_tests
├── libA
| ├──tst_group1.h
| ├──tst_group2.h
| └──tst_group3.h
├── libB
| ├──tst_group1.h
| ├──tst_group2.h
| └──tst_group3.h
├── ....
├── libN
└── main.cpp
我的 main.cpp
看起来像这样:
#include "libA/tst_group1.h"
#include "libA/tst_group2.h"
#include "libA/tst_group3.h"
#include "libB/tst_group1.h"
#include "libB/tst_group2.h"
#include "libB/tst_group3.h"
[...]
#include <gmock/gmock-matchers.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
int main(int argc, char* argv[])
{
:testing::InitGoogleMock(&argc, argv);
::testing::InitGoogleTest();
return RUN_ALL_TESTS();
}
我真的很想在这里进行某种模块化,在这里我可以以某种方式拆分代码,最终为不同的模块提供单独的编译单元,这样我就没有这个丑陋的 大对象编译问题,但是我不知道使用google测试的正确方法是什么,其中所有这些测试宏都必须存在于头文件中。
谁能分享一些建议?
如果您查看 the samples provided in the sources,测试宏不应出现在 header 文件中。 根据 this answer :
The RUN_ALL_TESTS() macro run all instances of test class dynamically, which means it got the test cases during run time.
所以基本上,您的 main 应该只包含 gtest headers,您的测试应该在 .cpp 文件中,每个测试只包含您需要的库。