【CMake系列】10-cmake测试 ctest
cmake作为一个强大的构建系统指导工具,同时也提供了测试功能,可用于项目的单元测试等,也可以与其他测试框架协作,如googletest,共同完成项目开发中的测试工作,本节我们就来学习 如何借助cmake 完成测试
本专栏的实践代码全部放在 github 上,欢迎 star !!!
如有问题,欢迎留言、或加群【392784757】交流
接下来给出我们本节的CMakeLists.txt 文件
cmake_minimum_required(VERSION 3.20)
project(test_ctest)
file(WRITE test_ctest.cpp [=[
#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
if(argc <=1 ) // 没有传递参数
return -1;
cout<<argv[1]<<endl;
return 0;
}
]=])
add_executable(test_ctest test_ctest.cpp)
# 测试用例
add_test(NAME test_return_-1 #
COMMAND test_ctest
)
add_test(NAME test_return_0 #
COMMAND test_ctest test_return_0
)
##################
add_test(NAME test_success # 测试控制台输出
COMMAND test_ctest success
)
set_tests_properties(test_success
PROPERTIES
PASS_REGULAR_EXPRESSION success #成功字符串匹配正则
)
add_test(NAME test_failed # 测试控制台输出
COMMAND test_ctest failed
)
set_tests_properties(test_failed
PROPERTIES
FAIL_REGULAR_EXPRESSION failed #成功字符串匹配正则
)
enable_testing()
接下来,我们将逐行进行解释,
首先,我们来明确一下测试,将我们的程序的输出与期待输出进行判断
程序的输出 在这里分为两种情况
程序运行 控制台输出
程序运行 返回值 (最常见的也就是 main 函数 返回 0 还是 -1)
也就是对程序的执行过程进行验证,是否符合我们的预期
cmake 测试
涉及命令
- add_test()
add_test(NAME <name>
COMMAND <command> [<arg>...] # 具体执行的命令 也就是 运行程序
[CONFIGURATIONS <config>...]
[WORKING_DIRECTORY <dir>]
[COMMAND_EXPAND_LISTS])
- set_tests_properties()
设定测试属性
PASS_REGULAR_EXPRESSION 匹配失败的控制台输出
FAIL_REGULAR_EXPRESSION 匹配成功的控制台输出
如下面的事例,
程序输出 success ,则程序运行符合逻辑,即测试通过
程序输出 failed,则程序运行不符合逻辑,测试未通过
add_test(NAME test_success # 测试控制台输出
COMMAND test_ctest success
)
set_tests_properties(test_success
PROPERTIES
PASS_REGULAR_EXPRESSION success #成功字符串 匹配正则
)
add_test(NAME test_failed # 测试控制台输出
COMMAND test_ctest failed
)
set_tests_properties(test_failed
PROPERTIES
FAIL_REGULAR_EXPRESSION failed #成功字符串匹配正则
- enable_testing()
启用测试
构建过程
cmake -S . -B build
cmake --build build
cd build
ctest -C Debug
输出测试结果

【CMake系列】10-cmake测试 ctest的更多相关文章
- Windows 10上源码编译glog和gflags 编写glog-config.cmake和gflags-config.cmake | compile glog and glags on windows from source
本文首发于个人博客https://kezunlin.me/post/bb64e398/,欢迎阅读! compile glog v0.3.5 and glags on windows from sour ...
- 【转载】CMake 简介和 CMake 模板
转载自我的博客: CMake 简介和 CMake 模板 . 如果你用 Linux 操作系统,使用 cmake 会简单很多,可以参考一个很好的教程: CMake 入门实战 | HaHack .如果你用 ...
- Java 集合系列 10 Hashtable详细介绍(源码解析)和使用示例
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- CMake安装或CMake Error at CMakeLists
CMake安装或CMake Error at CMakeLists 发生情景: 使用cmake命令安装软件时,报如下错误: CMake Error at CMakeLists.txt:4 (CMAKE ...
- <<Modern CMake>> 翻译 2. CMake 基础
<<Modern CMake>> 翻译 2. CMake 基础 最低版本 这是每个 CMakeLists.txt 文件的第一行.CMakeLists.txt 是 CMake 所 ...
- <<Modern CMake>> 翻译 1. CMake 介绍
<<Modern CMake>> 翻译 1. CMake 介绍 人们喜欢讨厌构建系统. 仅仅观看 CppCon17 上的演讲,就可以看到开发人员因为构建系统而闹笑话的例子. 这 ...
- ubuntu 16.04上源码编译glog和gflags 编写glog-config.cmake和gflags-config.cmake | compile glog and glags on ubuntu 16.04
本文首发于个人博客https://kezunlin.me/post/977f5125/,欢迎阅读! compile glog and glags on ubuntu 16.04 Series comp ...
- 编写自定义cmake配置文件FindXXX.cmake或者xxx-config.cmake | cmake with user defined entry
本文首发于个人博客https://kezunlin.me/post/12ab5707/,欢迎阅读! cmake with user defined entry Guide FindXXX.cmake ...
- [转帖]TPC-C解析系列01_TPC-C benchmark测试介绍
TPC-C解析系列01_TPC-C benchmark测试介绍 http://www.itpub.net/2019/10/08/3334/ 学习一下. 自从蚂蚁金服自研数据库OceanBase获得TP ...
- C# 基础知识系列- 10 反射和泛型(二)
0. 前言 这篇文章延续<C# 基础知识系列- 5 反射和泛型>,继续介绍C#在反射所开发的功能和做的努力.上一篇文章大概介绍了一下泛型和反射的一些基本内容,主要是通过获取对象的类型,然后 ...
随机推荐
- [好物推荐] Rime的86五笔输入法配置
一个比较好用的Rime五笔输入法配置文件, 个人已经使用很多年了. 官网: https://github.com/KyleBing/rime-wubi86-jidian 安装方式: /home/xxx ...
- PAT-甲级-1007
一.看题,https://www.patest.cn/contests/pat-a-practise/1007 其实,也是一顿暴力,但是最后一个测试点会运行超时,最开始,计算一段区间的值的总和的时候, ...
- Linux驱动中的等待队列与休眠
Linux驱动中的等待队列与休眠 原文:https://blog.csdn.net/mengluoxixiang/article/details/46239523?spm=1001.2014.3001 ...
- Java常见问题-多线程
现在有 T1.T2.T3 三个线程,你怎样保证 T2 在 T1 执行完后执行,T3 在 T2 执行完后执行? 这个多线程问题比较简单,可以用 join 方法实现. 在 Java 中 Lock 接口比 ...
- VUEX - 手稿
- C# 线程与进程
一.前台线程与后台线程对象 为什么要用多线程? 1.让计算机"同时"做多件事情,节约时间. 2.多线程可以让一个程序"同时"处理多个事情. 3.后台运行程序,提 ...
- webpack4.15.1 学习笔记(六) — 代码拆分(Code Splitting)
目录 入口起点 防止重复 动态导入(dynamic imports) 代码拆分能够将代码分离到不同的 bundle 中,然后可以按需加载或并行加载这些文件.代码拆分可以用于获取更小的 bundle,以 ...
- 解读GaussDB(for MySQL)灵活多维的二级分区表策略
本文分享自华为云社区<GaussDB(for MySQL)创新特性:灵活多维的二级分区表策略>,作者:GaussDB 数据库. 背景介绍 分区表及二级分区表的功能,可以让数据库更加有效地管 ...
- TIER 2: Oopsie
TIER 2: Oopsie Web 渗透 此次靶机结合前面知识,非常简单: nmap 扫描,发现 22 和 80 端口开放 服务 80 的 HTTP 服务 之后使用继续 Web 渗透: 使用 Wap ...
- JDK工具包:jshell
JDK工具包:jshell 简介 使用 jshell 工具可以执行 Java 代码,从而立即获取结果. 您可以输入 Java 定义(变量.方法.类等等) 例如: int x = 8 或 Java 表达 ...