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)