📜  GTest框架

📅  最后修改于: 2021-05-24 16:33:34             🧑  作者: Mango

什么是Googletest?

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

为什么选择Googletest?

  • Googletest帮助我们编写更好的C++测试。
  • 独立且可重复: Googletest通过在不同的对象上运行每个测试来隔离测试。
  • 可移植且可重复使用:Googletest可在不同的Oses(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

简单测试

TEST()

  • 定义和命名测试函数的宏。
  • 使用各种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格式:
  • 如果要多次运行:
  • 调试器在失败时被调用:
  • 并非所有测试都需要一直运行: