海贼班 c++ 试听课程知识点 day2 --第2讲

制作自己的测试开发环境

 1.EXPECT封装  宏

#ifndef   _HTEST_H
#define   _HTEST_H

#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)

#endif                    

 

 

2.实现COLOR系列封装   存储在haizei/htest.h

#ifndef   _HTEST_H
#define   _HTEST_H

#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)            

#endif

 #code   代表字符串化      相当于将传入的数值加上引号

源代码中调用 

#include <haizei/htest.h>
using namespace std;
int main()
{
    printf(RED("hello world\n"));
    printf(GREEN("hello world\n"));
    printf(YELLOW("hello world\n"));
    printf(BLUE("hello world\n"));
    return 0;  
}

 

3.使用__attribute__完成函数的注册功能

所有被声明为constructor的函数  都会先于main主函数去执行,不用调用。

#include <iostream>
using namespace std;
__attribute__((constructor))  //注册test函数
void test(){
    printf("test:hello world\n");
    return;
}
int main()
{
    printf("main:hello world\n");
    return 0;
}

 

4.完善测试框架    简单功能

  

/*************************************************************************
    > File Name: mytest.h
    > Author: huguang
    > Mail: hug@haizeix.com
    > Created Time: 涓? 8/12 20:40:20 2020
 ************************************************************************/

#ifndef _MYTEST_H
#define _MYTEST_H

#define COLOR(msg, code) "\033[0;1;" #code "m" msg "\033[0m"     //基础宏定义   #code  用来字符串化 输入的数值   msg为传入的信息
#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("%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_test(a##_##b, #a "." #b); \
    return ; \
} \
void a##_##b()          //名称为a##_##b()函数的声明 注意这里的##为连接运算符

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

void add_test(void (*func)(), const char *name) {
    func_arr[func_cnt].func = func;
    func_arr[func_cnt].name = name;
    func_cnt++;
    return ;
}

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

#endif

 

 

 

 

5.结束

posted on 2020-10-27 10:26  学习记录园  阅读(291)  评论(0编辑  收藏  举报