第一章 UT单元测试——GoogleTest通用构建说明
系列文章目录
第一章 UT单元测试——GoogleTest通用构建说明
第二章 UT单元测试——GTest框架实例
文章目录
- 系列文章目录
- 前言
- GoogleTest通用构建说明
- 设置
- 用CMake构建
- 独立CMake项目
- 整合到现有的CMake项目中
- Visual Studio动态vs静态运行时
- C ++标准版本
- 调整GoogleTest
- 多线程测试
- 避免宏名称冲突
前言
第一章就介绍GTest通用构建说明吧。
GoogleTest通用构建说明
设置
要构建GoogleTest及其使用它的测试,您需要告诉您的构建
系统在哪里可以找到其标头和源文件。确切的方法
取决于您使用的构建系统,通常很简单。
用CMake构建
GoogleTest随附CMake构建脚本
([CMakeLists.txt](https://github.com/google/googletest/blob/master/CMakeLists.txt))
可以在各种平台上使用(“ C”代表跨平台。)。
如果尚未安装CMake,则可以从以下位置免费下载
http://www.cmake.org/。
CMake通过生成本机Makefile或构建可在以下版本中使用的项目来工作
您选择的编译器环境。您可以将GoogleTest构建为
独立项目,也可以将其合并到现有的CMake构建中,以用于
另一个项目。
独立CMake项目
将GoogleTest构建为独立项目时,典型的工作流程开始
和
git clone https://github.com/google/googletest.git -b版本-1.10.0
cd googletest#克隆的存储库的主目录。
mkdir build#创建一个目录来保存构建输出。
光盘制作
cmake ..#为GoogleTest生成本机构建脚本。
上面的命令默认还包含GoogleMock。所以,如果你想
仅构建GoogleTest,您应该将最后一个命令替换为
cmake .. -DBUILD_GMOCK = OFF
如果您使用的是\ * nix系统,则现在应该在当前目录中看到一个Makefile。
目录。只需输入“ make”即可构建GoogleTest。然后您可以简单地安装
如果您是系统管理员,请使用GoogleTest。
制作
sudo make install#默认安装在/ usr / local /
如果您使用Windows并安装了Visual Studio,则应输入一个“ gtest.sln”文件和
将创建几个.vcproj
文件。然后,您可以使用Visual构建它们
工作室。
在安装了Xcode的Mac OS X上,将生成.xcodeproj
文件。
整合到现有的CMake项目中
如果要在已经使用CMake的项目中使用GoogleTest,最简单
方式是获取已安装的库和头文件。
*使用find_package
(或pkg_check_modules
)导入GoogleTest。为了
例如,如果find_package(GTest CONFIG REQUIRED)
成功,则可以使用
库分别为“ GTest :: gtest”,“ GTest :: gmock”。
一种更强大,更灵活的方法是将GoogleTest作为其中的一部分
直接进行项目。这是通过使GoogleTest源代码可用于
主版本,并使用CMake的add_subdirectory()
命令将其添加。这
具有显着的优势,即可以使用相同的编译器和链接器设置
在GoogleTest和项目的其余部分之间使用,因此与
避免使用不兼容的库(例如调试/发行版)等。这是
在Windows上特别有用。使GoogleTest的源代码可用于
可以通过几种不同的方式完成主要构建:
- 手动下载GoogleTest源代码并将其放置在已知的位置
地点。这是最不灵活的方法,可能会使其更加困难
与连续集成系统等配合使用 - 将GoogleTest源代码作为直接副本嵌入主项目的
源树。这通常是最简单的方法,但也是最困难的方法
不断更新。一些组织可能不允许这种方法。 - 将GoogleTest添加为git子模块或同等子模块。这可能并不总是
可能或适当的。例如,Git子模块具有自己的一组
优点和缺点。 - 作为构建的配置步骤的一部分,使用CMake下载GoogleTest。这
只是稍微复杂一点,但没有其他的限制
方法。
上面的最后一种方法是使用一小段CMake代码实现的
单独的文件(例如,CMakeLists.txt.in)复制到构建区域,然后
然后在CMake阶段作为子版本调用。该目录是
使用add_subdirectory()
进入主版本。例如:
新文件CMakeLists.txt.in
:
cmake
cmake_minimum_required(版本2.8.12)
专案(googletest-download NONE)
包括(ExternalProject)
ExternalProject_Add(googletest
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG主
SOURCE_DIR“ $ {CMAKE_CURRENT_BINARY_DIR} / googletest-src”
BINARY_DIR“ $ {CMAKE_CURRENT_BINARY_DIR} / googletest-build”
CONFIGURE_COMMAND“”
BUILD_COMMAND“”
INSTALL_COMMAND“”
TEST_COMMAND“”
)
现有版本的`CMakeLists.txt`:cmake
#在配置时间下载并解压缩googletest
configure_file(googletest-download / CMakeLists.txt中的CMakeLists.txt。)
execute_process(COMMAND $ {CMAKE_COMMAND} -G“ $ {CMAKE_GENERATOR}”。RESULT_VARIABLE结果WORKING_DIRECTORY $ {CMAKE_CURRENT_BINARY_DIR} / googletest-download)
如果(结果)信息(FATAL_ERROR“针对googletest的CMake步骤失败:$ {result}”)
万一()
execute_process(COMMAND $ {CMAKE_COMMAND} --build。RESULT_VARIABLE结果WORKING_DIRECTORY $ {CMAKE_CURRENT_BINARY_DIR} / googletest-download)
如果(结果)消息(FATAL_ERROR“针对googletest的构建步骤失败:$ {result}”)
万一()#防止覆盖父项目的编译器/链接器
Windows上的#个设置
设置(gtest_force_shared_crt ON CACHE BOOL“” FORCE)#将googletest直接添加到我们的版本中。这定义
#gtest和gtest_main目标。
add_subdirectory($ {CMAKE_CURRENT_BINARY_DIR} / googletest-src$ {CMAKE_CURRENT_BINARY_DIR} / googletest-buildEXCLUDE_FROM_ALL)#现在只需根据需要链接到gtest或gtest_main。例如
add_executable(示例example.cpp)
target_link_libraries(例如gtest_main)
add_test(NAME example_test COMMAND示例)
请注意,由于使用了以下方法,因此此方法需要CMake 2.8.2或更高版本
ExternalProject_Add()
命令。对上述技术进行了更详细的讨论
在[此单独的文章](http://crascit.com/2015/07/25/cmake-gtest/)中
还包含该技术的全面概括实现的链接。
Visual Studio动态vs静态运行时
默认情况下,新的Visual Studio项目动态链接C运行时,但是
GoogleTest静态链接它们。这将产生一个看起来像错误
类似于以下内容:gtest.lib(gtest-all.obj):错误LNK2038:不匹配
检测到“ RuntimeLibrary”:值“ MTd_StaticDebug”与值不匹配
main.obj中的“ MDd_DynamicDebug”
GoogleTest已经为此提供了一个CMake选项:gtest_force_shared_crt
启用此选项将使gtest也动态链接运行时,并且
匹配包含它的项目。
C ++标准版本
需要一个支持C ++ 11的环境才能成功构建
GoogleTest。确保这一点的一种方法是在顶层指定标准
项目,例如通过使用set(CMAKE_CXX_STANDARD 11)命令。如果这
是不可行的,例如在使用GoogleTest进行验证的C项目中,
然后可以通过将其添加到cmake的选项中来指定它
DCMAKE_CXX_FLAGS选项。
调整GoogleTest
GoogleTest可以在多种环境中使用。默认配置可能
在某些环境中无法立即使用(或可能无法正常使用)。然而,
您可以通过在编译器上定义控制宏来轻松调整GoogleTest
命令行。通常,这些宏的命名类似于“ GTEST_XYZ”,您可以定义
它们设置为1或0即可启用或禁用某些功能。
我们在下面列出了最常用的宏。有关完整列表,请参见文件
[include / gtest / internal / gtest-port.h](https://github.com/google/googletest/blob/master/googletest/include/gtest/internal/gtest-port.h)。
多线程测试
如果有pthread库,则GoogleTest是线程安全的。后
#include“ gtest / gtest.h”,您可以检查
GTEST_IS_THREADSAFE宏以查看是否存在这种情况(如果宏为
将#defined设置为1,如果未定义则为no。)。
如果GoogleTest无法正确检测到pthread是否在您的计算机中可用
环境,您可以强制使用
-DGTEST_HAS_PTHREAD = 1
或者
-DGTEST_HAS_PTHREAD = 0
当GoogleTest使用pthread时,您可能需要向编译器添加标志和/或
链接器以选择pthread库,否则您将获得链接错误。如果您使用
CMake脚本,这已为您解决。如果您使用自己的构建脚本,
您需要阅读编译器和链接器的手册,以了解哪些标志
添加。
###作为共享库(DLL)
GoogleTest紧凑,因此大多数用户都可以将其构建并链接为静态库
为简单起见。您可以选择将GoogleTest用作共享库(已知
作为Windows上的DLL)。
要将* gtest *编译为共享库,请添加
-DGTEST_CREATE_SHARED_LIBRARY = 1
编译器标志。您还需要告诉链接器产生一个共享的
而是使用库-查阅链接器手册以了解操作方法。
要编译使用gtest共享库的* test *,请添加
-DGTEST_LINKED_AS_SHARED_LIBRARY = 1
编译器标志。
注意:虽然今天使用某些方法在技术上并不需要上述步骤
编译器(例如GCC),如果我们决定
提高加载库的速度(请参阅
有关详细信息,请参见http://gcc.gnu.org/wiki/Visibility。因此,建议您
在将GoogleTest用作共享库时始终添加上述标志。
否则,将来发布的GoogleTest可能会破坏您的构建脚本。
避免宏名称冲突
在C ++中,宏不遵循命名空间。因此,两个都定义了一个
如果您同时使用#include和这两个定义,则同名宏会发生冲突。万一
GoogleTest宏与另一个库发生冲突,您可以强制GoogleTest执行以下操作:
重命名其宏以避免冲突。
具体来说,如果GoogleTest和其他一些代码都定义了宏FOO,则可以
添加
-DGTEST_DONT_DEFINE_FOO = 1
到编译器标志,以告知GoogleTest将宏的名称从“ FOO”更改为
到GTEST_FOO
。当前,“ FOO”可以是“失败”,“成功”或“测试”。为了
例如,使用-DGTEST_DONT_DEFINE_TEST = 1
,您需要编写
GTEST_TEST(SomeTest,DidThis){...}
代替
TEST(SomeTest,DoesThis){...}
为了定义一个测试。
第一章 UT单元测试——GoogleTest通用构建说明相关推荐
- 第二章 UT单元测试——GTest框架实例
系列文章目录 第一章 UT单元测试--GoogleTest通用构建说明 第二章 UT单元测试--GTest框架实例 文章目录 系列文章目录 前言 一.环境配置 二.使用步骤 1.添加待测源码 2.修改 ...
- 第三章 UT单元测试——CPU与内存使用率限制
系列文章目录 第一章 UT单元测试--GoogleTest通用构建说明 第二章 UT单元测试--GTest框架实例 第三章 UT单元测试--CPU与内存使用率限制 文章目录 系列文章目录 前言 一.环 ...
- 《改善java代码》第一章:java开发通用原则
1.命名:包名全小写,类名首字母全大写,常量全部大写并用下划线分割,变量采用驼峰命名法 2.三元操作符: int i=80; String s1= String.value(i<90?90:10 ...
- 【第一章:技术面试通用必备技能】第2节:业务逻辑面试和HR面试
大家好,很高兴我们可以一起交流学习.在上一节中,我们介绍了如何制作以及投递简历,相信聪明的你已经可以制作一个比较优秀的简历了.有了通关文牒,就可以进入与面试官的PK环节了.本节中,我们就来介绍下与面试 ...
- 第一章 为什么使用单元测试
第一章 为什么使用单元测试 1.1 程序员的工作--修改软件 修改既有代码是程序员谋生的手段.但是为什么我们需要去修改软件呢?修改软件有以下4个主要起因: ● 修正bug ● 添加新特性(featur ...
- 构建之法第一章读后感
首先,文章对于程序.用户需求.工程等等概念用了阿超给儿子编写的一个出题程序来分别解释了个中的含义,尤其是程序和工程的区别, 程序大概就是用很多语言或工具编写的一个简单能实现目标要求的一行行代码,而工程 ...
- 《深入理解 Spring Cloud 与微服务构建》第一章 微服务简介
<深入理解 Spring Cloud 与微服务构建>第一章 微服务简介 文章目录 <深入理解 Spring Cloud 与微服务构建>第一章 微服务简介 一.单体架构及其存在的 ...
- Atitit保证架构超前性 前瞻性 目录 第一章 简单抽象原则 道和术的区别 1 第一节 原则 kiss 1 第二节 提升到层次哲学层次 1 第三节 命名也要通用抽象 隐藏细节 1 第二章 通用性原
Atitit保证架构超前性 前瞻性 目录 第一章 简单抽象原则 道和术的区别 第一节 原则 kiss 第二节 提升到层次哲学层次 第三节 命名也要通用抽象 隐藏细节 第二章 通用性原则 扩展性 第一 ...
- linux scons源码安装,SCons 第一章 构建并安装SCons
第一章 构建和安装SCons 本章将介绍一些安装SCons的基本步骤,本章也将介绍一些基本的python安装步骤,无论SCons还是python安装都非常简单. 1.1 安装python 因为 ...
最新文章
- SICP 习题 (2.7) 解题总结 : 定义区间数据结构
- python下载大文件-使用请求在python中下载大文件
- Unity3d 布娃娃系统
- lisp直线连接圆象限电_圆并不难,为什么很多考生就是学不会?
- 除了数据属性,Vue 实例还提供了一些有用的实例属性与方法。它们都有前缀 $,以便与用户定义的属性区分开来。
- jfreechart demo 源代码 下载
- SharePoint Hello World Web Part
- linux下iptables讲解
- thinkphp用来做什么项目_thinkphp第1课:使用thinkphp创建一个项目
- ES6 Promise - 让我们解开的面纱(遵循Promise/A+规范)
- 网站的icon图标与阿里云图标库的使用
- 3D数字孪生大屏怎么做?你需要了解这款数据可视化软件
- uniapp-小程序与H5压缩图片上传
- html绘制波形图,Html5 canvas 绘制心电波形图
- 性能测试中设计性能场景
- i5 12490f和i5 12400f的区别
- 关于java变量命名,介绍阿里JAVA命名规范及IDEA实时检测插件的使用以及CODELF取名神器
- 线程池之ThreadPoolExecutor详解
- 技术经营:下一个掘金地
- 鑫缘聚禾:拼多多拼团怎么拼