当前位置: 首页 > news >正文

【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

输出测试结果
在这里插入图片描述

相关文章:

  • web学习笔记(六十二)
  • 黄仁勋在ComputeX 2024演讲:英伟达发布三款新芯片计划,挑战摩尔定律
  • 机器学习_正则化方法
  • Qt——前言
  • 推荐一些有趣实用的网站
  • 【Python数据挖掘实战案例】机器学习LightGBM算法原理、特点、应用---基于鸢尾花iris数据集分类实战
  • 安卓SystemServer进程详解
  • SqlServer2016企业版安装
  • docker和docker-compose的安装
  • 阿里云对象存储oss——对象储存原子性和强一致性
  • 测试记录3:WLS2运行Linux界面
  • [沫忘录]MySQL InnoDB引擎
  • nodejs 获取服务器文件夹里面图片,并前端进行幻灯展示
  • MBedTLS v3.6.0 长期支持 (LTS) 版本
  • Elasticsearch:6.x 处理一对多关系使用场景
  • LLM的基础模型5:Embedding模型
  • Java物业管理系统+数据库应用程序开发[JavaSE+JDBC+idea控制台+MySQL]
  • 使用 Django 连接 MySQL 数据库
  • 业务安全蓝军测评标准解读—业务安全体系化
  • Java18新特性有哪些
  • 新华时评:任凭风云变幻,中俄关系从容前行
  • 外交部回应中美经贸高层会谈:这次会谈是应美方请求举行的
  • 央行:增加科技创新和技术改造再贷款额度3000亿元
  • 线下无理由退货怎样操作?线上线下监管有何不同?市场监管总局回应
  • 巴基斯坦外交部:印度侵略行径侵犯巴主权
  • 德国新一届联邦政府宣誓就职