什么是谷歌测试?
- 它是一个测试框架,即用于编写和运行单元测试的软件工具。
- 它是一个用于编写 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 格式:
–gtest_output=”xml:report.xml”
- 如果想多次运行:
–gtest_repeat=2
- 失败时调用的调试器:
–gtest_break_on_failure
- 并非所有测试都需要一直运行:
–gtest_filter=