GoogleTest - 死亡测试

GoogleTest 中的死亡测试用于验证程序在某些条件下是否以预期的方式终止,以确保一致性。这种类型的断言检查在例程输入错误的情况下是否显示正确的错误消息,或者进程是否以正确的退出代码退出。

如何编写死亡测试?

您可以使用以下断言在 GoogleTest 中编写死亡测试 −

  • EXPECT_DEATH() 或 ASSERT_DEATH() − 它接受两个参数:一个语句和一个匹配器。此断言测试语句是否导致进程以非零退出状态终止并生成与匹配器匹配的 stderr 输出。
  • EXPECT_DEATH_IF_SUPPORTED() 或 ASSERT_DEATH_IF_SUPPORTED() − 它首先检查是否支持死亡测试。如果支持,则行为与 EXPECT_DEATH 相同。
  • EXPECT_DEBUG_DEATH() 或 ASSERT_DEBUG_DEATH() − 它的行为也与 EXPECT_DEATH 相同,但在调试模式下。当不处于调试模式时,仅执行语句。
  • EXPECT_EXIT() 或 ASSERT_EXIT() − 它需要三个参数:语句、谓词和匹配器。它验证该语句是否导致进程终止并且退出状态是否满足谓词,并生成与匹配器匹配的 stderr 输出。此处,参数谓词是一个接受整数退出状态并返回布尔值的函数。

示例

以下示例说明如何在 GoogleTest 中编写死亡测试。

#include <gtest/gtest.h>
#include <iostream>

int divideNum(int numerator, int denominator) {
  if (denominator == 0) {
    std::cerr << "Error Occured: Denominator should not be zero" << std::endl;
    exit(1); 
  }
  return numerator / denominator;
}

TEST(CheckDivison, ForZeroDenominator) {
  // death test
  ASSERT_DEATH(divideNum(25, 0), "Cannot be divided by zero");
}

TEST(CheckDivison, WithZeroDenominator) {
  // death test
  ASSERT_EXIT(divideNum(74, 0), ::testing::ExitedWithCode(1), "Cannot be divided by zero");
}

运行此代码时,控制台上将显示以下输出 −

Test project D:/gTest/test5/build
    Start 1: CheckDivison.ForZeroDenominator
1/2 Test #1: CheckDivison.ForZeroDenominator ....***Failed    0.06 sec
    Start 2: CheckDivison.WithZeroDenominator
2/2 Test #2: CheckDivison.WithZeroDenominator ...***Failed    0.03 sec

0% tests passed, 2 tests failed out of 2

Total Test time (real) =   0.19 sec

The following tests FAILED:
          1 - CheckDivison.ForZeroDenominator (Failed)
          2 - CheckDivison.WithZeroDenominator (Failed)