当前位置: 首页 > 知识库问答 >
问题:

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

岑和风
2023-03-14
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; }
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)
#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));
}
    null

共有1个答案

莘翰采
2023-03-14

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

对于问题3,这些命令添加了一个名为“mytest”的测试,它调用您的可执行文件“test”,而不带任何参数。但是,由于您已经将这些命令添加到test/cmakelists.txt,而不是顶级的cmakelists.txt,因此只能从构建树的“test”子目录中调用测试(trycd test&&ctest-n)。如果希望测试可以从顶层构建目录运行,则需要从顶层cmakelists.txt调用add_test。这也意味着您必须使用更详细的add_test形式,因为您的测试exe不是在相同的cmakelists.txt中定义的

在您的示例中,由于您在根文件夹中运行cmake,构建树和源树是同一棵树。这被称为源代码内构建,并不理想,这导致了问题4。

最后一点是避免调用可执行文件“test”(区分大小写)。原因,请看这个答案。

为了实现这些更改,我将执行以下操作:

cmakelists.txt:

cmake_minimum_required (VERSION 2.8)
project (TEST)
add_subdirectory (src) 
add_subdirectory (test)
enable_testing ()
add_test (NAME MyTest COMMAND Test)
add_library (Sqr sqr.cpp sqr.h)
add_executable (demo main.cpp)
target_link_libraries (demo Sqr)
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}
                       )
 类似资料:
  • 本文向大家介绍vue项目有做过单元测试吗?相关面试题,主要包含被问及vue项目有做过单元测试吗?时的应答技巧和注意事项,需要的朋友参考一下 https://github.com/Myh-cs/todolist-vue vue+vuex+vue-router+ts+vue-cli demo 实现todolist 并进行单元测试 vue vuex 与ts的结合部分还不是很友好 欢迎交流 附单测运行结果

  • 我正在使用Spring Boot进行多模块项目。我想编写一些单元测试来检查我的存储库,服务等。存储库代码是在公共项目上编写的,而公共项目在其他项目上使用。此项目不包含任何初学者应用。它只是由实体、存储库和服务组成。 我看到这个主题(如何使用Spring Boot测试Maven模块项目)关于类似的问题,但我没有设法成功地实现它来测试我的存储库。 当我启动测试时,EntityARepository会引

  • 运行单元测试时的例外情况是: 还有一个问题是,这是为了测试SampleRouter,还是只是单元测试process类和任何其他支持类?还是使用以下内容来更改它,以便将消息传递到假的直接队列?

  • 我一直在学习用C++中的Google测试进行单元测试。 如果单元测试的目的是确保代码的某些段或对象按照预期的方式工作,那么我认为没有必要在最终项目中编译和导出单元测试代码,对吗?反正用户也不会使用它。它似乎使项目的规模变得不必要的大。 我的主要问题是:所有的单元测试代码会随最终项目一起编译导出吗,还是在导出之前我必须手动删除所有的单元测试? 对于单元测试和导出项目,是否有一个最佳的(或通用的)实践

  • 问题内容: 该命令仅覆盖一个目录中的文件。 我想要整个项目,这意味着测试应覆盖dir中的所有文件以及该dir下的所有千岁树dir 。 这样做的命令是什么? 问题答案: 这应该在当前目录及其所有子目录中运行所有测试: 这应该针对给定的特定目录运行所有测试: 这应该以前缀为的导入路径运行所有测试: 这应该运行所有带有前缀的测试导入路径: 这应该在$ GOPATH中运行所有测试:

  • 本文向大家介绍spring项目实现单元测试过程解析,包括了spring项目实现单元测试过程解析的使用技巧和注意事项,需要的朋友参考一下 后台开发过程中,写单元测试是非常重要的,对于我们开发人员调试、排查问题是很方便的, 但是我们在启动项目的时候,需要将所以类交给spring托管,在单元测试中需要怎么实现类的注入呢? 直接上图 继续上代码 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家