cmake 学习笔记(六)
希望这是现阶段阻碍阅读shiboken和PySide源码的涉及cmake的最后一个障碍 ^ _^
学习 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中对其有不少介绍了(略)。
参考
from:http://blog.csdn.net/dbzhang800/article/details/6341803
cmake 学习笔记(六)的更多相关文章
- CMake学习笔记六-引用cmake文件
include(${CMAKE_CURRENT_SOURCE_DIR}/../Share/share.cmake)
- cmake学习笔记(五)
在cmake 学习笔记(三) 中简单学习了 find_package 的 model 模式,在cmake 学习笔记(四)中了解一个CMakeCache相关的东西.但靠这些知识还是不能看懂PySide使 ...
- cmake 学习笔记(三)
转自:http://blog.csdn.net/dbzhang800/article/details/6329314 接前面的 Cmake学习笔记(一) 与 Cmake学习笔记(二) 继续学习 cma ...
- cmake 学习笔记(二)
在 Cmake学习笔记一 中通过一串小例子简单学习了cmake 的使用方式. 这次应该简单看看语法和常用的命令了. 简单的语法 注释 # 我是注释 命令语法 COMMAND(参数1 参数2 ...) ...
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Typescript 学习笔记六:接口
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- cmake 学习笔记(三) (转)
接前面的 Cmake学习笔记(一) 与 Cmake学习笔记(二) 继续学习 cmake 的使用. 学习一下cmake的 finder. finder是神马东西? 当编译一个需要使用第三方库的软件时,我 ...
- python3.4学习笔记(六) 常用快捷键使用技巧,持续更新
python3.4学习笔记(六) 常用快捷键使用技巧,持续更新 安装IDLE后鼠标右键点击*.py 文件,可以看到Edit with IDLE 选择这个可以直接打开编辑器.IDLE默认不能显示行号,使 ...
随机推荐
- Javascript初级学习总结
首先,在Html页面输出,使用document.write('内容'); <html> <head> <title></title> <scrip ...
- SERVLET API 中 forward() 与 redirect()的区别?
答:前者仅是容器中控制权的转向, 在客户端浏览器地址栏中不会显示出转向后的地址: 后者则是完全的跳转, 浏览器将会得到跳转的地址, 并重新发送请求链接. 这样, 从浏览器的地址栏中可以看到跳转后的链接 ...
- Spring集成log4j日志管理
原文地址:http://blog.csdn.net/naruto1021/article/details/7969535 在使用Spring框架的时候,我们可以很方便的配置log4j来进行日志管理. ...
- 【转】 一个fork的面试题
转自:一个fork的面试题 前两天有人问了个关于Unix的fork()系统调用的面试题,这个题正好是我大约十年前找工作时某公司问我的一个题,我觉得比较有趣,写篇文章与大家分享一下.这个题是这样的: 题 ...
- WPF多线程下载文件,有进度条
//打开对话框选择文件 private void OpenDialogBox_Click(object sender, RoutedEventArgs e) { ...
- SIF与CIF
SIF 动态图像专家组(MPEG)在1992年推出的MPEG-1标准中首次定义了SIF(Source Input Format,源输入格式).CCIR 601标准(现改为ITU-R BT.601标准) ...
- 关于block 用法
Block Apple 在C, Objective-C, C++加上Block這個延申用法.目前只有Mac 10.6 和iOS 4有支援.Block是由一堆可執行的程式組成,也可以稱做沒有名字的Fu ...
- 使用CarrierWave上传图片时,多版本文件名的统一
第一次使用CarrierWavewe做上传,不能不说,虽然Rails已经把上传变得超简单了,而CarrierWave则是把上传变成了一种享受,特别是做图片上传,现在这年代,图片展示平台已经不仅仅是电脑 ...
- 帝国cms7.0忘记后台管理账户用户名密码
最近刚登陆以前的网站,但是发现自己的后台管理用户名密码已经忘记,于是到帝国cms论坛里面找了一下解决方案,成功解决问题.特此分享一下解决成功经验. 原帖地址:http://bbs.phome.net/ ...
- w3c标准的selection对象介绍
简介 术语 属性 方法 document.activeElement document.designMode = 'on'; 简介 selection是对当前激活选中区(即高亮文本)进行操作. 在非I ...