【Cmake】Ctest测试工具

article/2025/9/18 7:15:37

目录

前言

一、初识CTest

二、使用方法

三、完整的简单测试工程

附录

附录一 cmake命令

enable_testing

add_test


前言

原文:CTest - https://www.cnblogs.com/457220157-FTD/p/4139149.html

一、初识CTest

       CTest是CMake集成的一个测试工具,在使用CMakeLists.txt文件编译工程的时候,CTest会自动configure、build、test和展现测试结果

       CTest有两个模式:

  • 模式一: 使用CMake configure 和 build工程,在CMakeLists.txt文件中,使用特殊的命令取创建tests。CTest用来执行那些测试
  • 模式二: 使用CTest来执行一个script(这个script的语法必须和CMakeLists.txt相同),去控制整个程序的输出结果=

二、使用方法

  目前我们在工程中这样构建单元测试

project|--------include||--------src||-----------test|       |---CMakeLists.txt||--------CMakeLists.txt

  1. 在外面的CMakeLists.txt中我们这样写

cmake_minimum_required(VERSION 2.8)
project(test)#指定工程名
....
add_subdirectory(test)#递归进入test目录
enable_testing()#见附录1 可以开启项目的测试功能。一定要在根目录下的CMakeLists.txt中开启
add_test(NAME mytest COMMAND Test)#见附录1

  2. 在test/CMakeLists.txt中写你的测试需要的即可(可以如下面那样写)

三、完整的简单测试工程

include

//sqr.h#ifndef SQR_H_
#define SQR_H_double sqr(double);#endif

src  #我们的工程代码

//sqr.cpp#include "sqr.h"double sqr(double x) {return x * x;
}//main.cpp
int main()
{return 0;
}

test #Ctest的代码,测试我们的工程函数

//test.cpp
#include "sqr.h"
#define BOOST_TEST_MODULE SqrTests
#include <boost/test/unit_test.hpp>BOOST_AUTO_TEST_CASE(FailTest)
{BOOST_CHECK_EQUAL(5, sqr(2));
}BOOST_AUTO_TEST_CASE(PassTest)
{BOOST_CHECK_EQUAL(4, sqr(2));
}//CMakeLists.txt
find_package(Boost COMPONENTS system filesystem unit_test_framework REQUIRED)include_directories(include ${Boost_INCLUDE_DIRS}/boost)add_definitions(-DBOOST_TEST_DYN_LINK -g)
add_executable(Test test.cpp)target_link_libraries(Test sqr ${Boost_FILESYSTEM_LIBRARY}${Boost_SYSTEM_LIBRARY}${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})message(WARNING ${Boost_FILESYSTEM_LIBRARY})
message(WARNING ${Boost_SYSTEM_LIBRARY})
message(WARNING ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})

 CMakeLists.txt #test的CMakeLists

cmake_minimum_required(VERSION 2.8)
project(test)include_directories(include)
add_library(sqr STATIC src/sqr.cpp)add_executable(demo src/main.cpp)
target_link_libraries(demo sqr)add_subdirectory(test)
enable_testing()
add_test(NAME mytest COMMAND Test)

简单例子说明

通过在项目根目录下的CMakeLists.txt配置文件中添加

enable_testing()


可以开启项目的测试功能。一定要在根目录下的CMakeLists.txt中开启,不然执行make test时会报错。

随后项目的cmake配置文件中可以添加add_test指令

add_test(NAME <name> [CONFIGURATIONS [Debug|Release|...]]
           [WORKING_DIRECTORY dir]
           COMMAND <command> [arg1 [arg2 ...]])



其中通过NAME关键值指定本测试的名称,可以随意命名,
Debug/Release选项可以控制在不同的编译版本下是否进行测试。
通过WORKING_DIRECTORY可以设置工作路径,command表示可运行程序

比如:

ADD_TEST(NAME test1 COMMAND main)



你可以不对结果进行检查,但大多数情况下你都需要检查test1的输出结果,可以通过如下:

set_tests_properties(test1 PROPERTIES PASS_REGULAR_EXPRESSION "Hello Cmake")


运行cmake && make test结果如下:

Start 1: test1
1/1 Test #1: test1 ............................   Passed    0.00 sec

100% tests passed, 0 tests failed out of 1


如果失败的话,也会有提示

Start 1: test1
1/1 Test #1: test1 ............................***Failed  Required regular expression not found.Regex=[Hello
]  0.00 sec

0% tests passed, 1 tests failed out of 1
 

原文链接:https://blog.csdn.net/sun_ashe/article/details/104527591/

示例2

CMakeCTest简单示例 -https://wenku.baidu.com/view/12bb3c49bb4ae45c3b3567ec102de2bd9605de82.html

cmake命令之add_test和set_tests_properties使用案例

(摘自:https://blog.csdn.net/weixin_42108533/article/details/119220713)

add_test的命令形式如下

add_test(NAME <name> COMMAND <command> [<arg>...][CONFIGURATIONS <config>...][WORKING_DIRECTORY <dir>][COMMAND_EXPAND_LISTS])

set_tests_properties的命令形式如下

set_tests_properties(test1 [test2...] 
PROPERTIES prop1 value1 prop2 value2)

我见过的cmake工具测试的套路之一如下

  • 首先,启动测试 enable_testing()

(开启项目的测试功能。一定要在根目录下的CMakeLists.txt中开启,不然执行make test时会报错。)

  • 其次,add_test(...)
  • 接下来,set_tests_properties(...)

案例目录如下

├── build
├── CMakeLists.txt
└── main.cpp

main.cpp的内容如下

#include<stdlib.h>
#include<stdio.h>using namespace std;int sum(int a, int b)
{return a + b;
}int main(int argc, char *argv[])
{if(3 == argc){cout << "parameter right" << endl;cout << sum(atoi(argv[1]), atoi(argv[2])) << endl;}else{cout << "input num err" << endl;return -1;}return 0;
}

CMakeLists.txt的内容如下

#最小版本说明
CMAKE_MINIMUM_REQUIRED(VERSION 3.10)#项目信息
PROJECT(main)#生成可执行文件
ADD_EXECUTABLE(main main.cpp)#使能测试
enable_testing()#添加测试
add_test(demo_test main 2 3)#设定测试特性
set_tests_properties(demo_test PROPERTIES PASS_REGULAR_EXPRESSION "5")

build是编译目录,方便编译出错时,清除生成的缓存文件

cd build  //进入编译目录
cmake ..   //编译主目录的CMakeLists.txt
make        //编译生成的MakeFile.txt
make test   //执行CMakeLists.txt里的测试

执行结果如下图所示

参考文献如下

cmake的帮助文档的网址

CMake Reference Documentation — CMake 3.21.7 Documentation

附录

附录一 cmake命令

enable_testing

可以开启项目的测试功能。

一定要在根目录下的CMakeLists.txt中开启,不然执行make test时会报错。

添加对TestingDashboard的支持
在之前已经定义了项目对测Test的支持,现在只需要将那些Test上传到Dashboard。
在上层CMakeLists.txt中将

# enable testing
enable_testing()

替换成

# enable dashboard scripting
include(CTest)


CTest模块将自动调用enable_testing().
创建CTestConfig.cmake在上层目录中,在cmake文件中,我们可以声明项目的名字和上传到的地址。在cmake文件中,添加如下内容:

set(CTEST_PROJECT_NAME "CMakeTutorial")
set(CTEST_NIGHTLY_START_TIME "00:00:00 EST")

set(CTEST_DROP_METHOD "http")
set(CTEST_DROP_SITE "my.cdash.org")
set(CTEST_DROP_LOCATION "/submit.php?project=CMakeTutorial")
set(CTEST_DROP_SITE_CDASH TRUE)


当ctest运行时将读取这个文件。

cmake完成之后,运行以下指令将测试上传到Dashboard:

ctest [-VV] -D Experimental


利用-C选项设置生成器:

ctest [-VV] -C Debug -D Experimental



可以在https://my.cdash.org/index.php?project=CMakeTutorial.查看测试结果。
原文链接:https://blog.csdn.net/xu_yun_huan_yue/article/details/120155307

add_test

该命令将目标(或自定义命令)添加到CTest。因此,当您在build目录中执行ctest时,所有添加的测试都会执行。如果您不想使用CTest,而只是手动执行测试二进制文件,那么就没有必要使用add_test

在较大的项目中,测试通常由几个二进制文件组成,使用单个命令执行所有测试会更方便(特别是当您的构建管道是自动化的时候)。

CMake的CTest方法

摘自:http://t.csdn.cn/pIiJW

PART 1:

参考:http://hahack.com/codes/cmake/


Demo目录结构如下:

Test/
├── add.cpp
└── CMakeLists.txt

add.cpp
#include <iostream>
#include <stdlib.h>
int main(int argc, char *argv[])
{
    if (argc != 3) {
        std::cout << "parameter error" << std::endl;
        return -1; 
    }   
 
    int a, b;
    a = atoi(argv[1]);
    b = atoi(argv[2]);
    std::cout << a << " + " << b << " is " << a + b << std::endl;
    return 0;
}

CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 3.3)
ADD_EXECUTABLE(add add.cpp)
enable_testing()
ADD_TEST(NAME test_add_2_3 COMMAND add 2 3)
SET_TESTS_PROPERTIES(test_add_2_3
    PROPERTIES PASS_REGULAR_EXPRESSION "5")
ADD_TEST(NAME test_add_4_5 COMMAND add 4 5)
SET_TESTS_PROPERTIES(test_add_4_5
    PROPERTIES PASS_REGULAR_EXPRESSION "9")
在CMakeLists.txt里面,我们添加了两个测试用例。其中 PASS_REGULAR_EXPRESSION 用来测试输出是否包含后面的字符串。
在Test目录下建立build目录,cd build && cmake .., make, make test, 结果如下:

huyanjie@debian:~/test/Test/build$ make test
Running tests...
Test project /home/huyanjie/test/Test/build
    Start 1: test_add_2_3
1/2 Test #1: test_add_2_3 .....................   Passed    0.00 sec
    Start 2: test_add_4_5
2/2 Test #2: test_add_4_5 .....................   Passed    0.00 sec
 
100% tests passed, 0 tests failed out of 2
 
Total Test time (real) =   0.01 sec
可以看到两个用例都正确执行了。
像上面的方式写测试用例还是比较繁琐,还可以定义宏来简化:

CMAKE_MINIMUM_REQUIRED(VERSION 3.3)
ADD_EXECUTABLE(add add.cpp)
enable_testing()
 
macro(do_test ARG1 ARG2 RESULT)
    ADD_TEST(NAME test_add_${ARG1}_${ARG2} COMMAND add ${ARG1} ${ARG2})
    SET_TESTS_PROPERTIES(test_add_${ARG1}_${ARG2}
        PROPERTIES PASS_REGULAR_EXPRESSION ${RESULT})
endmacro(do_test)
do_test(2 3 5)
do_test(4 5 9)
PART 2:

CPPUNIT使用如下:

参考http://blog.csdn.net/freefalcon/article/details/753819

#include <cppunit/TestResult.h>
#include <cppunit/TestResultCollector.h>
#include <cppunit/TextOutputter.h>
#include <cppunit/TestRunner.h>
#include <cppunit/extensions/HelperMacros.h>
 
class StringTest : public CppUnit::TestFixture
{
    CPPUNIT_TEST_SUITE(StringTest);
    CPPUNIT_TEST(testSwap);
    CPPUNIT_TEST(testFind);
    CPPUNIT_TEST_SUITE_END();
public:
    void setUp()
    {   
        m_str1 = "Hello, world";
        m_str2 = "Hi, cppunit";
    }   
    void tearDown()
    {   
 
    }   
    void testSwap()
    {   
        std::string str1 = m_str1;
        std::string str2 = m_str2;
        m_str1.swap(m_str2);
        CPPUNIT_ASSERT(m_str1 == str2);
        CPPUNIT_ASSERT(m_str2 == str2);
    }   
    void testFind()
    {   
        int pos1 = m_str1.find(',');
        int pos2 = m_str2.rfind(',');
        CPPUNIT_ASSERT_EQUAL(5, pos1);
        CPPUNIT_ASSERT_EQUAL(2, pos2);
    }   
protected:
    std::string m_str1;
    std::string m_str2;
};
 
CPPUNIT_TEST_SUITE_REGISTRATION(StringTest);
int main(int argc, char *argv[])
{
    CppUnit::TestResult r;
    CppUnit::TestResultCollector rc;
    r.addListener(&rc);
 
    CppUnit::TestRunner runner;
    runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
    runner.run(r);
 
    CppUnit::TextOutputter o(&rc, std::cout);
    o.write();
 
    return rc.wasSuccessful()?0:-1;
}
PART 3

CMake 结合CPPUnit


原文链接:https://blog.csdn.net/huyanjie0327/article/details/46652313


http://chatgpt.dhexx.cn/article/kvCLRqMp.shtml

相关文章

软件测试常见面试题

1、软件的含义 程序、数据以及相关文档的集合。 2、测试与调试的区别是什么&#xff1f; 测试是测试人员进行&#xff0c;主要目标是发现、报告、跟踪缺陷&#xff1b; 调试是开发人员进行&#xff0c;主要目标是定位缺陷位置、分析缺陷原因、修复缺陷。 3、IEEE是什么意思…

Web服务稳定性测试 负载测试 可靠性测试 方案 测试报告

注&#xff1a; 1. 程序员做的测试 2. 测试报告文档原稿在上传审核中&#xff0c;请等待 审核好了&#xff1a;https://download.csdn.net/download/yiquan_yang/12694138 1 概述 1.1 背景 系统的稳定性是系统长期稳定运行能力&#xff0c;需要时间累积才能度量。平台的某些问…

NFC测试

NFC功能点介绍&#xff1a; NFC英文全称Near Field Communication&#xff0c;近距离无线通信。 NFC采用主动和被动两种读取模式&#xff0c;NFC应用模式分为三种&#xff1a; 1、NFC卡模式&#xff08;被读模式&#xff0c;手机终端可以模拟成为一张普通的非接触卡被pos机读取…

Python 接口并发测试详解

一、接口并发测试简介 1、性能测试简介 性能测试是通过自动化测试工具模拟多种正常、峰值及异常负载条件对系统的各项性能指标进行的测试。负载测试和压力测试都属于性能测试,两者可以结合进行。通过负载测试,确定在各种工作负载下系统的性能,目标是测试当负载逐渐增加时,…

jmeter测试工具

文章目录 参考文章jmeter接口验签tomcat最大连接数jmeter参数彻底理解jmeter的ramp-up参数总结说明 持续时间的使用场景彻底理解ramp up2循环次数ramp-up线程数循环次数&#xff08;永远&#xff09;持续时间同步器里面的Timeout in milliseconds参数线程组参数 版本缺陷记录jm…

点餐系统测试

一、设计测试用例 二、提交BUG a)BUG 一 标题:兼容性差&#xff0c;只能在Chrome浏览器和火狐浏览器上使用 1.版本号&#xff1a;V0009 2.测试环境&#xff1a;Chrome 浏览器 版本号 96.0.4664.45 火狐 浏览器 版本号 97.0.1 操作系统&#xff1a;win10 3.测试数据…

接口 测试

一.接口概念 1.什么是接口(API) 接口:接口是为了提供一种服务 所有的接口统称为API,接口分为内部接口和外部接口 外部接口:测试被测系统和外部系统之间的接口 测试内部接口: 1.内部接口提供内部系统使用:开发人员自己开发的对自身系统提供的接口) 2.内部接口提供外部系统使用:…

Visual Studio 2017 15.8 正式发布,测试速度提高 82%

Visual Studio 2017 15.8 版本已正式发布&#xff1a; 发行说明&#xff1a;https://docs.microsoft.com/zh-cn/visualstudio/releasenotes/vs2017-relnotes#15.8下载地址&#xff1a;https://visualstudio.microsoft.com/downloads/ 安装 现可选择在开始安装之前下载所有安装文…

跟LintCode的算法题杠上了(82落单的数)

前言 今天闲来无事准备刷个算法题&#xff0c;缓解一下办公室尴尬的气氛&#xff0c;放松一下&#xff0c;谁知我竟然跟这题杠上了&#xff0c;我必须得好好研究一下&#xff0c;哈哈 题目 点击进入lintcode&#xff0c;第82题落单的数 给出 2 * n 1个数字&#xff0c;除其…

扫码登陆

一个扫码登录的流程图记录一下

PC网站实现微信扫码登录功能(二)

上篇我们介绍了怎么申请账号以及最后拿到appId和appSecret,如果有不清楚的可以看一下 PC网站实现微信扫码登录功能&#xff08;一&#xff09; 下面我就来说一下怎样在PC端怎么实现扫码登录功能。 一、进入官方文档网站 准备工作 | 微信开放文档 其实官网对过程描述的已经…

微信扫描二维码快速登录网站

在近期的一个项目中用到了微信扫描注册、登录网站功能所以整理了下希望对读者有帮助。 首先&#xff0c;你需要有一个没有绑定微信、微信公众平台的邮箱注册成为微信开放平台开发者&#xff0c;在管理中心创建移动应用、或者网站应用获得appid和AppSecret&#xff0c;申请微信…

微信扫码登录功能实现

原因&#xff1a;很简单&#xff0c;公司的账号登录需要用到微信扫码登录与QQ的登录功能&#xff0c;所以&#xff0c;在做好了微信的扫码登录之后&#xff0c;本人就写这篇微信扫码登录功能实现的教程 教程开始 需要用到的网站&#xff1a; https://open.weixin.qq.com/ 微…

java扫码登录

这篇博文主要记录我实现扫码登录的步骤&#xff0c;及代码。其实之前从网上搜了很久扫码登录&#xff0c;copy版很多&#xff0c;所以回答也就那几种。 我把我自己的思路也说一下吧。如果有更好的意见或者我有不对的地方&#xff0c;请指出。 首先说一下我用的技术&#xff0…

微信公众号开发—扫描二维码实现登录方案

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; 微信公众号开发—扫描二维码实现登录方案 ⏱️ 创作时间&#xff1a; …

第三方登录之微信扫码登录

文章目录 1. 申请微信接入&#xff1a;2. 项目环境搭建&#xff1a;3.后端Controller接口&#xff1a;4.HTML页面代码&#xff1a;5.测试结果&#xff1a;6.补充说明&#xff1a; 小伙伴们有各种疑问可以去参考官方文档进行详细的学习下 微信开发文档 &#xff0c;此次介绍的将…

扫码登录操作过程

转载自http://justcoding.iteye.com/blog/2213661浏览器输入&#xff1a;https://wx.qq.com/?langzh_CN手机登录微信&#xff0c;利用“扫一扫”功能扫描网页上的二维码手机扫描成功后&#xff0c;提示“登录网页版微信”&#xff1b;网页上显示“成功扫描 请在手机点击确认以…

实现手机扫描二维码进行登录

项目结构&#xff1a; 实现流程&#xff1a; pc端&#xff1a; 1:打开二维码登录网页index.html 2:index.html调用GetQrCodeServlet 3:GetQrCodeServlet干2件事 a:生成随机的uuid,是一个唯一标识&#xff0c;该标识贯穿整个流程 b:生成二维码图片&#xff0c;二维码信息&#x…

扫码登录,背后是如何实现的?

引言 近年来&#xff0c;随着智能手机和移动支付的普及以及互联网应用的不断更新迭代&#xff0c;扫码登录已经成为了我们日常生活中非常普遍的登录方式。扫码登录能够迅速的成为我们各大网站常用的登录方式一定存在它的原因。 首先一个非常重要的原因&#xff0c;扫码登录还可…