前言
在上一节中,我们介绍了gtest的安装过程,本节我们介绍gtest的简单使用
被测函数
我们先写一个简单的函数
int add(const int &a, const int &b) { return a + b; }
这个函数的功能很简单,就是求两个数的和
测试案例
接下来我们编写一个测试案例,用于测试上述add函数
TEST(AddFuncTest, Should_3_Given_1_and_2) { EXPECT_EQ(add(1, 2), 3); }
这段代码是gtest的一个testcase,其功能是测试add函数计算的值是否符合我们的预期,我们拆解这段代码来看
首先看测试签名(我自己的叫法,哈哈哈哈)
TEST(AddFuncTest, Should_3_Given_1_and_2)
TEST:这是gtest内置的一个宏,它有两个参数,分别为[TestSuitName,TestCaseName],事实上,这两个参数仅仅只是个字符串,用户可以任意写,他们的作用是为了标识一个测试,比如
AddTest:表示我们要测试的函数是add,一般这个参数用于表示我们要进行测试的对象
Should_3_Given_1_and_2:表示当我们给出的参数是1和2的时候,我们期望的值应该是3,一般这个参数用于表示我们要对测试对象的哪个功能进行测试
接下来是测试体
EXPECT_EQ(add(1, 2), 3);
- EXPECT_EQ:这也是gtest内置的一个宏,用于比较两个数是否相等,从代码字面上理解,这个宏就是判断add(1,2)计算后的结果是否等于3
事实上,gtest正式基于上述宏进行测试的,而类似EXPECT_EQ的宏其实是一个断言。
Google还包装了一系列EXPECT_* 和ASSERT_*的宏,而EXPECT系列和ASSERT系列的区别是:
1. EXPECT_* 失败时,案例继续往下执行。
2. ASSERT_* 失败时,直接在当前函数中返回,当前函数中ASSERT_*后面的语句将不会执行。
我们在下一篇文章中再详细讨论这些断言宏,本节的目的仅仅只是认识gtest,能让代码跑起来就ok
编译运行
接下来就是编译运行代码
我们先把目前写的代码全篇放出来
gTest.cc
#include <gtest/gtest.h>
int add(const int &a, const int &b) { return a + b; }
TEST(AddFuncTest, Should_3_Given_1_and_2) { EXPECT_EQ(add(1, 2), 3); }
int main(int argc, char **argv) {
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
对于主函数中对gtest的初始化以及运行,我们暂时记住就好,接下来编译代码
g++ ./gTest.cc -o gtest -std=c++14 -lgtest -lpthread
结果查看
编译成功之后会生成可执行文件gtest,直接运行即可,以下是运行结果
首先
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
这两行是提示信息,表示要开始运行gtest了,正在进行初始化工作
以下这段内容才是测试结果
[----------] 1 test from AddFuncTest
[ RUN ] AddFuncTest.Should_3_Given_1_and_2
[ OK ] AddFuncTest.Should_3_Given_1_and_2 (0 ms)
[----------] 1 test from AddFuncTest (0 ms total)
其中以下行的结果表示正在运行AddFuncTest测试套件中的Should_3_Given_1_and_2测试案例(有关测试套件和测试案例的概念我们在后续文章中进行说明)
[ RUN ] AddFuncTest.Should_3_Given_1_and_2
下述结果表示上述测试符合预期,并且测试执行时间为0ms
[ OK ] AddFuncTest.Should_3_Given_1_and_2 (0 ms)
接下来我们微微修改代码,让测试失败,查看结果与测试成功的结果有什么不同
int add(const int &a, const int &b) { return a + b; }
TEST(AddFuncTest, Should_3_Given_1_and_2) { EXPECT_EQ(add(1, 2), 4); }
我们将期望值修改为4,这显然是错误的,我们编译运行代码,直接看结果
从结果上看,我们的测试中出现了测试失败的案例,具体信息表现为
[ RUN ] AddFuncTest.Should_3_Given_1_and_2
./gTest.cc:10: Failure
Expected equality of these values:
add(1, 2)
Which is: 3
4
[ FAILED ] AddFuncTest.Should_3_Given_1_and_2 (0 ms)
从信息提示上看,在代码的第10行测试失败,测试期望的值应该是3,但是给出的值却是4,与预期不符
另一种运行方式
这里插一点题外,如果我们在代码中没有写main函数,其实也是可以编译运行的,只是需要我们手动在编译命令中链接gtest的main函数
也就是说,如果我们代码只有以下内容,没有写main函数
#include <gtest/gtest.h>
int add(const int &a, const int &b) { return a + b; }
TEST(AddFuncTest, Should_3_Given_1_and_2) { EXPECT_EQ(add(1, 2), 4); }
那么如果我们想编译成功,命令应该这样写
g++ ./gTest.cc -o gtest -std=c++14 -lgtest -lpthread -lgtest_main
我们用这种方式也可以成功编译代码