CMake:带有单元测试的项目结构

2024-01-11

我正在尝试构建我的项目以包含生产源(在src子文件夹)和测试(在test子文件夹)。我正在使用 CMake 来构建它。作为一个最小的例子,我有以下文件:

CMakeLists.txt:

cmake_minimum_required (VERSION 2.8) 
project (TEST) 

add_subdirectory (src) 
add_subdirectory (test) 

src/CMakeLists.txt:

add_executable (demo main.cpp sqr.cpp) 

src/sqr.h

#ifndef SQR_H
#define SQR_H
double sqr(double);    
#endif // SQR_H

src/sqr.cpp

#include "sqr.h"
double sqr(double x) { return x*x; }

src/main.cpp - 使用 sqr,并不重要

测试/CMakeLists.txt:

find_package(Boost COMPONENTS system filesystem unit_test_framework REQUIRED)

include_directories (${TEST_SOURCE_DIR}/src) 

ADD_DEFINITIONS(-DBOOST_TEST_DYN_LINK) 

add_executable (test test.cpp ${TEST_SOURCE_DIR}/src/sqr.cpp) 

target_link_libraries(test
                      ${Boost_FILESYSTEM_LIBRARY}
                      ${Boost_SYSTEM_LIBRARY}
                      ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}
                      )

enable_testing()
add_test(MyTest test)

测试/测试.cpp:

#define BOOST_TEST_MODULE SqrTests
#include <boost/test/unit_test.hpp>

#include "sqr.h"

BOOST_AUTO_TEST_CASE(FailTest)
{
    BOOST_CHECK_EQUAL(5, sqr(2));
}

BOOST_AUTO_TEST_CASE(PassTest)
{
    BOOST_CHECK_EQUAL(4, sqr(2));
}

几个问题:

  1. 这个结构有意义吗?构建此代码时的最佳实践是什么? (我来自 C# 和 java,从某种意义上来说,那里更容易)
  2. 我不喜欢这样的事实:我必须列出来自src文件夹中的test/CMakeLists.txt文件。如果这是一个图书馆项目,我只会链接该图书馆。有没有办法避免列出其他项目中的所有 cpp 文件?
  3. 什么是线enable_testing() and add_test(MyTest test)正在做?我还没有看到任何效果。如何从 CMake(或 CTest)运行测试?
  4. 到目前为止我只是跑了cmake .在根文件夹中,但这会造成到处都是临时文件的混乱。如何得到结构合理的编译结果?

对于问题 1 和 2,我建议从除 main.cpp 之外的非测试文件中创建一个库(在本例中只是 src/sqr.cpp 和 src/sqr.h),然后您可以避免列出(更重要的是重新编译)所有源代码两次。

对于问题 3,这些命令添加一个名为“MyTest”的测试,该测试调用您的可执行文件“test”,不带任何参数。但是,由于您已将这些命令添加到 test/CMakeLists.txt 而不是顶级 CMakeLists.txt,因此您只能从构建树的“test”子目录中调用测试(尝试cd test && ctest -N)。如果您希望测试可以从顶级构建目录运行,您需要调用add_test来自顶级 CMakeLists.txt。这也意味着您必须使用更详细的形式add_test https://cmake.org/cmake/help/latest/command/add_test.html因为您的测试 exe 未在同一 CMakeLists.txt 中定义

就您而言,由于您在根文件夹中运行 cmake,因此您的构建树和源树是一棵相同的。这称为源内构建,并不理想,这导致了问题 4。

生成构建树的首选方法是进行源外构建,即在源树之外的某个位置创建一个目录并从那里执行 cmake。甚至在项目的根目录中创建一个“build”目录并执行cmake ..将提供一个干净的结构,不会干扰您的源代码树。

最后一点是避免调用可执行文件“test”(区分大小写)。原因请参见这个答案 https://stackoverflow.com/a/736838/424459.

为了实现这些改变,我会做以下事情:

CMakeLists.txt:

cmake_minimum_required (VERSION 2.8)
project (TEST)
add_subdirectory (src) 
add_subdirectory (test)
enable_testing ()
add_test (NAME MyTest COMMAND Test)

src/CMakeLists.txt:
add_library (Sqr sqr.cpp sqr.h)
add_executable (demo main.cpp)
target_link_libraries (demo Sqr)

test/CMakeLists.txt:
find_package (Boost COMPONENTS system filesystem unit_test_framework REQUIRED)
include_directories (${TEST_SOURCE_DIR}/src
                     ${Boost_INCLUDE_DIRS}
                     )
add_definitions (-DBOOST_TEST_DYN_LINK)
add_executable (Test test.cpp)
target_link_libraries (Test
                       Sqr
                       ${Boost_FILESYSTEM_LIBRARY}
                       ${Boost_SYSTEM_LIBRARY}
                       ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}
                       )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMake:带有单元测试的项目结构 的相关文章

随机推荐

  • Xcode 无法在选定的目标上运行

    今天早上我正在运行我的应用程序 现在当我尝试在 iPhone 5 1 模拟器上运行时突然出现以下错误 无法在选定的目的地上运行 目标不支持构建所选软件的体系结构 切换到支持该架构的目标以运行所选软件 我删除了方案 但仍然没有解决方案 我正在
  • 显式模板实例化的 gcc 问题?

    据我了解 专业化的声明或 typedef 应该导致模板类被实例化 但 gcc 似乎不会发生这种情况 例如 我有一个模板类 模板类Foo 我写的 class Foo
  • 调整图像大小而不损失任何质量[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何在不影响图像质量的情况下调整图像
  • 在整个应用程序中设置 on_delete 的简单方法

    我一直在使用 WdPython 的论据并发现tons为了准备升级到 Django 2 0 我需要进行一些更改 python Wd manage py runserver 最主要的是on delete https docs djangopro
  • Firestore 上的条件 where 查询

    我尝试在这里实施解决方案 firestore 查询中的条件 where 子句 https stackoverflow com questions 48514932 conditional where clause in firestore
  • document.referrer 存在但始终为空

    我正在 iOS 8 上开发一个移动应用程序 document referrer 似乎总是空的 我尝试使用以下方法检查它是否存在 if referrer in document alert referrer document referrer
  • Azure Functions - Blob 流输出绑定

    我创建了一个带有 blob 存储触发器的 Azure 函数 我想处理一个文件 然后将文件转储到另一个 blob 存储容器 在最简单的情况下 我想它会是这样的 public static void Run Stream blob string
  • 使用 Sencha 添加视频

    我想使用 Sencha 在我的网站中添加 YouTube 视频 我使用以下代码 var pnl new Ext Panel layout type vbox pack center items xtype video url space m
  • 如何在 Codeigniter 中使用测验机制

    我正在 Codeigniter 中构建一个简单的测验应用程序 其中向用户展示一张图像 让他们猜测它是对还是错 类似于 热与否 有 25 个问题 全部回答是或否 我可以选择创建 25 个页面并在隐藏字段中保留以前的结果 但这似乎有点冗长和愚蠢
  • 如何使用 TortoiseSVN 只检出(下拉)SVN 树的一部分?

    我正在使用 TortoiseSVN 我想将现有存储库签出到本地目录中 但是 我只想拉下文件树的某些部分 我有办法做到这一点吗 例如 trunk project A project B project C 假设我只想拉下主干 项目 A 和项目
  • 如何访问 .NET Standard 2.0 DLL 中的文件?

    谢谢你的拜访 这是我面临的问题 希望得到一些帮助 我正在尝试访问 NET 标准 DLL 中的文件 如果我在测试 UWP 应用程序中使用 Windows Storage 命名空间 则一切正常 如下所示 Windows Storage Stor
  • 如何安装较旧的 SonarLint Eclipse 插件

    目前 Eclipse Marketplace 中的 SonarLint 仅提供最新版本 2 5 1 出于兼容性原因 我需要版本 2 2 1 如何安装我选择的旧版本 不使用 Eclipse Marketplace 而是使用菜单帮助 安装新软件
  • Visual Studio 2015 Update 3 中与 ASP.NET Core v1.0 的浏览器链接

    我正在使用 Visual Studio 2015 Update 3 并希望在我的 ASP NET Core v1 0 WebApp 项目中使用浏览器链接功能 但我无法让浏览器链接正常工作 ASP NET Core v1 0 项目是否支持浏览
  • Inno Setup:也排除目录及其文件

    我在 Inno Setup 中使用 排除 标志 以便根据用户的体系结构从安装中排除子目录名称 Bin32 或 Bin64 我想要的只是不安装无用的文件夹及其所有文件和子目录 这是我目前的规则 Files Source Z Work temp
  • 使用 Elasticsearch 搜索多个字段

    我是 Elasticsearch 的新手 我想知道如何进行指定一个或多个字段的搜索 使用 SQL 我会编写这个查询 SELECT field1 field2 field3 FROM tablename WHERE field1 X AND
  • Spring Websocket 中的请求或会话范围

    我尝试从 WebSocket 端点调用 Singleton 服务 但我无法使用 WebSocket 中的请求或会话范围 Scope value 请求 proxyMode ScopedProxyMode TARGET CLASS I get
  • 将文本添加到使用 r 中的函数创建的图中

    我使用函数创建一个包含两个图的图形 即 data1 lt 1 3 basic lt function data1 par mfrow c 2 1 plot data1 plot data1 basic data1 现在我想将文本添加到图中
  • 错误:参数中的排名不匹配(排名 1 和标量)

    我遇到了这些错误 colsys f 1367 51 1 NOLD ALDIF K NCOMP M MSTAR 3 DUMM 0 1 Warning Rank mismatch in argument dmval at 1 rank 1 an
  • 使用 bash curl 和 oauth 返回谷歌应用程序用户帐户数据? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一种相当简单的方法来使用curl返回有关Google Apps中一批用户帐户 例如creat
  • CMake:带有单元测试的项目结构

    我正在尝试构建我的项目以包含生产源 在src子文件夹 和测试 在test子文件夹 我正在使用 CMake 来构建它 作为一个最小的例子 我有以下文件 CMakeLists txt cmake minimum required VERSION