步骤5:安装和测试

news2024/10/6 2:17:57

练习1 -安装规则

    通常,仅仅构建可执行文件是不够的,它还应该是可安装的。使用CMake,我们可以使用install()命令指定安装规则。

目标

    安装教程可执行文件和MathFunctions库。

需要编辑的文件

MathFunctions/CMakeLists.txt

CMakeLists.txt

步骤

    在Step5目录中提供了起始代码。在这个练习中,完成TODO 1到TODO 4。
    首先,更新MathFunctions/CMakeLists.txt,将MathFunctions和tutorial_compiler_flags库安装到lib目录中。在同一个文件中,指定将MathFunctions.h安装到include目录所需的安装规则。

    然后,更新顶层的CMakeLists.txt,将教程可执行文件安装到bin目录中。最后,所有头文件都应该安装到include目录中。请记住,TutorialConfig.h位于PROJECT_BINARY_DIR中。

实现操作

    项目的安装规则为:
    对于MathFunctions,我们希望分别将库和头文件安装到libinclude目录中。
    对于教程可执行文件,我们希望分别将可执行文件和配置的头文件安装到bin和include目录中。

    因此,在MathFunctions/CMakeLists.txt的末尾,我们添加:

    第1步:

//定义一个变量installable_libs,其中包含了两个值:MathFunctions和tutorial_compiler_flags。这些通常是指CMake项目中的目标(target)或库(library),用于后续的安装步骤。
set(installable_libs MathFunctions tutorial_compiler_flags)

//判断是否存在名为SqrtLibrary的目标。如果存在(即TARGET SqrtLibrary条件成立),则通过list(APPEND ...)命令将SqrtLibrary添加到installable_libs变量的末尾。这样,如果项目中定义了SqrtLibrary目标,它就会被包含在安装列表中。
if(TARGET SqrtLibrary)
  list(APPEND installable_libs SqrtLibrary)
endif()

//install命令来指定将哪些目标安装到指定的目标路径(DESTINATION lib)。${installable_libs}变量在这里用作install命令的参数,表示安装这些目标或库。根据之前的定义和条件判断,可能包括MathFunctions、tutorial_compiler_flags以及可选的SqrtLibrary(如果存在)。
install(TARGETS ${installable_libs} DESTINATION lib)

   第2步:

install(FILES MathFunctions.h DESTINATION include)

    install 是CMake提供的一个命令,用于安装文件或目标到指定的位置。
    FILES MathFunctions.h 指定了要安装的文件列表,这里只有一个文件 MathFunctions.h。
    DESTINATION include 指定了安装的目标路径。在这里,include 表示将文件安装到目标路径下的 include 子目录中。

这行代码的作用是将项目中的 MathFunctions.h 文件安装到目标路径的 include 目录下,使得其他项目或者用户在使用这个库时可以直接包含这个头文件。

    教程可执行文件和配置的头文件的安装规则是相似的。在顶级CMakeLists.txt的末尾,我们添加:

install(TARGETS Tutorial DESTINATION bin)
install(FILES "${PROJECT_BINARY_DIR}/TutorialConfig.h"
  DESTINATION include
  )

    这就是创建本教程的基本本地安装所需的全部内容。

编译和运行

    新建一个名为Step5_build的目录。从命令行使用cmake命令的--install选项(在3.15中引入,旧版本的cmake必须使用make install)运行安装步骤。这一步将安装适当的头文件、库和可执行文件。例如:

cmake --install .

    对于多配置工具,不要忘记使用--config参数来指定配置。

cmake --install . --config Release

    如果使用IDE,只需构建INSTALL目标。您可以从命令行构建相同的安装目标,如下所示:

cmake --build . --target install --config Debug

    CMake变量CMAKE_INSTALL_PREFIX用于确定文件安装的根目录。如果使用cmake--install命令,可以通过--prefix参数重写安装前缀。例如:

cmake --install . --prefix "/home/myuser/installdir"

    移动到安装目录,并验证安装的教程库是否运行。

练习2 -测试支持

    CTest提供了一种轻松管理项目测试的方法。可以通过add_test()命令添加测试。

目标

    使用CTest为我们的可执行文件创建单元测试。

步骤

    源代码在Step5目录中提供。在这个练习中,完成TODO 5到TODO 9。
    首先,我们需要启用测试。接下来,开始使用add_test()向项目添加测试。我们将添加3个简单的测试。

具体操作

    在顶层CMakeLists.txt文件的末尾,我们首先需要使用enable_testing()命令启用测试。

enable_testing()

    启用测试后,我们将添加一些基本测试来验证应用程序是否正常工作。首先,使用add_test()创建一个测试,它运行教程可执行文件,并传入参数25。此测试将验证应用程序是否运行,没有出现分段故障或以其他方式崩溃,并且返回值为零。

add_test(NAME Runs COMMAND Tutorial 25)
  • add_test 是 CMake 的命令,用于添加一个测试。它会创建一个新的测试,并将其添加到 CTest 的测试套件中。
  • NAME Runs 指定了测试的名称为 "Runs"。这个名称是用来标识测试的唯一标识符,用于在测试结果中查找和报告。
  • COMMAND Tutorial 25 指定了要运行的命令。在这里,"Tutorial" 是要执行的可执行文件的名称,而 "25" 则是传递给该可执行文件的参数。

     这行代码的目的是创建一个名为 "Runs" 的测试,该测试会运行名为 "Tutorial" 的可执行文件,并传递整数参数 25 给这个可执行文件。此测试的主要目标是验证以下几点:

  1. 应用程序能够正常运行,即不会因为段错误或其他崩溃而终止。
  2. 应用程序的返回值应为零,这表示程序在运行过程中没有遇到严重错误或异常情况。

    这种测试方法适用于验证应用程序的基本运行情况,而不涉及具体的计算结果是否正确,主要关注程序是否能够在最基本的情况下正常启动和结束。

    接下来,让我们使用PASS_REGULAR_EXPRESSION测试属性来验证测试的输出是否包含某些字符串。在本例中,验证当提供的参数数量不正确时是否打印usage消息。

add_test(NAME Usage COMMAND Tutorial)
set_tests_properties(Usage
  PROPERTIES PASS_REGULAR_EXPRESSION "Usage:.*number"
  )
  1. add_test(NAME Usage COMMAND Tutorial)

    • add_test 命令创建一个名为 "Usage" 的测试。
    • NAME Usage 指定了测试的名称为 "Usage"。这个名称用于在测试结果中标识和查找测试。
    • COMMAND Tutorial 指定了要运行的命令或可执行文件为 "Tutorial"。这表示测试会执行名为 "Tutorial" 的可执行文件。
  2. set_tests_properties(Usage PROPERTIES PASS_REGULAR_EXPRESSION "Usage:.*number")

    • set_tests_properties 是 CMake 的命令,用于设置测试的属性。
    • Usage 是之前定义的测试名称,这里是 "Usage"。
    • PROPERTIES 关键字用于指定要设置的属性。
    • PASS_REGULAR_EXPRESSION 是一个测试属性,它指定了一个正则表达式模式。
    • "Usage:.*number" 是一个正则表达式,它描述了期望在测试的输出中匹配的字符串模式。具体含义是:
      • Usage::输出中应包含 "Usage:" 这个字符串。
      • .*:表示任意数量的任意字符,这里是用来匹配 "Usage:" 后面可能存在的其他字符。
      • number:输出中还应包含 "number" 这个单词。

    这段代码的作用是创建一个名为 "Usage" 的测试,测试会运行名为 "Tutorial" 的可执行文件,并且验证该可执行文件的输出中是否包含 "Usage:" 和 "number"。如果测试输出符合这个正则表达式模式,那么测试将被视为通过;否则,测试将失败。这种方法可以用来验证程序在特定情况下是否输出了预期的使用说明或错误信息。

    接下来将添加的下测试命令来验证计算值为平方根,如下所示:

add_test(NAME StandardUse COMMAND Tutorial 4)
set_tests_properties(StandardUse
  PROPERTIES PASS_REGULAR_EXPRESSION "4 is 2"
  )
  1. add_test(NAME StandardUse COMMAND Tutorial 4)

    • add_test 命令创建一个名为 "StandardUse" 的测试。
    • NAME StandardUse 指定了测试的名称为 "StandardUse"。
    • COMMAND Tutorial 4 指定了要运行的命令为 "Tutorial",并传递整数参数 4 给这个可执行文件。这表示测试会执行名为 "Tutorial" 的可执行文件,并向其传递参数 4。
  2. set_tests_properties(StandardUse PROPERTIES PASS_REGULAR_EXPRESSION "4 is 2")

    • set_tests_properties 命令用于设置测试的属性。
    • StandardUse 是之前定义的测试名称。
    • PROPERTIES 关键字用于指定要设置的属性。
    • PASS_REGULAR_EXPRESSION 是一个测试属性,指定了一个正则表达式模式。
    • "4 is 2" 是正则表达式,描述了测试输出中预期要匹配的字符串。

    这段代码的目的是创建一个名为 "StandardUse" 的测试,该测试会运行名为 "Tutorial" 的可执行文件,传递参数 4 给它。然后,它验证该可执行文件的输出中是否包含字符串 "4 is 2"。这样的验证通常用于确保程序在计算平方根时,输出确实是预期的平方根值。例如,这里期望的输出是 "4 is 2",表示对于输入 4,程序应输出其平方根值为 2。如果输出符合这个正则表达式模式,测试将被视为通过;否则,测试将失败。

    这一个测试还不足以让我们确信它对传入的所有值都有效。我们应该增加更多的测试来验证这一点。为了方便地添加更多测试,我们创建了一个名为do_test的函数,该函数运行应用程序并验证给定输入的计算平方根是否正确。

function(do_test target arg result)
  add_test(NAME Comp${arg} COMMAND ${target} ${arg})
  set_tests_properties(Comp${arg}
    PROPERTIES PASS_REGULAR_EXPRESSION ${result}
    )
endfunction()

# do a bunch of result based tests
do_test(Tutorial 4 "4 is 2")
do_test(Tutorial 9 "9 is 3")
do_test(Tutorial 5 "5 is 2.236")
do_test(Tutorial 7 "7 is 2.645")
do_test(Tutorial 25 "25 is 5")
do_test(Tutorial -25 "-25 is (-nan|nan|0)")
do_test(Tutorial 0.0001 "0.0001 is 0.01")

1.函数定义 do_test

function(do_test target arg result)
  add_test(NAME Comp${arg} COMMAND ${target} ${arg})
  set_tests_properties(Comp${arg}
    PROPERTIES PASS_REGULAR_EXPRESSION ${result}
  )
endfunction()
  • function(do_test target arg result):定义了一个名为 do_test 的函数,它接受三个参数:

    • target:表示要运行的可执行文件的名称。
    • arg:表示传递给可执行文件的参数。
    • result:是一个正则表达式,用于验证测试的输出是否符合预期。
  • add_test(NAME Comp${arg} COMMAND ${target} ${arg}):在这个函数中,首先使用 add_test 命令创建一个新的测试。

    • NAME Comp${arg}:指定了测试的名称,这里会根据传入的参数 arg 动态生成,确保每个测试名称是唯一的。
    • COMMAND ${target} ${arg}:指定要运行的命令和参数,即运行 ${target} 可执行文件,并传递 ${arg} 作为参数。
  • set_tests_properties(Comp${arg} PROPERTIES PASS_REGULAR_EXPRESSION ${result}):接着,使用 set_tests_properties 命令设置测试的属性。

    • Comp${arg}:指定要设置属性的测试名称。
    • PROPERTIES PASS_REGULAR_EXPRESSION ${result}:将 PASS_REGULAR_EXPRESSION 属性设置为 ${result},这个属性告诉测试框架应该用正则表达式 ${result} 来匹配测试输出,以验证测试是否通过。

2.调用 do_test 函数

  1. # do a bunch of result based tests
    do_test(Tutorial 4 "4 is 2")
    do_test(Tutorial 9 "9 is 3")
    do_test(Tutorial 5 "5 is 2.236")
    do_test(Tutorial 7 "7 is 2.645")
    do_test(Tutorial 25 "25 is 5")
    do_test(Tutorial -25 "-25 is (-nan|nan|0)")
    do_test(Tutorial 0.0001 "0.0001 is 0.01")
    
    • 这部分代码展示了如何使用 do_test 函数来添加多个测试。
    • 每个 do_test 调用都会添加一个新的测试,指定了要运行的可执行文件 Tutorial,传递给它的参数以及预期的输出结果。
    • 例如,do_test(Tutorial 4 "4 is 2") 表示添加一个测试,运行 Tutorial 可执行文件,传递参数 4,并期望输出包含字符串 "4 is 2"。

    通过这种方式,使用 do_test 函数可以大大简化添加测试的过程,并确保每个测试都验证了平方根计算的正确性,从而增加了代码的可靠性和测试覆盖率。

编译和运行

    移动到编译目录并重新编译程序。然后,运行ctest执行命令:ctest -N或ctest -VV。对于多配置生成器(例如Visual Studio),必须使用-C <mode>标志指定配置类型。例如,要在Debug模式下运行测试,执行ctest -C Debug -VV。

  1. ctest -N

    • -N 选项用于进行测试的预览,也称为显示测试。它不会真正运行测试,而是列出将要运行的测试列表。
    • 用法示例:在终端中进入构建目录,然后运行 ctest -N。这将显示将要运行的测试的列表,但不会实际执行测试代码。
  2. ctest -VV

    • -VV 选项用于详细输出,也称为详细输出模式。它会显示更多关于测试的详细信息,包括每个测试用例的输出和其他相关信息。
    • 用法示例:在终端中进入构建目录,然后运行 ctest -VV。这将以详细模式运行测试,并显示详细的输出信息,帮助诊断测试失败或其他问题。
  3. ctest -C Debug -VV

    • -C <mode> 选项用于指定配置模式,例如 Debug 或 Release。对于多配置生成器(如 Visual Studio),这是必需的。
    • -VV 选项用于详细输出模式,详细描述见上述。
    • 用法示例:在终端中进入构建目录,然后运行 ctest -C Debug -VV。这将以 Debug 模式运行测试,并显示详细的输出信息。

总结:

  • ctest -N:显示将要运行的测试列表,但不运行实际的测试代码。
  • ctest -VV:以详细输出模式运行测试,显示更多的测试执行信息。
  • ctest -C Debug -VV:以 Debug 配置模式运行测试,并显示详细的输出信息。

    这些命令可以帮助开发人员管理和执行项目中的测试,提高代码质量和可靠性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1903776.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据库】MySQL基本操作语句

目录 一、SQL语句 1.1 SQL分类 1.2 SQL语言规范 1.3 数据库对象与命名 1.3.1 数据库的组件(对象)&#xff1a; 1.3.2 命名规则&#xff1a; 1.4 SQL语句分类 二、基本命令 2.1 查看帮助信息 2.2 查看支持的字符集 2.3 查看默认使用的字符集 2.4 修改默认字符集 2.5…

SwiftData 模型对象的多个实例在 SwiftUI 中不能及时同步的解决

概览 我们已经知道,用 CoreData 在背后默默支持的 SwiftUI 视图在使用 @FetchRequest 来查询托管对象集合时,若查询结果中的托管对象在别处被改变将不会在 FetchedResults 中得到及时的刷新。 那么这一“囧境”在 SwiftData 里是否也会“卷土重来”呢?空说无益,就让我们在…

将 KNX 接入 Home Assistant 之四 功能测试

一&#xff1a;测试标准的KNX网关功能 测试软件识别是否正常 可以看到再ETS6和ETS5上都能正常识别 测试数据收发 可以正常发送数据 测试配置设备参数&#xff08;下载配置&#xff09; 可以看出&#xff0c;在ETS5上是可以正常下载参数的 但是 ETS6下载是失败的&#xff…

KDP数据分析实战:从0到1完成数据实时采集处理到可视化

智领云自主研发的开源轻量级Kubernetes数据平台&#xff0c;即Kubernetes Data Platform (简称KDP)&#xff0c;能够为用户提供在Kubernetes上的一站式云原生数据集成与开发平台。在最新的v1.1.0版本中&#xff0c;用户可借助 KDP 平台上开箱即用的 Airflow、AirByte、Flink、K…

JCR一区 | Matlab实现GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断

JJCR一区 | Matlab实现GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断 目录 JJCR一区 | Matlab实现GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断分类效果格拉姆矩阵图GAF-PCNN-MATTGASF-CNNGADF-CNN 基本介绍程序设计参考资料 分…

make工具

1、什么是make&#xff1f; make是个命令&#xff0c;是个可执行程序&#xff0c;是个工具&#xff0c;用来解析Makefile文件的命令&#xff0c;这个命令存放在/usr/bin/目录下 -rwxr-xr-x 1 root root 250K 2月 15 2022 make -rwxr-xr-x 1 root root 4.8K 2月 15 2022 ma…

图片高效管理神器,随机高度切割,一键生成灰色图片,个性化处理随心所欲

在数字化时代&#xff0c;图片已成为我们生活和工作中不可或缺的一部分。然而&#xff0c;面对海量的图片资源&#xff0c;如何高效管理、快速处理&#xff0c;成为了许多人头疼的问题。今天&#xff0c;我们为您带来了一款全新的图片高效管理神器_——首助编辑高手&#xff0c…

【全面介绍下如何使用Zoom视频会议软件!】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

Halcon 背景网格产品刮伤缺陷检测

* 关闭窗口 dev_close_window ()*关闭程序计数器,图形变量更新,窗口图形更新 dev_update_off ()*设置图像路径 Path : lcd/mura_defects_blur_*读取一张图像 read_image (Image, Path 01)*获取图像大小 get_image_size (Image, Width, Height)*创建一个新窗体 dev_open_window…

昇思25天学习打卡营第13天 | LLM原理和实践:文本解码原理--以MindNLP为例

1. 文本解码原理--以MindNLP为例 1.1 自回归语言模型 根据前文预测下一个单词 一个文本序列的概率分布可以分解为每个词基于其上文的条件概率的乘积 W 0 W_0 W0​:初始上下文单词序列 t t t: 时间步 当生成EOS标签时&#xff0c;停止生成。 MindNLP/huggingface Transfor…

NewStarCTF2023-Misc

目录 week1 CyberChefs Secret 机密图片 流量&#xff01;鲨鱼&#xff01; 压缩包们 空白格 隐秘的眼睛 week2 新建Word文档 永不消逝的电波 1-序章 base! WebShell的利用 Jvav week3 阳光开朗大男孩 大怨种 2-分析 键盘侠 滴滴滴 week4 通大残 Nmap 依…

Unity AssetsBundle 详解

文章目录 1.AssetBundle 概念2.AssetBundle 优势3.AssetBundle 特性4.AssetBundle 使用流程4.1 分组4.2 打包4.3 加载包4.4 加载资源4.5 卸载资源 5.AssetBundleManifest6.AssetBundle的内存占用7.AB包资源加密 1.AssetBundle 概念 AssetBundle又称AB包&#xff0c;是Unity提供…

Python视觉轨迹几何惯性单元超维计算结构算法

&#x1f3af;要点 &#x1f3af;视觉轨迹几何惯性单元超维计算结构算法 | &#x1f3af;超维计算结构视觉场景理解 | &#x1f3af;超维计算结构算法解瑞文矩阵 | &#x1f3af;超维矢量计算递归神经算法 &#x1f36a;语言内容分比 &#x1f347;Python蒙特卡罗惯性导航 蒙…

【漏洞复现】宏景eHR LoadOtherTreeServlet SQL注入漏洞

0x01 产品简介 宏景eHR人力资源管理软件是一款人力资源管理与数字化应用相融合&#xff0c;满足动态化、协同化、流程化、战略化需求的软件。 0x02 漏洞概述 宏景eHR LoadOtherTreeServlet接口处存在SQL注入漏洞&#xff0c;未经身份验证的远程攻击者除了可以利用 SQL 注入漏…

[Multi-Modal] MDETR 论文及代码学习笔记

代码地址&#xff1a;https://github.com/ashkamath/mdetr 论文地址&#xff1a;https://arxiv.org/abs/2104.12763 多模态推理系统依靠预先训练的目标检测器从图像中提取感兴趣区域&#xff08;边界框包围区域&#xff09;。然而&#xff0c;这个关键模块通常被用作黑匣子&…

MySQL高级----详细介绍MySQL中的锁

概述 锁是计算机协调多个进程或线程并发访问某一资源的机制&#xff0c;为了解决数据访问的一致性和有效性问题。在数据库中&#xff0c;除传统的计算资源(CPU、RAN、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、…

windows无法访问github

##一、如果发现windows无法访问github时 一般就是我们的dns出现了问题&#xff0c;此时我们需要更换一个dns访问 ##二、解决方法 首先我们访问ip查询地址&#xff0c; https://ipchaxun.com/github.com/ 可更换下面历史ip进行测试&#xff0c;在windows的cmd里面输入ping git…

【C++深度探索】:继承(定义赋值兼容转换作用域派生类的默认成员函数)

✨ 愿随夫子天坛上&#xff0c;闲与仙人扫落花 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞…

pin是什么?管脚

1.平面分割 1)启动Allegro PCB design &#xff0c;打开.brd。深色部分属于一个net&#xff0c;要做一下修改&#xff0c;将上面的pin包含进shape中&#xff0c;i进行a&#xff0c;b两步操作&#xff0c;删除以前存在的Anti Etch下的line&#xff0c;再将其进行补齐 使它保住上…

MSPM0G3507——OPENMV给M0传数据(用数据包)互相通信(以循迹为例)

OPENMV端代码 # main.py -- put your code here! import pyb, sensor, image, math, time from pyb import UART import ustruct from image import SEARCH_DS, SEARCH_EX import time import sensor, displayuart UART(3, 115200, bits8, parityNone, stop1, timeout_char10…