目录

一、CMake相关命令

1.macro

2.与宏参数相关的字符串

(1)${ARGC}

(2)${ARGV}

(3)${ARGN}

3.math

4.add_test

5.set_tests_properties

二、主要实现

1.顶层CMakeLists.txt

2.tests/CMakeLists.txt

3.tests/test.cpp

4.其他文件

5.配置及编译

在测试时,通过宏可以方便地定义测试和设置测试的顺序。比如我们测试代码时需要多次调用调用 add_test 和 set_tests_properties来设置每个测试的预期开销,而我们通过定义一个宏(或一个函数)能够一次性处理这两个函数的调用。

一、CMake相关命令

1.macro

macro(<name> [<arg1> ...])<commands>
endmacro()

定义一个名为<name>的宏,该宏接受名为<arg1>的参数。在调用宏之前,不会执行macro()到endmacro()之间列出的命令。

2.与宏参数相关的字符串

(1)${ARGC}

保存给定宏的所有参数数量。

(2)${ARGV}

保存给定宏的所有参数列表。

(3)${ARGN}

保存超过最后一个预期参数的参数列表,即额外参数列表。

宏命令与function()命令非常相似。尽管如此,还是有一些重要的区别:

  • 在函数中,ARGN,ARGC,ARGV和ARGV0,ARGV1...是通常意义上的真变量。
  • 在宏上,它们不是变量它们是字符串替换,就像C预处理器对宏所做的那样。

所以,无法使用以下命令:

if(ARGV1)

而我们应该这样使用:

if(${ARGV1})

3.math

math(EXPR <variable> "<expression>" [OUTPUT_FORMAT <format>])

计算一个数学表达式。计算数学表达式<expression>,并将<variable>设置为结果值。表达式的结果必须可以表示为64位有符号整数。

  1. 数学表达式必须以字符串形式给出(即用双引号括起来)。
  2. 结果根据选项OUTPUT_FORMAT格式化,其中<format>是以下选项之一:
  • HEXADECIMAL:C代码中的十六进制表示法,即以“0x”开头。
  • DECIMAL:十进制记数法。如果未指定“输出格式”选项,也会使用该选项。
  math(EXPR num_macro_calls "${num_macro_calls} + 1")

4.add_test

CMake I 创建一个简单的单元测试_该用户还没想到好的昵称的博客-CSDN博客

5.set_tests_properties

set_tests_properties(test1 [test2...] PROPERTIES prop1 value1 prop2 value2)

设置测试的属性。如果未找到测试,CMake将报告错误。

COST属性:描述测试的成本。当启用并行测试时,测试集中的测试将按成本降序运行。项目可以通过将此属性设置为浮点值来明确定义测试的成本。

二、主要实现

1.顶层CMakeLists.txt

cmake_minimum_required(VERSION 3.5 FATAL_ERROR)project(recipe-01 LANGUAGES CXX)set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD_REQUIRED ON)#根据GNU标准定义 binary 和 library 路径
include(GNUInstallDirs)set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})#使用 add_subdirectory 调用 src/CMakeLists.txt 和 tests/CMakeLists.txt
add_subdirectory(src)enable_testing()
add_subdirectory(tests)

2.tests/CMakeLists.txt

#构建并链接 cpp_test 可执行文件
add_executable(cpp_test test.cpp)
target_link_libraries(cpp_test sum_integers)#定义一个新宏 add_catch_test,两个参数_name _cost
macro(add_catch_test _name _cost)#将 num_macro_calls 加1math(EXPR num_macro_calls "${num_macro_calls} + 1")message(STATUS "add_catch_test called with ${ARGC} arguments: ${ARGV}")#引入一个新变量,但不能直接查询ARGN,因为它不是通常意义上的CMake变量set(_argn "${ARGN}")if(_argn)message(STATUS "oops - macro received argument(s) we did not expect: ${ARGN}")endif()add_test(NAME${_name}COMMAND$<TARGET_FILE:cpp_test>[${_name}] --success --out${PROJECT_BINARY_DIR}/tests/${_name}.log --durations yesWORKING_DIRECTORY${CMAKE_CURRENT_BINARY_DIR})set_tests_properties(${_name}PROPERTIESCOST ${_cost})
endmacro()set(num_macro_calls 0)
#使用 add_catch_test 定义了两个测试
add_catch_test(short 1.5)
add_catch_test(long 2.5 extra_argument)message(STATUS "in total there were ${num_macro_calls} calls to add_catch_test")

add_test中的命令可以参考:CMake I 使用Catch2库进行单元测试_该用户还没想到好的昵称的博客-CSDN博客

3.tests/test.cpp

#include "sum_integers.hpp"// this tells catch to provide a main()
// only do this in one cpp file
#define CATCH_CONFIG_MAIN
#include "catch.hpp"#include <vector>TEST_CASE("Sum of integers for a short vector", "[short]") {auto integers = {1, 2, 3, 4, 5};REQUIRE(sum_integers(integers) == 15);
}TEST_CASE("Sum of integers for a longer vector", "[long]") {std::vector<int> integers;for (int i = 1; i < 1001; ++i) {integers.push_back(i);}REQUIRE(sum_integers(integers) == 500500);
}

4.其他文件

src/sum_integers.h文件和 src/sum_integers.cpp文件见博客。

tests/catch.hpp文件见博客。

5.配置及编译

进行测试时,时间长的会先开始。ctest命令见博客。

CMake | 使用宏重用代码相关推荐

  1. CMake使用宏编译测试

    首先代码中定义了使用宏的模块: 在任何位置都可以使用宏 #ifndef UNIT_TESTif(m_stop) {break;}std::cout << "thread is g ...

  2. ASP.NET重用代码技术 - 用户控件技术

    作者: 苏红超 使用ASP.NET中的代码绑定技术来使得代码重用变得简单可行.我们发现,利用代码绑定技术我们可以容易的将我们的代码和内容分离开来,利用它可以建立可重用的代码,只是这种技术本身也存在着一 ...

  3. ASP.NET重用代码技术 - 代码绑定技术

    作者: 苏红超     导读   代码绑定是ASP.NET提供的一个重要的新技术.本文将会为您展示如何利用代码绑定技术来实现Web页面表示层和商业逻辑代码的分离,并建议您使用代码绑定技术实现代码的可重 ...

  4. Xcode可重用代码块code snippets

    一. 关于code snippets 通过Xcode的重用代码块(code snippets)可快速输入预设好的常用代码模板,如通过键入 hystrong 系统会直接替代为 @property(non ...

  5. coverage 覆盖多个测试文件时_奇技淫巧[2]:cmake中添加lcov代码覆盖测试

    奇技淫巧[2]:cmake中添加lcov代码覆盖测试 1 目的 为CMake工程的test添加lcov代码覆盖性测试 2 要点 添加lcov支持的方法应该有很多,比较方便的有: (1)利用脚本基于文件 ...

  6. 陈灯可重用代码段管理器(插件版最新版本:3.2;桌面版最新版本:2.3)

    [软件简介] 陈灯代码段管理器为一款个人软件作品,其主要功能是对可重用代码段进行管理,包括对代码段的入库.代码段的搜索和代码段的共享等.软件包括插件版本和桌面版本两种版本,插件版本集成在Visual ...

  7. 让我们习惯在底层用C++宏生成代码

    春天最难堪的是没有收成的垦植:人生最难堪的是失踪往决意信念的寂寞 我们知道操作C++泛型编程可以写出扩年夜性很是强的法式,操作C++的接***术也可以很等闲的扩年夜出已经存在的法式.只不外有一件工作它 ...

  8. Excel(VBA)自定义右键单击菜单以启动宏(示例代码)

    主要介绍 Excel(VBA)自定义右键单击菜单以启动宏(示例代码)以及相关的经验技巧 THISWORKBOOK (paste into ThisWorkbook, macros that open ...

  9. 软件公司可重用代码库的建设 from sina bloger meng

    这个想法由来已久,也是因为自己在现在效力的公司中能看到一些不良的现象,但自己却不是管理层,没有任何的执行力去改变它. 软件公司管理职位越往上,越不熟悉技术方面,加上此举和重构一样,很可能是吃力不讨好的 ...

最新文章

  1. OKR 落地需要相关工具的辅助吗?
  2. Automatic Judge 模拟
  3. boost::statechart模块实现无效结果复制测试
  4. 【终极方法】This method must return a result of type boolean
  5. python 调用bat失败_要想顺利通过Python面试,你最起码需要达到白银段位!
  6. Java封装图书信息类
  7. binlog关闭事务记录_【MySQL】binlog_format以及binlog事务记录分析
  8. Linux Intel网卡IGB驱动修改mac地址
  9. 电商项目面试题 及mysql面试题 太难没啥用
  10. 牛客 NC24858 [USACO 2009 Nov S]Job Hunt
  11. 最简单日柱推算法_日柱的简单计算方法
  12. Linux数据恢复的研究
  13. webug 4.0 第四关 POST注入
  14. 中国十大最具影响力***
  15. 2020计算机专业保研夏令营面经:南科大计算机
  16. Wildfish框架的实现原理之系统工具篇
  17. Spring 项目无法解析包含 uri http://java.sun.com/jsp/jstl/core 的 taglib
  18. 【实测避坑】SAP PI/PO系统 配置证书调用https地址
  19. Redis主从集群搭建及其原理
  20. IE的缺省设置(转)

热门文章

  1. 统计绘图软件--SYSTAT SigmaPlot
  2. 转:女孩子必须做的138件事
  3. gms签名不一致_苹果企业签名优缺点解析 如何添加苹果企业签名信任?
  4. Juniper SRX密码复杂度、尝试登陆等相关设置
  5. 做自动化测试3年,薪资为何会被应届生倒挂?
  6. Server2003安装SP2补丁提示密钥无效的解决方法
  7. OC门电路和OD门电路的区别
  8. README文件编写
  9. 用pandas库提取IBTrACS中特定条件的热带气旋最佳路径数据
  10. qt运行编译按钮居然是灰色的