从GitHub将项目克隆至本地
$ git clone https://github.com/google/googletest.git
进入项目文件夹并编译
$ cd googletest
$ mkdir build
$ cd build
$ cmake ../
$ make
执行完上述命令后在项目文件夹的 ./build/路径下有一个lib文件夹,在 ./googletest文件夹中有include文件夹,将这两个文件夹放入同一新建的文件夹中,
$ cp -R 文件夹 目标路径(相对路径或绝对路径均可)
以加法为例通过googletest对其进行测试
#include
#include
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
属性代码
\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");
颜色格式控制应前后均进行重置处理,即防止受到其他代码中设置的属性干扰,同时设置的属性干扰后续代码。
样例
//定义符号常量
#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粘接在一起,允许后面参数为空
条件式编译:简单的代码剪裁
函数 | 说明 |
---|---|
#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进行打开
实现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
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;
}