gtest是一个跨平台的(Liunx、Mac OS X、Windows、Cygwin、Windows CE and Symbian)C++单元测试框架,由google公司发布。gtest是为在不同平台上为编写C++测试而生成的。它提供了丰富的断言、致命和非致命判断、参数化、”死亡测试”等等。
一句话就是Gtest提供了一种自动化测试程序的框架。方便快速的验证程序的逻辑性和健壮性。
和所有的第三方库一样,安装之前需要先下载源代码。小伙伴们可以通过google官网进行下载google官网,当然在国内不是不能登入到google的。所以在此我们只能通过github进行下载googletest。如下:
首先创建一个工作目录gtest
mkdir ~/gtest
cd ~/gtest
git clone https://github.com/google/googletest.git
下载完成之后接下来就可以针对不同的平台进行编译和使用了。下面将针对Ubuntu和linux ARM进行测试。
Gtest提供了两种方式编译源码库:automake和cmake,在此我们将以cmake方式进行编译。
编译之前我们先创建一个编译目录gtest-build,这样避免在源码目录进行编译造成污染问题。
创建一个编译目录
mkdir ~/gtest/gtest-build
cd gtest-build
cmake ../googletest -DCMAKE_INSTALL_PREFIX=./_install
make && make install
执行以上命令后将会在_install目录下看到编译产出的文件了。
.
├── include
│ ├── gmock
│ └── gtest
└── lib
├── cmake
├── libgmock.a
├── libgmock_main.a
├── libgtest.a
├── libgtest_main.a
└── pkgconfig
狭义简单理解交叉编译就是人为的指定目标平台的工具链进行编译产出可执行文件或库文件。 使用默认的工具链通常情况即为宿主机编译。
既然是这样那我们将在前面编译的基础上指定工具链就可以了。
创建一个arm平台编译目录
mkdir ~/gtest/gtest-build-arm
cd gtest-build
cmake ../googletest -DCMAKE_INSTALL_PREFIX=./_install -DCMAKE_CXX_COMPILER=${TOOLCHAIN_PATH}/bin/aarch64-rockchip-linux-gnu-g++
make && make install
Gtest源码库直接提供了大量的测试用例,我们可以直接拿来参考和学习。
首先我们可以直接进行编译并运行测试进行感知Gtest的使用过程。那么应该如何编译呢,我们只需在上面编译的选项中添加一个宏即可:gtest_build_samples=ON,然后重新编译将会在googlemock/gtest看到多 了一些可执行文件:
googlemock/gtest/
├── CMakeFiles
├── cmake_install.cmake
├── CTestTestfile.cmake
├── generated
├── Makefile
├── sample10_unittest
├── sample1_unittest
├── sample2_unittest
├── sample3_unittest
├── sample4_unittest
├── sample5_unittest
├── sample6_unittest
├── sample7_unittest
├── sample8_unittest
└── sample9_unittest
2 directories, 13 files
// gtest_sum.cpp
#include
#include
int sum(int a, int b) {
return a+b;
}
TEST(sum, testSum) {
EXPECT_EQ(5, sum(2, 3)); // 求合2+3=5
EXPECT_NE(3, sum(3, 4)); // 求合3+4 != 3
}
// 如果在此处不写main函数,那么在链接库的时候还需要链接-lgtest_main, 否则只需链接-lgtest即可。
#if 0
int main(int argc, char **argv)
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
#endif
编译测试程序:
g++ -o gtest_sum gtest_sum.cpp -I${HOME}/gtest/gtest-build/_install/include \
-L${HOME}/gtest/gtest-build/_install/lib -lgtest_main -lgtest -lpthread -std=c++11
编译完成后将会产出一个gtest_sum的可执行文件。
执行:
./gtest_sum
Running main() from /home/sven/work/3rd/googletest/googletest/src/gtest_main.cc
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from sum
[ RUN ] sum.testSum
[ OK ] sum.testSum (0 ms)
[----------] 1 test from sum (0 ms total)
[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (0 ms total)
[ PASSED ] 1 test.
经过以上流程我们已经对gtest的使用有了一些感知。并且通过编译源码库会得到相关的库文件:
gtest是googletest基础测试 框架,在进行单元测试必须创建实例对象及具体行为。 这样在实际情况下可能不需要这样做,
某些情况下只需要模拟构建一个虚假的实例即可验证程序的逻辑性。这样将引入了gmock测试框架,它依赖于gtest。
一个mock对象实现与一个真实对象相同的接口,并且可以在运行时进行指定预期的值具有很大的灵活性。
gtest_main和gmock_main可以让测试者无需在为每次测试用例写入main函数。
下一章节我们将介绍Gtest中常用的宏的基本用法,如EXPECT_*和ASSERT_*等;