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

文章目录

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

参考:https://blog.csdn.net/qq_35976351/article/details/79749696
https://blog.csdn.net/hyb612/article/details/76403759
https://github.com/yanbinghu/LeetCodeWithC

一、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.二元比较运算符

Google Test测试框架使用(Linux平台)_第1张图片
如果上述的一个测试失败,那么会打印出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平台)_第2张图片

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

1.准备gtest框架

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

解压后,目录下有以下内容:
Google Test测试框架使用(Linux平台)_第3张图片
进入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下的头文件都是我们后面测试需要的。

2.新建一个测试项目

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

(2)在该目录下创建以下四个目录
├── gtest //存放gtest框架内容
├── leetcode //存放项目源代码
├── testcase //存放测试用例代码
├── gmock//存放googletest的很多头文件
Google Test测试框架使用(Linux平台)_第4张图片
(3)gtest目录中放置:刚才生成的libgtest.a静态库文件,以及\googletest\include\gtest中的文件。另外,我们还需要一个main函数文件。放在getst的main下

#include "gtest/gtest.h"
#include 
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平台)_第5张图片
(4)leetcode目录下新建src目录和include目录,分别用于存放头文件和.c文件
在include下放了两个头文件,common.h 和leetcode_functions.h
内容分别如下:
common.h

#pragma once
#include
#include
#include
#include

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 

整体目录如下:
Google Test测试框架使用(Linux平台)_第6张图片
(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平台)_第7张图片
(6)gmock目录:将googletest中的\googlemock\include\gmock里面的文件拷贝到这里即可
Google Test测试框架使用(Linux平台)_第8张图片

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平台)_第9张图片
可以看到,共有一个用例,通过了一个用例。

三、代码链接

主要有:googletest原始测试框架、以及其他bloger所作的多个测试,以及我的简化版本。
https://download.csdn.net/download/u011436427/11541109

你可能感兴趣的:(测试)