GoogleTest - 术语

GoogleTest 中有几个术语可能会让用户感到困惑,尤其是测试、测试用例和测试套件。这些术语的含义可能与其他测试框架不同。在本教程中,我们将了解它们,以避免在后续章节中出现任何混淆。

测试和测试用例

测试是指一段代码,用于验证另一段代码(通常是函数或类)是否按预期工作。GoogleTest 中的术语"测试"与国际软件测试资格委员会 (ISTQB) 材料和各种软件质量教科书中的术语"测试用例"相同。

要在 GoogleTest 中创建一个简单的测试,请使用 TEST() 宏。它定义并命名一个测试函数。此宏接受测试套件的名称和测试的名称作为参数值。请注意,它不返回任何值。

语法

TEST() 宏的语法如下所示 −

TEST(TestSuiteName, TestName) {
... 测试主体 ...
}

测试套件 名称和 测试 名称都必须是有效的 C++ 标识符,并且它们不应包含任何下划线 (_)。

示例

以下代码显示了 GoogleTest 中测试的基本示例 −

#include <gtest/gtest.h>

// 要测试的函数
int divideNum(int nums1, int nums2) {
    if (nums2 == 0) {
        throw std::invalid_argument("Denominator cannot be zero");
    }
    return nums1 / nums2;
}

// test 
TEST(CheckDivison, ForPositiveInput) {
    EXPECT_EQ(12, divideNum(24, 2));
}

// main() 函数运行测试
int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

上述代码的输出如下 −

Test project D:/gTest/test2/build
    Start 1: CheckDivison.ForPositiveInput
1/1 Test #1: CheckDivison.ForPositiveInput .......   Passed    0.02 sec

100% tests passed, 0 tests failed out of 1

Total Test time (real) =   0.2 sec

TestSuite 和测试用例

从最初的日子起,GoogleTest 就使用术语 "TestCase" 来指代一组相关测试。但是,ISTQB 材料和各种软件质量教科书都使用术语 "测试套件" 来指代相同的测试。

因此,GoogleTest 的最新版本开始用 "测试套件" 替换术语 "TestCase"。现在,首选 API 是 TestSuite。

Test Suite GoogleTest

要创建测试套件,请使用单个测试套件名称编写多个测试。但是,每个测试都应该有一个唯一的名称,如下所示 −

// test 1
TEST(TestSuiteName, FirstTestName) {
  ... test body ...
}
// test 2
TEST(TestSuiteName, SecondTestName) {
  ... test body ...
}

示例

在下面的代码中,我们创建了一个测试套件来测试 GoogleTest 中的除法函数−

#include <gtest/gtest.h>

// function to be tested 
int divideNum(int nums1, int nums2) {
    if (nums2 == 0) {
        throw std::invalid_argument("Denominator cannot be zero");
    }
    return nums1 / nums2;
}

// test 1 
TEST(CheckDivison, ForPositiveInput) {
    EXPECT_EQ(12, divideNum(24, 2));
}

// test 2
TEST(CheckDivison, ForNegativeInput) {
    EXPECT_EQ(-2, divide(4, -2));
    EXPECT_EQ(-2, divide(-4, 2));
    EXPECT_EQ(2, divide(-4, -2));
}

// test 3
TEST(CheckDivison, ForZeroDenominator) {
    EXPECT_THROW(divide(4, 0), std::invalid_argument);
}

// main() 函数运行测试
int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

运行此代码时,将显示以下输出 −

Test project D:/gTest/test2/build
    Start 1: CheckDivison.ForPositiveInput
1/3 Test #1: CheckDivison.ForPositiveInput .....   Passed    0.03 sec
    Start 2: CheckDivison.ForNegativeInput
2/3 Test #2: CheckDivison.ForNegativeInput .....   Passed    0.01 sec
    Start 3: CheckDivison.ForZeroDenominator
3/3 Test #3: CheckDivison.ForZeroDenominator ...   Passed    0.02 sec

100% tests passed, 0 tests failed out of 3

Total Test time (real) =   0.10 sec