Google Test测试框架使用(Linux平台)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Google Test测试框架使用(Linux平台)相关的知识,希望对你有一定的参考价值。
文章目录
- 一、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.基本断言判断
4.二元比较运算符
如果上述的一个测试失败,那么会打印出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测试框架
1.准备gtest框架
在github网站下载gtest框架https://github.com/google/googletest
解压后,目录下有以下内容:
进入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的很多头文件
(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的目录结构和内容如下所示:
(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;
整体目录如下:
(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);
整体目录如下:
(6)gmock目录:将googletest中的\\googlemock\\include\\gmock里面的文件拷贝到这里即可
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
结果如下:
可以看到,共有一个用例,通过了一个用例。
三、代码链接
主要有:googletest原始测试框架、以及其他bloger所作的多个测试,以及我的简化版本。
以上是关于Google Test测试框架使用(Linux平台)的主要内容,如果未能解决你的问题,请参考以下文章