问题起因
工作中在写UT的时候,发现在具体的测试用例中,并没有显式化调用Setup()方法进行测试对象实例化。一开始以为写错了,发现依然能够正常运行。所以有此疑问。
代码展示:
class TaskTest : public ::testing::Test {
protected:
std::unique_ptr<Task> sut;
void SetUp() override {
sut = std::make_unique<Task>();
}
};
// 测试用例
TEST_F(taskTest, ProcessEvent_StartTask) {
common::StartTask startTask();
sut->process_event(startTask);
}
在测试用例中,sut并没有通过构造函数,或者调用Setup()函数进行实例化。
问题分析
在这段代码中,sut 实际上是已经实例化的。sut 是一个 std::unique_ptr 类型的成员变量,它在 SetUp 方法中被实例化。
详细解释
- sut 的声明:
std::unique_ptr<Task> sut;
- sut 是一个指向 Task 对象的智能指针(std::unique_ptr)。
-
SetUp 方法:
- SetUp 方法是 Google Test 框架中的一个特殊方法,它会在每个测试用例运行之前被调用。
- 在 SetUp 方法中,sut 被实例化为一个 Task 对象,并传递了必要的构造函数参数。
-
测试用例 ProcessEvent_StartTask:
- TEST_F 是 Google Test 框架中的一个宏,用于定义基于测试夹具(fixture)的测试用例。
- 在 ProcessEvent_StartTask 测试用例中,sut 已经在 SetUp 方法中被实例化,因此可以直接调用 sut 的 process_event 方法。
所以在 Google Test 框架中,每个测试用例在运行之前都会调用 SetUp 方法。因此,在 ProcessEvent_StartTask
测试用例中,sut 已经在 SetUp 方法中被实例化为一个有效的 Task 对象,因此可以直接调用 sut 的 process_event 方法。
框架自动调用分析
-
继承
::testing::Test:
- 测试类 TaskTest 继承自 ::testing::Test。
- ::testing::Test 是 Google Test 框架提供的基类,包含了测试用例的基本功能。
-
重载 SetUp() 方法:
- 在 TaskTest 类中重载了 SetUp() 方法。
- SetUp() 方法是 ::testing::Test 类中的一个虚函数,Google Test 框架会在每个测试用例运行之前自动调用它。
-
Google Test 的实现机制:
- 当使用 TEST_F 宏定义测试用例时,Google Test 框架会创建一个测试用例对象。
- 在测试用例对象的生命周期中,Google Test 框架会
自动调用 SetUp()
方法来进行初始化操作。 - 具体实现可以参考 Google Test 框架的源码,但一般不需要用户关心这些细节。
结论
SetUp() 函数会被 Google Test 框架自动调用
。Google Test 框架通过继承机制和虚函数来实现这一点。