Google Test (gtest
) 提供了多种断言(Assertions)来帮助编写单元测试。这些断言用于验证测试条件是否满足,失败时提供相关的调试信息。
断言类型
Google Test 断言可以分为两大类:
- Fatal assertions(致命断言):这些断言在失败时会立即终止当前的测试用例。
- Non-fatal assertions(非致命断言):这些断言在失败时不会中止当前测试用例,而是继续运行,直到测试用例结束。
两类断言的命名规则:
- 致命断言:以
ASSERT_
开头。 - 非致命断言:以
EXPECT_
开头。
1. 基本断言
1.1 EXPECT_EQ(val1, val2)
/ ASSERT_EQ(val1, val2)
- 功能:检查两个值是否相等。
- 解释:
EXPECT_EQ
是非致命断言,ASSERT_EQ
是致命断言。如果val1 != val2
,断言失败。 - 示例:
EXPECT_EQ(10, sum(5, 5)); // sum(5, 5) 必须等于 10
1.2 EXPECT_NE(val1, val2)
/ ASSERT_NE(val1, val2)
- 功能:检查两个值是否不相等。
- 解释:如果
val1 == val2
,断言失败。 - 示例:
EXPECT_NE(10, difference(15, 5)); // difference(15, 5) 不应该等于 10
1.3 EXPECT_LT(val1, val2)
/ ASSERT_LT(val1, val2)
- 功能:检查
val1
是否小于val2
。 - 解释:如果
val1 >= val2
,断言失败。 - 示例:
EXPECT_LT(5, 10); // 5 应该小于 10
1.4 EXPECT_LE(val1, val2)
/ ASSERT_LE(val1, val2)
- 功能:检查
val1
是否小于或等于val2
。 - 解释:如果
val1 > val2
,断言失败。 - 示例:
EXPECT_LE(5, 5); // 5 应该小于或等于 5
1.5 EXPECT_GT(val1, val2)
/ ASSERT_GT(val1, val2)
- 功能:检查
val1
是否大于val2
。 - 解释:如果
val1 <= val2
,断言失败。 - 示例:
EXPECT_GT(10, 5); // 10 应该大于 5
1.6 EXPECT_GE(val1, val2)
/ ASSERT_GE(val1, val2)
- 功能:检查
val1
是否大于或等于val2
。 - 解释:如果
val1 < val2
,断言失败。 - 示例:
EXPECT_GE(10, 10); // 10 应该大于或等于 10
2. 布尔断言
2.1 EXPECT_TRUE(condition)
/ ASSERT_TRUE(condition)
- 功能:检查条件是否为真。
- 解释:如果
condition
为假,断言失败。 - 示例:
EXPECT_TRUE(isEven(4)); // 检查 isEven(4) 返回 true
2.2 EXPECT_FALSE(condition)
/ ASSERT_FALSE(condition)
- 功能:检查条件是否为假。
- 解释:如果
condition
为真,断言失败。 - 示例:
EXPECT_FALSE(isEven(5)); // 检查 isEven(5) 返回 false
3. 字符串断言
3.1 EXPECT_STREQ(str1, str2)
/ ASSERT_STREQ(str1, str2)
- 功能:检查两个 C 字符串是否相等。
- 解释:使用
strcmp
比较两个 C 风格的字符串。如果str1 != str2
,断言失败。 - 示例:
EXPECT_STREQ("hello", greet()); // greet() 应该返回 "hello"
3.2 EXPECT_STRNE(str1, str2)
/ ASSERT_STRNE(str1, str2)
- 功能:检查两个 C 字符串是否不相等。
- 解释:如果
str1 == str2
,断言失败。 - 示例:
EXPECT_STRNE("hello", greet()); // greet() 不应该返回 "hello"
3.3 EXPECT_STRCASEEQ(str1, str2)
/ ASSERT_STRCASEEQ(str1, str2)
- 功能:检查两个 C 字符串是否不区分大小写相等。
- 解释:如果两个字符串在忽略大小写的情况下不相等,断言失败。
- 示例:
EXPECT_STRCASEEQ("Hello", "hello"); // "Hello" 和 "hello" 不区分大小写应该相等
3.4 EXPECT_STRCASENE(str1, str2)
/ ASSERT_STRCASENE(str1, str2)
- 功能:检查两个 C 字符串是否不区分大小写不相等。
- 解释:如果两个字符串在忽略大小写的情况下相等,断言失败。
- 示例:
EXPECT_STRCASENE("Hello", "world"); // "Hello" 和 "world" 不相等,即使忽略大小写
4. 指针断言
4.1 EXPECT_NULL(ptr)
/ ASSERT_NULL(ptr)
- 功能:检查指针是否为空(
NULL
)。 - 解释:如果
ptr
不为NULL
,断言失败。 - 示例:
EXPECT_NULL(getPointer()); // getPointer() 应该返回 NULL
4.2 EXPECT_NOTNULL(ptr)
/ ASSERT_NOTNULL(ptr)
- 功能:检查指针是否不为空。
- 解释:如果
ptr
为NULL
,断言失败。 - 示例:
EXPECT_NOTNULL(getValidPointer()); // getValidPointer() 不应该返回 NULL
5. 异常断言
5.1 EXPECT_THROW(statement, exception_type)
/ ASSERT_THROW(statement, exception_type)
- 功能:检查某段代码是否抛出指定类型的异常。
- 解释:如果
statement
没有抛出exception_type
类型的异常,断言失败。 - 示例:
EXPECT_THROW(func(), std::runtime_error); // func() 应该抛出 std::runtime_error 异常
5.2 EXPECT_ANY_THROW(statement)
/ ASSERT_ANY_THROW(statement)
- 功能:检查某段代码是否抛出任何类型的异常。
- 解释:如果
statement
没有抛出任何异常,断言失败。 - 示例:
EXPECT_ANY_THROW(func()); // func() 应该抛出某个异常
5.3 EXPECT_NO_THROW(statement)
/ ASSERT_NO_THROW(statement)
- 功能:检查某段代码是否不抛出任何异常。
- 解释:如果
statement
抛出了异常,断言失败。 - 示例:
EXPECT_NO_THROW(func()); // func() 不应该抛出异常
6. 浮点数断言
由于浮点数在计算机中存储时的精度问题,使用精确相等比较可能导致错误,因此 Google Test 提供了对浮点数的近似比较。
6.1 EXPECT_FLOAT_EQ(val1, val2)
/ ASSERT_FLOAT_EQ(val1, val2)
- 功能:检查两个
float
类型的值是否近似相等。 - 解释:两者的差异需要在一定范围内才算相等。
- 示例:
EXPECT_FLOAT_EQ(1.0f, 1.0f + 1e-7); // 两个 float 值应该接近相等
6.2 EXPECT_DOUBLE_EQ(val1, val2)
/ ASSERT_DOUBLE_EQ(val1, val2)
- 功能:检查两个
double
类型的值是否近似相等。