由于工作和能力原因,这里介绍的都是基于C++的UT,因为java或者python也有相应的UT。
在C++中编写测试用例通常使用单元测试框架,比较流行的框架包括 Google Test 和 Catch2。以下是使用Google Test框架编写C++测试用例的基本步骤:
使用 Google Test 编写测试用例:
0.参考:你可以通过 https://google.github.io/googletest/ 官方的介绍获得你任何想要的信息。
1.安装 Google Test: 首先需要下载并安装 Google Test 框架,可以从其官方网站获取。
2.编写测试文件: 创建一个新的测试文件(假设以 test.cpp 或 test.cc 为后缀),并包含 Google Test 的头文件。在测试文件中,使用 TEST
宏定义测试用例,并编写相应的测试代码。
#include <gtest/gtest.h>
// 定义一个测试用例
TEST(TestCaseName, TestName) {
// 测试代码
EXPECT_EQ(2 + 2, 4);//表示你期望表达式 2 + 2 的结果应该等于 4。如果 2 + 2 的结果确实等于 4,则测试通过,否则测试失败。
}
// 可以定义更多的测试用例
在 Google Test 中,TestCaseName
和 TestName
是测试用例的命名约定,用于组织和标识测试。这两个名称在宏 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_EQ
、EXPECT_TRUE
、EXPECT_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个,分别是HandlesZeroInput
和HandlesPositiveInput
,它们属于同一测试套件FactorialTest
,且测试都通过。
命名测试套件和测试时,应遵循与命名函数和类相同的约定。