GoogleTest - 禁用测试

一个好的测试框架应该具有暂时禁用测试的功能。假设有一个测试由于错误而失败,并且阻止了其他测试。在这种情况下,只有一个解决方案是可行的,那就是禁用测试,以便其他测试继续运行。当某个功能仍在开发中且尚未准备好进行测试时,它也很有用。

在 GoogleTest 中,您可以使用 DISABLED_ 前缀或使用 GTEST_SKIP() 宏来禁用测试。GoogleTest 是一个用于测试 C++ 代码的测试框架。

使用 DISABLED_ 前缀

可以通过将测试的名称更改为 DISABLED_* 来将其标记为已禁用,其中 "*" 代表测试的名称。通过这样做,GoogleTest 会在您运行测试二进制文件时跳过指定的测试。但是,测试仍然会被编译。

语法

DISABLED_ 前缀的语法如下 −

DISABLED_TestName

示例

在此代码中,我们使用 DISABLED_ 前缀禁用 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 1 
TEST(CheckDivison, ForPositiveInput) {
    EXPECT_EQ(12, divideNum(24, 2));
}

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

// test 3
TEST(DISABLED_CheckDivison, ForZeroDenominator) {
    EXPECT_THROW(divideNum(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.02 sec
    Start 2: CheckDivison.ForNegativeInput
2/3 Test #2: CheckDivison.ForNegativeInput .....   Passed    0.02 sec
    Start 3: CheckDivison.ForZeroDenominator
3/3 Test #3: CheckDivison.ForZeroDenominator ...***Not Run (Disabled)   0.00 sec

100% tests passed, 0 tests failed out of 2

Total Test time (real) =   0.13 sec

The following tests did not run:
          3 - CheckDivison.ForZeroDenominator (Disabled)

使用 GTEST_SKIP() 宏

GTEST_SKIP() 宏是 GoogleTest 1.10.0 版发布时新增的一项新功能。它用于根据给定条件在运行时跳过测试。

语法

GTEST_SKIP() 宏的语法如下 −

GTEST_SKIP() << "Text to display";

示例

以下代码显示如何使用 GTEST_SKIP() 禁用 GoogleTest 中的测试 −

#include <gtest/gtest.h>

// 要测试的函数
int prod(int num1, int num2) {
    return num1 * num2;
}

// to disable test 
bool disableTest(int num1, int num2) {
    if(num1 == num2) {
        return true;
    } else {
        return false;
    }
}

// Test suite
TEST(ProductTest, ForEqualNumbers) {
    int num1 = 3;
    int num2 = 3;
    if (disableTest(num1, num2)) {
        GTEST_SKIP() << "Disabling test";
    }
    ASSERT_EQ(prod(num1, num2), 9); 
}

int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

上述代码的输出如下 −

Test project D:/gTest/test3/build
    Start 1: ProductTest.ForEqualNumbers
1/1 Test #1: ProductTest.ForEqualNumbers ......***Skipped   0.03 sec

100% tests passed, 0 tests failed out of 1

Total Test time (real) =   0.10 sec

The following tests did not run:
          1 - ProductTest.ForEqualNumbers (Skipped)