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)
广告
© . All rights reserved.