GoogleTest - 测试装置
GoogleTest 中的测试装置用于编写两个或多个针对类似数据的测试。它允许开发人员将相同的数据配置重复用于多个不同的测试。装置类派生自 gtest.h 头文件中的 ::testing::Test 类。
如何创建测试装置?
按照以下步骤在 GoogleTest − 中创建测试装置
- 创建一个派生自 testing::Test 类的类。其主体应受到保护。
- 声明您想要在此类中使用的对象。
- 然后,定义放置在构造函数或 SetUp() 函数内的设置逻辑。它将为每个测试准备对象。
- 要释放使用 SetUp() 分配的任何资源,请编写析构函数或 TearDown() 函数。这是可选的。
- 最后,定义要共享的测试子例程。
语法
创建测试装置的语法如下 −
// 定义测试装置类 class FirstTestFixture : public ::testing::Test { protected: // SetUp() function void SetUp() override { // setup code comes here } // TearDown() function void TearDown() override { // teardown code comes here } // 为测试定义通用数据成员 data_type variable = value; };
TEST_F() 宏在测试装置中的作用
GoogleTest 中的 TEST_F() 宏用于定义使用测试装置类的测试。这里的 _F 代表 Fixture。它接受两个参数,即测试名称和测试装置类的名称。两个参数都必须是有效的 C++ 标识符,并且不能包含下划线 (_)。
语法
让我们看看 TEST_F 宏的语法 −
TEST_F(TestFixtureName, TestName) { ... code to be tested ... }
通常,TEST() 宏用于在 GoogleTest 中定义测试。但是,在使用测试装置时会使用 TEST_F() 宏,因为它允许您访问该特定测试装置中定义的对象和子例程。您可以观察到 TEST_F() 宏的语法,其中声明的是测试装置类的名称而不是测试套件名称。
对于使用 TEST_F() 定义的每个测试,GoogleTest 都会在运行时创建一个新的测试装置,使用 SetUp() 函数对其进行初始化,运行测试,通过调用 TearDown() 函数进行清理,然后删除测试装置。
对装置中一个测试所做的任何更改都不会影响其他测试,因为同一测试套件中的不同测试具有不同的测试装置对象。此外,GoogleTest 始终会在创建下一个测试装置之前删除一个测试装置。
示例
以下示例说明如何在 GoogleTest 中使用 TEST_F() 编写测试装置。
#include <gtest/gtest.h> // 测试装置类 class FixtureDemo : public ::testing::Test { protected: int* test_var; // SetUp() function void SetUp() override { // dynamically allocating an integer test_var = new int(42); } // TearDown Function void TearDown() override { // deallocate the integer delete test_var; test_var = nullptr; } }; // to verify equality TEST_F(FixtureDemo, ForEquals) { EXPECT_EQ(42, *test_var); } // to verify less than TEST_F(FixtureDemo, ForLessThan) { EXPECT_LT(42, *test_var); } // main function int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }
运行此代码时,控制台上将显示以下输出 −
Test project D:/gTest/test6/build Start 1: FixtureDemo.ForEquals 1/2 Test #1: FixtureDemo.ForEquals ............ Passed 0.03 sec Start 2: FixtureDemo.ForLessThan 2/2 Test #2: FixtureDemo.ForLessThan ..........***Failed 0.02 sec 50% tests passed, 1 tests failed out of 2 Total Test time (real) = 0.13 sec The following tests FAILED: 2 - FixtureDemo.ForLessThan (Failed)