Google Test测试框架使用(Linux平台)

时间:2022-03-16 00:52:24


文章目录

  • ​​一、googleTest测试框架的基本介绍​​
  • ​​1.基本概念​​
  • ​​2.断言​​
  • ​​3.基本断言判断​​
  • ​​4.二元比较运算符​​
  • ​​5.字符串比较​​
  • ​​二、实际搭建google test测试框架​​
  • ​​1.准备gtest框架​​
  • ​​2.新建一个测试项目​​
  • ​​3.编译和链接​​
  • ​​4.运行测试​​
  • ​​三、代码链接​​

一、googleTest测试框架的基本介绍

1.基本概念

  • 使用GoogleTest要先从学习写断言开始,断言用于检测一个测试条件是否为真。断言的结果有三种情况:success, nonfatal failure, fatal failure。如果 fatal failure出现,它将会打断当前的函数;否则程序会正常运行。
  • 一个测试实例可以包含多个测试,我们需要把这些测试组织成合理的结构。当多个测试实例需要共享公共对象和或者子程序,我们可以把他们组织到一个测试类中。

2.断言

GoogleTest的断言是一种类似于函数调用的断言机制。我们可以在GoogleTest本身的断言消息后面定义自己的测试失败信息。下面说明几种不同断言方式:

  • ASSERT_*产生fatal failures,直接终止当前函数的运行
  • EXPECT_*: 产生nonfatal failures,不会终止当前函数运行
  • EXPECT_*: 最常用的一种方式,可以允许报告产生一个或者多个failer

为了提供自定义的失败信息,可以使用C++的stream流操作把字符输入到断言中,借助于<<操作符号。

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;
}

注意,任何可以写入流ostream的,都可被写入断言宏,比如C的字符串、string对象,甚至可以是广义上的字符(流):Windows的Unicode下的wchar_t*、 TCHAR*或者C++的std::string。所有流的输入都会转化成UTF-8的格式。

3.基本断言判断

Google Test测试框架使用(Linux平台)

4.二元比较运算符

Google Test测试框架使用(Linux平台)


如果上述的一个测试失败,那么会打印出val1和val2的值。

Value参数必须与断言比较运算符兼容,否则有编译错误。这些断言机制可以使用用户自定义的结构,但是必须进行运算符重载 。如果使用了自定义结构,我们最好使用ASSERT_*(),这样不仅会输出比较结果,而且会输出操作数。

ASSERT_EQ()会进行指针比较, 如果使用C风格字符串,那么比较的是地址!!(也可以是值,下面的eg就可以说明)
如果要比较值的话,使用ASSERT_STREQ(), 如果判断C字符串是否是NULL,使用ASSERT_STREQ(NULL, c_string)。 如果比较string,那么使用ASSERT_EQ。

5.字符串比较

在这里,比较的是C风格的字符串,如果想要比较string对象,请使用EXPECT_EQ、 EXPECT_NE等,而不是下面的。

Google Test测试框架使用(Linux平台)

二、实际搭建google test测试框架

1.准备gtest框架

在github网站下载gtest框架https://github.com/google/googletest

解压后,目录下有以下内容:

Google Test测试框架使用(Linux平台)


进入googltest目录,现在我们需要将其编译成.o文件

编译生成gtest.o文件:

g++ -std=c++11  -o gtest.o -I./include -I./ -c ./src/gtest-all.cc

注:我的g++需要指定c++11,不需要指定的就不需要
再生成.a静态库文件:

ar -rv libgtest.a gtest.o

生成的libgtest.a以及该目录include下的头文件都是我们后面测试需要的。

ubuntu使用包的方式安装google test

安装方式:
apt-get install libgtest-dev libgmock-dev googletest

出现的问题以及解决办法:
fatal error: gtest/gtest.h: No such file or directory
apt-get install libgtest-dev

fatal error: gmock/gmock.h: No such file or directory
apt-get install libgmock-dev

其他:
列出 Ubuntu 和 Debian 上已安装的软件包
apt list --installed

2.新建一个测试项目

(1)新建项目目录,比如我创建了一个LeetcodeWithC-master目录

(2)在该目录下创建以下四个目录

├── gtest //存放gtest框架内容

├── leetcode //存放项目源代码

├── testcase //存放测试用例代码

├── gmock//存放googletest的很多头文件

Google Test测试框架使用(Linux平台)


(3)gtest目录中放置:刚才生成的libgtest.a静态库文件,以及\googletest\include\gtest中的文件。另外,我们还需要一个main函数文件。放在getst的main下

#include "gtest/gtest.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
//testing::GTEST_FLAG(output) = "xml:"; //若要生成xml结果文件
testing::InitGoogleTest(&argc,argv); //初始化
if( RUN_ALL_TESTS()) //跑单元测试
return 0;
}

该gtest的目录结构和内容如下所示:

Google Test测试框架使用(Linux平台)


(4)leetcode目录下新建src目录和include目录,分别用于存放头文件和.c文件

在include下放了两个头文件,common.h 和leetcode_functions.h

内容分别如下:

common.h

#pragma once
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>

leetcode_functions.h

#pragma once
//leetcode_functions.h
#ifndef _LEETCODE_FUNCTIONS_H
#define _LEETCODE_FUNCTIONS_H
#include"common.h"
/*001,two sum*/
int* twoSum(int* nums, int numsSize, int target);
  • src目录下为项目的.c文件
/**************************************************************
题目:
Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would have exactly one solution, and you may not use the same element twice.

Example:
Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
释义:
给定整型数组,返回两个数的下标,使得这两个数相加得到特定的值。
假设每个给定的数组只能找到一组满足条件的结果,同时,不能使用同一个数两次。

分析:
题大意为,在一组数组中,找到两个数,使得这两个数的和等于特定值,并返回下标。可以从第一个数开始,循环与后面的每一个相加,与结果比较,比较成功则返回。
例如,输入[1,7,11,15],目标值26,那么循环计算1+7,1+11,1+15,7+11,7+15......,直到得到目标值。
***************************************************************/
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
#include "leetcode_functions.h"


int* twoSum(int* nums, int numsSize, int target) {
int loop = 0;
int inloop = 0;
int* result = NULL;
result =(int*) malloc(2*sizeof(int));
memset(result,0,2*sizeof(int));
printf("numsSize=%d\n",numsSize);
if(NULL == nums || numsSize==0)
{
return result;
}

for(loop = 0;loop < numsSize;loop++)
{
for(inloop = loop+1;inloop <numsSize;inloop++)
{
if(*(nums+loop)+*(nums+inloop) == target)
{
if(NULL != result)
{

*result = loop;
*(result+1) = inloop;
}
return result;
}
}
}
return result;
}

整体目录如下:

Google Test测试框架使用(Linux平台)


(5) testcase下新建include和src目录

src目录下有测试用例文件leetcode_test.cpp

#include "googletest.h"
#include "leetcode_functions.h"
#include "leetcode_utils.h"
TEST(two_sum_test,twoSum001)
{
int nums[4]={2,7,11,15};
int target = 9;
int numsSize = 4;
int* result = twoSum(nums,numsSize,target);

ASSERT_EQ(0,*result);
ASSERT_EQ(1,*(result+1));
target = 17;
result = twoSum(nums,numsSize,target);

ASSERT_EQ(0,*result);
ASSERT_EQ(3,*(result+1));
result= twoSum(NULL,numsSize,target);
ASSERT_EQ(0,*result);
}

include目录下的文件有
googletest.h头文件

#pragma once
#include"gmock/gmock.h"
#include"gtest/gtest.h"

leetcode_utils.h头文件

#pragma once
#include"leetcode_functions.h"
typedef enum leetcode_return
{
FALSE =0,
TRUE =1
}leetcode_return;

leetcode_return leet_judge_two_numbers_result(struct ListNode * result,int* retArr,int num);

整体目录如下:

Google Test测试框架使用(Linux平台)


(6)gmock目录:将googletest中的\googlemock\include\gmock里面的文件拷贝到这里即可

Google Test测试框架使用(Linux平台)

3.编译和链接

测试之前,需要编译并链接我们得项目代码和测试框架。
编译

g++ -o 001_two_sum.o -c ./leetcode/src/001_Two_Sum.c  -I ./leetcode/include/
g++ -o leetcode_test.o -c ./testcase/src/001_Two_Sum_test.cpp -I ./testcase/include/ -I ./leetcode/include/ -I ./
g++ -o TestAll.o -c ./gtest/main/TestAll.cpp -I ./

链接:

g++ -o main *.o -I./include -L./gtest -lgtest -lpthread

4.运行测试

运行生成的可执行文件main

./main

结果如下:

Google Test测试框架使用(Linux平台)


可以看到,共有一个用例,通过了一个用例。

三、代码链接

主要有:googletest原始测试框架、以及其他bloger所作的多个测试,以及我的简化版本。