GoogleTest框架初识

Posted TiercelChow

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GoogleTest框架初识相关的知识,希望对你有一定的参考价值。

文章目录

1. 项目下载及编译

从GitHub将项目克隆至本地

$ git clone https://github.com/google/googletest.git

进入项目文件夹并编译

$ cd googletest
$ mkdir build
$ cd build
$ cmake ../
$ make

执行完上述命令后在项目文件夹的 ./build/路径下有一个lib文件夹,在 ./googletest文件夹中有include文件夹,将这两个文件夹放入同一新建的文件夹中,

$ cp -R 文件夹 目标路径(相对路径或绝对路径均可)

2. 初识GoogleTest框架

以加法为例通过googletest对其进行测试

#include <iostream>
#include <gtest/gtest.h>

int add(int a, int b) 
    return a + b;


TEST(test, add1) 
    EXPECT_EQ(add(3, 4), 7);//== 
    EXPECT_NE(add(3, 4), 6);//!= 
    EXPECT_LT(add(3, 4), 8);//< 
    EXPECT_LE(add(3, 4), 7);//<=
    EXPECT_GT(add(3, 4), 6);//>
    EXPECT_GE(add(3, 4), 7);//>=


TEST(test, add2) 
    EXPECT_EQ(add(3, 4), 7);//== 
    EXPECT_NE(add(3, 4), 7);//!= 
    EXPECT_LT(add(3, 4), 8);//< 
    EXPECT_LE(add(3, 4), 7);//<=
    EXPECT_GT(add(3, 4), 6);//>
    EXPECT_GE(add(3, 4), 7);//>=

int main() 
    printf("add(3 + 4) = %d\\n", add(3, 4));
    testing::InitGoogleTest();
    return RUN_ALL_TESTS();

编译链接

$ g++ -std=c++11 -I./include -L./lib add.cpp -lgtest

运行

$ ./a.out

3. printf输出彩色文字

属性代码

\\033[ A1; A2; A3; ...An m

部分格式代码

通用格式控制功能前景色功能背景色功能
0重置所有属性30黑色40黑色
1高亮/加粗31红色41红色
2暗淡32绿色42绿色
4下划线33黄色43黄色
5闪烁34蓝色44蓝色
7反转35品红45品红
8隐藏36青色46青色

颜色格式控制示例

printf("\\033[0;1;33;41mHelloWorld!\\033[0m\\n");

颜色格式控制应前后均进行重置处理,即防止受到其他代码中设置的属性干扰,同时设置的属性干扰后续代码。

4. 预处理命令

4.1 预处理命令–宏定义

样例

//定义符号常量
#define PI 3.1415926
#define MAX_N 10000

//定义傻瓜表达式
#define MAX(a, b) (a) > (b) ? (a) : (b)
#define S(a, b) a * b

//定义代码段
#define P(a)  \\
	 printf("%d\\n", a); \\

宏:简单替换

决定代码功能的并非源代码,而是预处理后的待编译源码

待编译源码

待编译源码的查看(> output.cpp将预处理结果结果输出到output.cpp中)

$ g++ -E xxx.cpp > output.cpp

深刻理解简单替换

#define S(a, b) a * b

int n;
S(int, p) = &n; //等价于int * p = &n;
S(1 + 2, 3); //等价于1 + 2 * 3

内置部分宏

说明
__DATA__日期:Mmm dd yyyy
__TIME__时间:hh:mm:ss
__LINE__行号
__FILE__文件名
__func__函数名/非标准
__FUNC__函数名/非标准
__PRETTY_FUNCTION__更详细的函数信息/非标准

非标准的宏表示不一定适用所使用的环境

LOG日志信息实现

#define LOG(frm, args...)  \\
		printf("[%s : %d : %s]", __FILE__, __LINE__, __func__); \\
		printf(frm, ##args); \\
		printf("\\n"); \\


LOG("HelloWorld!");

##作用是将args与frm粘接在一起,允许后面参数为空

4.2 预处理命令–条件式编译

条件式编译:简单的代码剪裁

函数说明
#ifdef DEBUG是否定义了DEBUG宏
#ifndef DEBUG是否没定义DEBUG宏
#if MAX_N == 5宏MAX_N是否等于5
#elif MAX_N ==4否则宏MAX_N是否等于4
#else
#endif

对LOG调试信息是否输出进行控制

#ifdef DEBUG

#define LOG(frm, args...)  \\
		printf("[%s : %d : %s]", __FILE__, __LINE__, __func__); \\
		printf(frm, ##args); \\
		printf("\\n"); \\


#else

#define LOG(frm, args...)

#endif

LOG("HelloWorld!");

若需要打开LOG,在ifdef前加上#define DEBUG即可,或者编译时添加参数-DDEBUG进行打开

5. GoogleTest框架部分功能的实现

实现EXPECT封装

#define EXPECT(a, comp, b)  \\
		if (!(a) comp (b))  \\
      printf("error\\n"); \\
     \\

#define EXPECT_EQ(a, b) EXPECT(a, ==, b)
#define EXPECT_NE(a, b) EXPECT(a, !=, b)
#define EXPECT_LT(a, b) EXPECT(a, <, b)
#define EXPECT_LE(a, b) EXPECT(a, <=, b)
#define EXPECT_GT(a, b) EXPECT(a, >, b)
#define EXPECT_GE(a, b) EXPECT(a, >=, b)

实现COLOR系列封装

#define COLOR(msg, code) "\\033[0;1;" #code "m" msg "\\033[0m"

#define RED(msg) COLOR(msg, 31)
#define GREEN(msg) COLOR(msg, 32)
#define YELLOW(msg) COLOR(msg, 33)
#define BLUE(msg) COLOR(msg, 34)

其他颜色同理

使用__attribute__完成函数注册功能

主函数不一定是程序的入口。

#include <iostream>
using namespace std;

__attribute__((constructer))
void test() 
  printf("%s : hello world\\n", __func__);
  return;


int main() 
  printf("%s : helloworld\\n", __func__);
  return 0;

上述程序的执行test函数先于主函数执行。

完善功能:测试框架初养成

#define COLOR(msg, code) "\\033[0;1;" #code "m" msg "\\033[0m"
#define RED(msg)    COLOR(msg, 31)
#define GREEN(msg)  COLOR(msg, 32)
#define YELLOW(msg) COLOR(msg, 33)
#define BLUE(msg)   COLOR(msg, 34)

#define EXPECT(a, comp, b)  \\
    __typeof(a) __a = (a), __b = (b); \\
    if (!((__a) comp (__b)))  \\
        printf(YELLOW("  %s:%d: Failure\\n"), __FILE__, __LINE__); \\
        printf(YELLOW("    Expected: (%s) %s (%s), actual: %d vs %d\\n"),\\
        #a, #comp, #b, __a, __b); \\
     \\

#define EXPECT_EQ(a, b) EXPECT(a, ==, b)
#define EXPECT_NE(a, b) EXPECT(a, !=, b)
#define EXPECT_LT(a, b) EXPECT(a, <, b)
#define EXPECT_LE(a, b) EXPECT(a, <=, b)
#define EXPECT_GT(a, b) EXPECT(a, >, b)
#define EXPECT_GE(a, b) EXPECT(a, >=, b)

#define TEST(a, b) \\
void a##_##b(); \\
__attribute__((constructor)) \\
void reg_##a##_##b()  \\
    add_func(a##_##b, #a "." #b); \\
    return ; \\
 \\
void a##_##b()

struct 
    void (*func)();
    const char *func_name;
 func_arr[100];
int func_cnt = 0;

void add_func(void (*func)(), const char *str) 
    func_arr[func_cnt].func = func;
    func_arr[func_cnt].func_name = str;
    func_cnt += 1;
    return ;


int RUN_ALL_TESTS() 
    for (int i = 0; i < func_cnt; i++) 
        printf(GREEN("[  RUN    ]") " %s\\n", func_arr[i].func_name);
        func_arr[i].func();
    
    return 0;

以上是关于GoogleTest框架初识的主要内容,如果未能解决你的问题,请参考以下文章

Google开源C++单元测试框架Google Test

googletest中部分有序模拟调用的多个先决条件

一文掌握谷歌 C++ 单元测试框架 GoogleTest

单元测试框架GoogleTest

一文掌握谷歌 C++ 单元测试框架 GoogleTest

一文掌握谷歌 C++ 单元测试框架 GoogleTest