文档章节

(小记)cmake:六

follitude
 follitude
发布于 2017/05/25 14:37
字数 602
阅读 8
收藏 0

学习 cmake 的单元测试部分 ctest。

简单使用

最简单的使用ctest的方法,就是在 CMakeLists.txt 添加命令:

enable_testing()
  • 该命令需要在源码的根目录文件内。

从这一刻起,就可以在工程中添加add_test命令了

add_test(NAME <name> [CONFIGURATIONS [Debug|Release|...]]
           [WORKING_DIRECTORY dir]
           COMMAND <command> [arg1 [arg2 ...]])
  • name 指定一个名字
  • Debug|Release 控制那种配置下生效
  • dir 设置工作目录
  • command
    • 如果是可执行程序目标,则会被cmake替换成生成的程序的全路径
    • 后面的参数可以使用 $<...> 这种语法,比如 $<TARGET_FILE:tgt> 指代tgt这个目标的全名

ApiExtractor

继续以 ApiExtractor 为例学习ctest的使用

顶层的CMakeLists.txt文件的内容片段:

option(BUILD_TESTS "Build tests." TRUE)
if (BUILD_TESTS)
    enable_testing()
    add_subdirectory(tests)
endif()

创建选项,让用户控制是否启用单元测试。如果启用,则添加进 tests 子目录,我们看其CMakeLists.txt文件

  • 首先是创建一个declare_test的宏
    • 使用 qt4_automoc 进行moc处理
    • 生成可执行文件
    • 调用 add_test 加入测试
macro(declare_test testname)
    qt4_automoc("${testname}.cpp")
    add_executable(${testname} "${testname}.cpp")
    include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${apiextractor_SOURCE_DIR})
    target_link_libraries(${testname} ${QT_QTTEST_LIBRARY} ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} apiextractor)
    add_test(${testname} ${testname})
endmacro(declare_test testname)
  • 后续就简单了,需要的配置文件直接使用configure_file 的 COPYONLY
declare_test(testabstractmetaclass)
declare_test(testabstractmetatype)
declare_test(testaddfunction)
declare_test(testarrayargument)
declare_test(testcodeinjection)
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/utf8code.txt"
                "${CMAKE_CURRENT_BINARY_DIR}/utf8code.txt" COPYONLY)
declare_test(testcontainer)

Qt单元测试

QTestLib 模块用起来还是很简单的,我们这儿稍微一下cmake和qmake的一点不同。

  • 使用qmake时,我们只需要一个源文件,比如测试 QString 类时,写一个 testqstring.cpp 文件
#include <QtTest/QtTest>

 class TestQString: public QObject
 {
     Q_OBJECT
 private slots:
     void toUpper();
 };

 void TestQString::toUpper()
 {
     QString str = "Hello";
     QCOMPARE(str.toUpper(), QString("HELLO"));
 }

 QTEST_MAIN(TestQString)
 #include "testqstring.moc"

然后pro文件内启用 testlib 模块,其他和普通Qt程序一样了。

  • 使用 cmake 时,我们将其分成两个文件
//testqstring.h
 #include <QtTest/QtTest>

 class TestQString: public QObject
 {
     Q_OBJECT
 private slots:
     void toUpper();
 };

//testqstring.cpp
 void TestQString::toUpper()
 {
     QString str = "Hello";
     QCOMPARE(str.toUpper(), QString("HELLO"));
 }

 QTEST_MAIN(TestQString)
 #include "testqstring.moc"

然后处理方式就是我们前面看到的那个宏了。

QTest宏

随便看下QTest的宏

  • QTEST_APPLESS_MAIN
  • QTEST_NOOP_MAIN
  • QTEST_MAIN
#define QTEST_APPLESS_MAIN(TestObject) /
int main(int argc, char *argv[]) /
{ /
    TestObject tc; /
    return QTest::qExec(&tc, argc, argv); /
}

#define QTEST_NOOP_MAIN /
int main(int argc, char *argv[]) /
{ /
    QObject tc; /
    return QTest::qExec(&tc, argc, argv); /
}

#define QTEST_MAIN(TestObject) /
int main(int argc, char *argv[]) /
{ /
    QCoreApplication app(argc, argv); /
    TestObject tc; /
    return QTest::qExec(&tc, argc, argv); /
}

最终都是调用QTest::qExec,Manual中对其有不少介绍了(略)。

参考

 

本文转载自:http://blog.csdn.net/dbzhang800/article/details/6341803

共有 人打赏支持
follitude
粉丝 6
博文 118
码字总数 4956
作品 0
浦东
私信 提问
MYSQL 源码安装 root 用户

题记: MYSQL 也安装了很多次,每次找上次安装的脚本,都是无头苍蝇,遂记此文。 此文参考了 http://www.cnblogs.com/fly1988happy/archive/2011/11/21/2257682.html 文中每个步骤都是边装边...

tacg
2015/06/25
0
0
CentOS下编译安装MySQL5.5.x的版本需使用Cmake编译器

PS:在以往的工作中,公司线上的服务器90%都使用MySQL数据库,性能也相当的稳定;所以一直都在用MySQL5.0.x、5.1.x、5.2.x之间的版本,前天朋友突然问我使用过Mysql5.5.X版本的没有,才发现源...

晨风微凉
06/28
0
0
安装MySQL5.5时常见错误--缺失make

首先我这是一台CentOS release 6.2 (Final),新安装的系统,没有任何软件及库文件。安装mysql5.5之前,先需要大概了解一下,需要注意的信息,mysql5.5的安装与其它版本不同的是编译安装时,需...

SANSOM
2013/08/28
0
0
MySQL 安装 CMake Error CMAKE_CXX_COMPILER not set

新装的机器Gnome-Ubuntu-13.10,编译安装mysql-5.6.14.tar.gz 命令 cmake -DCMAKEINSTALLPREFIX=/usr/local/database/mysql5.6 -DSYSCONFDIR=/usr/local/database/mysql5.6/etc -DMYSQLDATAD......

白凡
2013/11/18
0
0
part01_Linux下使用Cmake构建工程

一、安装Cmake 1.下载cmake-3.11.1.tar.gz:https://cmake.org/download/ 2.把 cmake-3.11.1.tar.gz放到任意临时目录(Cmake默认安装在:/usr/local/中),查看其权限如果没有权限直接更改权限...

IT魔幻师
05/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

RabbitMQ+PHP 教程三(Publish/Subscribe)用yii2测试通过

介绍 在前面的教程中,我们创建了一个工作队列。工作队列背后的假设是每个任务都交付给一个工作人员处理。在这一部分中,我们将做一些完全不同的事情——我们将向多个消费者发送消息。此模式...

hansonwong
24分钟前
2
0
关于JAVA你必须知道的那些事(四):单例模式和多态

好吧,今天一定要把面向对象的最后一个特性:多态,给说完。不过我们先来聊一聊设计模式,因为它很重要。 设计模式 官方的解释是,设计模式是:一套被反复使用,多数人知晓的,经过分类编目,...

拾光TM
25分钟前
1
0
ES6 系列之 Babel 是如何编译 Class 的(下)

摘要: ## 前言 在上一篇 [《 ES6 系列 Babel 是如何编译 Class 的(上)》](https://github.com/mqyqingfeng/Blog/issues/105),我们知道了 Babel 是如何编译 Class 的,这篇我们学习 Babel ...

阿里云官方博客
26分钟前
1
0
附实例!实现iframe父窗体与子窗体的通信

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由前端林子发表于云+社区专栏 本文主要会介绍如何基于MessengerJS,实现iframe父窗体与子窗体间的通信,传递数据信息。同时本...

腾讯云加社区
32分钟前
1
0
JSP页面传List集合到Action中

1:JSP页面(前端用的是H-UI框架) <div class="codeView docs-example"> <table class="table table-border table-bordered table-striped"> <thead> ......

uug
35分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部