【C++ UnitTest】基于Google Test 编写测试用例的简单实例

由于工作和能力原因,这里介绍的都是基于C++的UT,因为java或者python也有相应的UT。

在C++中编写测试用例通常使用单元测试框架,比较流行的框架包括 Google TestCatch2。以下是使用Google Test框架编写C++测试用例的基本步骤:

使用 Google Test 编写测试用例:

0.参考:你可以通过 https://google.github.io/googletest/ 官方的介绍获得你任何想要的信息。
1.安装 Google Test: 首先需要下载并安装 Google Test 框架,可以从其官方网站获取。

2.编写测试文件: 创建一个新的测试文件(假设以 test.cpptest.cc 为后缀),并包含 Google Test 的头文件。在测试文件中,使用 TEST 宏定义测试用例,并编写相应的测试代码。

#include <gtest/gtest.h>

// 定义一个测试用例
TEST(TestCaseName, TestName) {
    // 测试代码
    EXPECT_EQ(2 + 2, 4);//表示你期望表达式 2 + 2 的结果应该等于 4。如果 2 + 2 的结果确实等于 4,则测试通过,否则测试失败。
}

// 可以定义更多的测试用例

在 Google Test 中,TestCaseNameTestName 是测试用例的命名约定,用于组织和标识测试。这两个名称在宏 TEST(TestCaseName, TestName) 中被使用。宏中的变量名由用户自定义,用于区分不同的测试组件和测试内容。

TestCaseName: 这是一个字符串参数,用于指定测试用例所属的测试案例(Test Case)。测试案例是一组相关的测试用例的集合,通常用于对同一模块或类的不同功能进行测试。在 Google Test 中,测试案例会被组织成测试套件(Test Suite)。TestCaseName 是测试案例的名称,用于标识和描述这组相关的测试用例。

TestName: 这也是一个字符串参数,用于指定具体的测试用例的名称。每个测试用例都有一个唯一的 TestName,用于区分不同的测试用例。TestName 是描述性的,通常表明了测试的目标或者被测试的行为。

举例来说,假设我们有一个测试案例用于测试一个名为 Calculator 的类,其中包含了多个测试用例,比如测试加法、减法、乘法等功能。那么可以这样定义测试用例:

TEST(CalculatorTest, Addition) {
    // 测试加法功能
}

TEST(CalculatorTest, Subtraction) {
    // 测试减法功能
}

// 其他测试用例...

在上面的例子中,CalculatorTest 是测试案例的名称,用于标识这组测试用例属于 Calculator 类的测试。而 Addition 和 Subtraction 分别是具体的测试用例名称,用于描述不同的测试目标(加法和减法功能)。

这种命名约定有助于组织和管理测试用例,并且能够清晰地表达出每个测试用例的意图。

3.编写测试用例: 在 TEST 宏中编写测试代码,使用 Google Test 提供的断言来验证测试条件是否满足。常用的断言包括 EXPECT_EQEXPECT_TRUEEXPECT_FALSE 等。
刚才的EXPECT_EQ 断言会比较 expected 和 actual,如果它们相等,则测试通过;否则,测试失败,并且测试框架会输出相应的失败信息。
ASSERT_EQ 不同,如果断言失败,即预期值和实际值不相等,测试将立即停止执行,并标记为失败。在测试结束后,Google Test 将报告失败的断言,并且不会继续执行其他测试。
因此,EXPECT_EQ 用于在测试失败时继续执行其他测试,而 ASSERT_EQ 用于在测试失败时立即停止测试。通常情况下,建议使用 EXPECT_ 断言,除非你希望在失败时立即中止测试。

Google Test 提供了多种不同的断言,用于验证测试条件是否满足。以下是一些常用的断言:

1.`EXPECT_EQ` 和 `ASSERT_EQ`: 验证两个值是否相等,区别在于对测试结果的处理方式,如前面所述。
2.`EXPECT_NE` 和 `ASSERT_NE`: 验证两个值是否不相等,同样有两种处理方式。
3.`EXPECT_TRUE` 和 `ASSERT_TRUE`: 验证一个条件是否为真。
4.`EXPECT_FALSE` 和 `ASSERT_FALSE`: 验证一个条件是否为假。
5.`EXPECT_LT` 和 `ASSERT_LT`: 验证第一个值是否小于第二个值。
6.`EXPECT_LE` 和 `ASSERT_LE`: 验证第一个值是否小于等于第二个值。
7.`EXPECT_GT` 和 `ASSERT_GT`: 验证第一个值是否大于第二个值。
8.`EXPECT_GE` 和 `ASSERT_GE`: 验证第一个值是否大于等于第二个值。

例如,我们实现了一个简单的阶乘函数,想要测试他写的是否正确:

int Factorial(int n)  // Returns the factorial of n
{
	if (n==0)
	{
		return 1;
	}
	else if (n==1)
	{
		return 1;
	}
	else
	{
		return n * Factorial(n-1);
	}
}

此功能的测试套件可能如下所示:

// 当入参为0时.
TEST(FactorialTest, HandlesZeroInput) {
  EXPECT_EQ(Factorial(0), 1);
}

// 测试当入参为其他参数时.
TEST(FactorialTest, HandlesPositiveInput) {
  EXPECT_EQ(Factorial(1), 1);
  EXPECT_EQ(Factorial(2), 2);
  EXPECT_EQ(Factorial(3), 6);
  EXPECT_EQ(Factorial(8), 40320);
}

4.编译和运行测试用例: 使用编译器将测试文件编译成可执行文件。需要链接 Google Test 框架和被测试代码。
输出如下:
在这里插入图片描述
从结果中可以看出,测试用例数量为2个,分别是HandlesZeroInputHandlesPositiveInput,它们属于同一测试套件FactorialTest,且测试都通过。

命名测试套件和测试时,应遵循与命名函数和类相同的约定。

  • 24
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值