📜  GTest 框架

📅  最后修改于: 2021-10-23 07:36:03             🧑  作者: Mango

什么是谷歌测试?

  • 它是一个测试框架,即用于编写和运行单元测试的软件工具。
  • 它是一个用于编写 C++ 测试的库。
  • 它基于 xUnit 架构,这是一组用于编程和自动执行测试用例的“框架”。

为什么是谷歌测试?

  • Googletest帮助我们编写更好的 C++ 测试。
  • 独立且可重复: Googletest 通过在不同的对象上运行每个测试来隔离测试。
  • 便携和可重用:Googletest 在不同的操作系统(Linux、Windows 或 Mac)上使用不同的编译器工作。
  • 当测试失败时,它应该提供尽可能多的关于问题的信息。

命名法

  • TestSuite:用于对相关测试进行分组。
  • TEST():它使用特定的输入值执行特定的程序路径并验证结果。

基本概念

  • 断言:
    • 检查条件是否为真的语句。
    • 输出:成功、非致命失败或致命失败(中止当前函数)。
  • 测试夹具类:
    • 测试套件中需要共享公共对象和子例程的多个测试的集合。

在下面的行中*代表多个字符,例如EQ / NE / LT / LE / GT / GE。

  • ASSERT_* 失败时产生致命失败,并立即中止当前函数。 (可能会跳过后面的清理代码,可能会导致空间泄漏)。
  • EXPECT_*:生成非致命故障,不会中止当前函数。
  • 例子:
    • ASSERT_EQ、ASSERT_NE 、ASSERT_LT、ASSERT_GT、ASSERT_GE。
    • EXPECT_WQ、EXPECT_NE、EXPECT_LT、EXPECT_GT、EXPECT_GE。
Fatal assertion Nonfatal assertion Verifies
ASSERT_TRUE (condition); EXPECT_TRUE (condition); condition is true
ASSERT_FALSE (condition); EXPECT_FALSE (condition); condition is false
ASSERT_STREQ(str1, str2); EXPECT_STREQ(str1, str2); the two string str1 and str2 have the same content
ASSERT_STRNE(str1, str2); EXPECT_STRNE(str1, str2); the two strings str1 and str2 have different content
ASSERT_STRCASEEQ(str1, str2); EXPECT_STRCASEEQ(str1, str2); the two string str1 and str2 have the same content, ignoring the case
ASSERT_STRCASENE(str1, str2); EXPECT_STRSTRCASENE(str1, str2); the two strings str1 and str2 have different content, ignoring the case

简单的测试

测试()

  • 用于定义和命名测试函数的宏。
  • 使用各种 Googletest 断言来检查值。
  • 如果测试中的任何断言失败(致命的或非致命的),或者如果测试崩溃,则整个测试失败。否则,它成功。
TEST(TestSuiteName, TestName) {
      ... test body ...
   }

测试夹具

  • 对多个测试使用相同的数据配置。
  • 从 ::testing::Test 派生一个类。以protected: 开始它的主体,因为我们希望从子类访问fixture 成员。
  • 如有必要,编写默认构造函数或 SetUp()。
  • 如有必要,编写一个默认的析构函数或 TearDown()。
  • 使用 TEST_F(),而不是 TEST()。
TEST_F(TestFixtureName, TestName) {
   ... test body ...
}

调用测试

  • RUN_ALL_TESTS();
    • 返回 0:所有测试都成功。
    • 返回 1:否则。

例子

阶乘函数:

int factorial(int n)
{
    // If n < 1;
    return -1;
    
    // Else factorial = n!;
    return factorial;
}
TEST(FactorialTest, FactorialOfZeroShouldBeOne)
{
    ASSERT_EQ(1, factorial(0));
}
TEST(FactorialTest, FactorialOfPositiveNos)
{
    ASSERT_EQ(1, factorial(1));
    ASSERT_EQ(24, factorial(4));
    ASSERT_EQ(120, factorial(5));
}
int main(int argc, char **argv)
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

命令行参数

  • 通过传递将输出转储为 XML 格式:
  • 如果想多次运行:
  • 失败时调用的调试器:
  • 并非所有测试都需要一直运行: