CLion之C++框架篇-优化框架,单元测试(二)


详细代码:
cmake_minimum_required(VERSION 3.8)
project(work)
message("------------ Options -------------")
message("  CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
message("  CMAKE_BUILD_TYPE: Hello World!")
# 编译google test,会在当前目录生成libtest.a静态库
add_subdirectory(./googletest)
#头文件
include_directories(${PROJECT_SOURCE_DIR}/src/include ./googletest/include)
#源文件
aux_source_directory(${PROJECT_SOURCE_DIR}/src/main dir_srcs)
#库文件 : libtest.a 添加到链接路径中
link_directories(${PROJECT_SOURCE_DIR}/lib ${PROJECT_SOURCE_DIR}/googletest)
#需要添加googletest运行需要的pthread
set(LIBRARIES pthread)
#编译器相关设置
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_COMPILER      "clang++" )         # 显示指定使用的C++编译器
set(CMAKE_CXX_FLAGS   "-g")                     # 调试信息
set(CMAKE_CXX_FLAGS   "-Wall")                  # 开启所有警告
set(WORK ${dir_srcs})
add_custom_target(cmake-build-debug)
add_executable(${PROJECT_NAME} ${WORK})
target_link_libraries(${PROJECT_NAME} gtest)
思路:日常使用中,建议把这些代码放置到每个实现函数文件中,然后通过宏去控制!
1、公共文件common.h

代码如下:
//
// Created by Zhou,Baochuan on 18/5/25.
//
#ifndef WORK_COMMON_H
#define WORK_COMMON_H
#include <iostream>
#include <string> #define ENV_DEBUG
#ifdef ENV_DEBUG
#include <gtest/gtest.h>
#endif using namespace std; #endif //WORK_COMMON_H
2、实现文件,如字符串工具类:string_util.cpp

代码如下:
//
// Created by Zhou,Baochuan on 18/5/25.
//
#include <iostream>
#include "string_util.h" using namespace work;
using namespace std; string StringUtil::ltrim(string str)
{
string chars = "\t\n\v\f\r ";
str.erase(0, str.find_first_not_of(chars));
return str;
} string StringUtil::rtrim(string str)
{
string chars = "\t\n\v\f\r ";
str.erase(str.find_last_not_of(chars) + 1);
return str;
} string StringUtil::trim(string str)
{
return ltrim(rtrim(str));
} #ifdef ENV_DEBUG
TEST(string_util, trim)
{
string src1 = " 空格校验 ";
string src2 = StringUtil::trim(src1);
EXPECT_STREQ("空格校验", src2.c_str());
EXPECT_STREQ("空格校验 ", src2.c_str());
}
#endif
3、入口文件

代码如下:
#include "common.h"
#include "string_util.h" using namespace work;
#ifndef ENV_DEBUG
int main(int argc, char** argv) {
string src = " OK";
cout << StringUtil::trim(src) << endl;
return 0;
} #else
GTEST_API_ int main(int argc, char ** argv) {
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
#endif
4、上线的时候,把这个common.h文件中的定义删除掉,如图:

5、运行部分样例,如图:


CLion之C++框架篇-优化框架,单元测试(二)的更多相关文章
- CLion之C++框架篇-优化框架,引入boost(三)
		
背景 结合上一篇CLion之C++框架篇-优化框架,单元测试(二),继续进行框架优化!这一版优化引入一个我们日常经常使用的操作库Boost,估算使用频率在70%以上! Boost的优势在哪 ...
 - CLion之C++框架篇-优化开源框架,引入curl,实现get方式获取资源(四)
		
背景 结合上一篇CLion之C++框架篇-优化框架,引入boost(三),继续进行框架优化!在项目中,我们经常会通过get方式拉取第三方资源,这一版优化引入类库curl,用来拉取第三方资源库. ...
 - linux下使用gtest框架进行c/c++单元测试
		
linux下使用gtest框架进行c/c++单元测试 前言 关于此次开发工具的选择,因为我最近尝试在linux下使用vim进行c/c++编程,且之前已经对vim进行了相关的配置,所以这里应作业要求直接 ...
 - java基础之框架篇(1)
		
框架基础反射:反射是Java开发的一类动态相关机制.因为本身Java语言并不是一款动态语言,如果我们想要得到程序动态的效果,因此便引入了反射机制这一概念. 问题:Java中创建实例化对象有哪些方式? ...
 - 滴滴Booster移动APP质量优化框架 学习之旅 三
		
推荐阅读: 滴滴Booster移动App质量优化框架-学习之旅 一 Android 模块Api化演练 不一样视角的Glide剖析(一) 滴滴Booster移动App质量优化框架-学习之旅 二对重复资源 ...
 - 第一篇web框架
		
第一篇web框架 http协议 web应用和web框架 主 文 http协议 HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维 ...
 - [转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法
		
一.前言 关于Xposed框架相信大家应该不陌生了,他是Android中Hook技术的一个著名的框架,还有一个框架是CydiaSubstrate,但是这个框架是收费的,而且个人觉得不怎么好用,而Xpo ...
 - 滴滴 App 的质量优化框架 Booster,开源了!
		
一. 序 当 App 达到一定体量的时候,肯定是要考虑质量优化.有些小问题,看似只有 0.01% 触发率,但是如果发生在 DAU 过千万的产品中,就很严重了. 滴滴这个独角兽的 DAU 早已过千万,自 ...
 - Spring Boot 揭秘与实战(三) 日志框架篇 - 如何快速集成日志系统
		
文章目录 1. 默认的日志框架 logback2. 常用的日志框架 log4j 1.1. 日志级别 1.2. 日志文件 3. 源代码 Java 有很多日志系统,例如,Java Util Logging ...
 
随机推荐
- bootloaderd的再解析
			
boot的0脚和1脚可以选择启动方式,以前只知道可以选择的方式是nandflash启动,或者选择从norflash启动,当选择nandflash启动时,cpu看到的0地址是ram的0地址,根据是nan ...
 - 使用发射将JavaBean转为Map
			
import java.lang.reflect.Field; private static Map<String, Object> objectToMap(Object obj) thr ...
 - SQLServer导入导出命令报错
			
错误描述: SQL Server阻止了对组件‘xp_cmdshell’的过程‘sys.xp_cmdshell’的访问.因为此组件已作为此服务嚣安全配置的一部分而被关闭. 系统管理员可以通过使用sp_c ...
 - python  zlib ,zlib 压缩流
			
zlib 字符串:使用zlib.compress可以压缩字符串.使用zlib.decompress可以解压字符串. 数据流:压缩:compressobj,解压:decompressobj ...
 - kubernetes 常见问题整理
			
使用kubectl 命令是报错 报错: [root@k8s-master ~]# kubectl get pod The connection to the server localhost: was ...
 - Eclispe 错误:找不到或无法加载加载主类
			
解决办法: Project --> Clean Clean 操作会将该 project 以前的所有编译信息清空,然后默认将所有工程的所有 .java 文件都进行一次编译,这样的话就可以方便的进行 ...
 - C#中get和set属性的作用
			
c#在定义类时,通常要把类中声明的对象封装起来,使得外界不能访问这个属性.上述代码中如果去掉set部分,则外界只能读取name的值,如果去掉get部分,则只能给name赋值.这样就可以控制外界对私有属 ...
 - 渗透测试的理论部分4——开放式Web应用程序安全项目
			
开放式Web应用程序安全项目(Open Web Application Security Project OWASP) 定期退出Top 10 project(排名前十的安全隐患防守规则) 公开了编写安 ...
 - Linux下mysql定时自动备份并FTP到远程脚本
			
1.添加backupmysqleveryday.sh(vi /data/shell/backupmysqleveryday.sh) #!/bin/sh #this shell is user for ...
 - vue学习_01
			
一.什么是VUE 渐进式的前端框架,MVVM(Model,view,viewmodel)模式,饿了么用的就是vue框架 二.VUE基本语法 1.引入vue: <script src=" ...