目录
进阶:测试我们函数的API--ASSERT_*和EXPECT_*
作者:bandaoyu 原文:https://blog.csdn.net/bandaoyu/article/details/124374057?spm=1001.2014.3001.5501
Gtest简介
GoogleTest 是 Google 的 C++ 测试和模拟框架,是库,提供了一些API接口,用于测试你的程序。
我们编写测试文件,里面调用GoogleTest的API 测试我们的函数。然后编译的时候把GoogleTest的库链接进来即可。
Gtest是google开发的一个开源的C++测试框架,可在Linux, Windows,Mac多个平台上对C++源码进行测试,不仅支持单元测试,也支持其他类型测试。
一 基本概念
使用gtest时,就是编写断言(assertions),断言语句会检测条件是否为真。一个断言可存在三种结果:success(成功),nonfatal failure(非致命失败),或 fatal failure(致命失败)。当出现致命失败时,终止当前函数;否则程序继续执行。
Tests使用断言语句来检测代码的结果。如果一个test出现崩溃或有一个失败的断言,则该test是fails,否则是succeeds。
一个test suite包括一个或多个tests。可以将多个tests分组到test suite中,以此反映所测试代码的结构。当一个test suite中的多个tests需要共享一些通用对象和子程序时,可将其放入一个test fixture class。
一个test program可包含多个test suites.
局限性
gtest 是线程安全的,但是这个线程安全仅仅在支持 pthread 的系统的可以。在其他系统中使用两个线程运行测试是不安全的,比如 windows。
入门例子
编译环境中安装Gtest,既编译Gtest的源码编出Gtest的库gtest,放到链接目录下(供后面测试代码链接它和调用它的API)
$ git clone https:
//github
.com
/google/googletest
.git
$
cd
googletest
$
mkdir
build
$
cd
build
$ cmake ..
$
make
$
sudo
make
install
我们的工程文件(程序/函数)
mySrc.h
int
Foo(
int
a,
int
b);
mySrc.cpp
int
Foo(
int
a,
int
b)
{
if
(0 == a||0 == b)
throw
"don't do that"
;
int
c = a%b;
if
(0 == c)
{
return
b;
}
return
Foo(b,c);
}
编写单元测试工程(文件)
test.cpp
里面调用Gtest的API测试我们的函数/程序:
#include "
mySrc.h"
#include <gtest/gtest.h>
#TEST 就是Gtest的API,用于测试我们的程序的函数FooTest等
TEST(FooTest,HandleNoneZeroInput)
{
EXPECT_EQ(2,Foo(4,10));
EXPECT_EQ(6,Foo(30,18));
}
int
main(
int
argc,
char
*argv[])
{
testing::InitGoogleTest(&argc,argv);
return
RUN_ALL_TESTS();
}
编译单元测试工程
$ g++ -std=c++11
test.cpp
mySrc.cpp mySrc.h-lgtest -lpthread ./a.out
执行单元测试
./a.out
摘自:Gtest学习系列一:Gtest安装与基本测试 :https://www.cnblogs.com/yanqingyang/p/12732087.html
还可以打印信息
ASSERT_EQ(x.size(), y.size()) << "Vectors x and y are of unequal length";
for (int i = 0; i < x.size(); ++i) {
EXPECT_EQ(x[i], y[i]) << "Vectors x and y differ at index " << i;
}
进阶:测试我们函数的API--ASSERT_*和EXPECT_*
TEST, TEST_F TEST_P的区别
TEST()
Example test
适合给static或全局函数或简单类编写单元测试时.
TEST_F()
. Example test
测试夹具(Test Fixtures):对多个测试使用相同的数据配置。多个测试来操作类似的数据,你可以使用测试夹具。它允许您为几个不同的测试重复使用相同的对象配置。
可以编写默认构造函数或SetUp()函数来为几个测试准备(共同)对象。
如果需要,写一个析构函数或TearDown()函数来释放你在SetUp()中分配的任何资源。
更多详情见:Google C++单元测试框架GoogleTest---TestFixture使用 - 超超boy - 博客园
TEST_P()
TEST_P()
当您想使用参数编写测试时,TEST_P()非常有用。您可以使用test_P()编写一个测试,而不是使用不同的参数值编写多个测试,test_P()使用GetParam()并可以使用INSTANTIATE_test_SUITE_P()进行实例化。示例测试. Example test