gtest 快速上手:简单的单元测试_gtest中断单元测试
gtest 简介
gtest(Google Test)是由 Google 开发的开源 C++ 单元测试框架,旨在帮助开发者编写和运行单元测试以提高代码质量和可维护性。gtest 提供了丰富的断言功能,支持布尔型、整型、浮点型、字符串以及自定义类的判断。
ASSERT_* 和 EXPECT_* 宏
ASSERT_* 和 EXPECT_* 宏可以实现断言检查。它们的区别是:在失败发生时,ASSERT_* 宏会终止当前的 TEST ,而 EXPECT_* 宏会继续执行当前的 TEST 中后续的代码。
ASSERT_* 和 EXPECT_* 宏中的 * 可以替换为:
- TRUE :断言表达式的结果为真。
- FALSE :断言表达式的结果为假。
- EQ :断言两个参数是相等的。
- NE :断言两个参数是不相等的。
- GT :断言两个参数中,第一个参数大于第二个参数。
- LT :断言两个参数中,第一个参数小于第二个参数。
- GE :断言两个参数中,第一个参数大于或等于第二个参数。
- LE :断言两个参数中,第一个参数小于或等于第二个参数。
如:EXPECT_TRUE(a > b) 断言 a > b 为真,效果等价于 EXPECT_GT(a, b) 。
TEST 宏
你可以用 TEST 宏创建一个 TEST。TEST 宏的格式如下:
TEST(test_suite_name, test_name){ // test body}
注意:test_suite_name 和 test_name 不需要加双引号。test body 中可以包含上述的 ASSERT_* 和 EXPECT_* 宏。任何一个 ASSERT_* 或者 EXPECT_* 宏断言失败,或者 TEST 内部崩溃了,这个 TEST 就失败了。
InitGoogleTest 函数和 RUN_ALL_TESTS 宏:初始化和运行测试
你可以使用 InitGoogleTest 函数和 RUN_ALL_TESTS 宏来初始化和运行测试。
testing::InitGoogleTest(&argc, argv);RUN_ALL_TESTS();
如果所有的 TEST 都通过,RUN_ALL_TESTS 返回 0 ,否则返回 1 。一般来说,我们把 RUN_ALL_TESTS 的返回值作为 main 函数的返回值。
一个完整的例子
main.cc 文件:
#include #include int Add(int a, int b){ return a + b;}int Sub(int a, int b){ return a - b;}int Mul(int a, int b){ return a * b;}// 使用 TEST 宏定义测试用例TEST(MathTest, AddTest){ EXPECT_TRUE(Add(1, 2) == 3); ASSERT_FALSE(Add(1, 2) > 3);}TEST(MathTest, SubTest){ EXPECT_EQ(Sub(10, 3), 6); // 失败 std::cout << \"这一行代码会被执行\" << std::endl;}TEST(MathTest, MulTest){ ASSERT_EQ(Mul(2, 3), 5); // 失败 std::cout << \"这一行代码不会被执行\" << std::endl;}int main(int argc, char* argv[]){ testing::InitGoogleTest(&argc, argv); // 初始化 gtest return RUN_ALL_TESTS(); // 运行所有测试用例}
makefile 文件:
main: main.ccg++ $^ -o $@ -lgtest.PHONY: cleanclean:rm -f main
命令行演示:
lighthouse@VM-12-17-ubuntu:~/code/gtest$ make clean && makerm -f maing++ main.cc -o main -lgtestlighthouse@VM-12-17-ubuntu:~/code/gtest$ ./main [==========] Running 3 tests from 1 test suite.[----------] Global test environment set-up.[----------] 3 tests from MathTest[ RUN ] MathTest.AddTest[ OK ] MathTest.AddTest (0 ms)[ RUN ] MathTest.SubTestmain.cc:28: FailureExpected equality of these values: Sub(10, 3) Which is: 7 6这一行代码会被执行[ FAILED ] MathTest.SubTest (0 ms)[ RUN ] MathTest.MulTestmain.cc:34: FailureExpected equality of these values: Mul(2, 3) Which is: 6 5[ FAILED ] MathTest.MulTest (0 ms)[----------] 3 tests from MathTest (0 ms total)[----------] Global test environment tear-down[==========] 3 tests from 1 test suite ran. (0 ms total)[ PASSED ] 1 test.[ FAILED ] 2 tests, listed below:[ FAILED ] MathTest.SubTest[ FAILED ] MathTest.MulTest 2 FAILED TESTS