希望这是现阶段阻碍阅读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 学习笔记(六)的更多相关文章

  1. CMake学习笔记六-引用cmake文件

    include(${CMAKE_CURRENT_SOURCE_DIR}/../Share/share.cmake)

  2. cmake学习笔记(五)

    在cmake 学习笔记(三) 中简单学习了 find_package 的 model 模式,在cmake 学习笔记(四)中了解一个CMakeCache相关的东西.但靠这些知识还是不能看懂PySide使 ...

  3. cmake 学习笔记(三)

    转自:http://blog.csdn.net/dbzhang800/article/details/6329314 接前面的 Cmake学习笔记(一) 与 Cmake学习笔记(二) 继续学习 cma ...

  4. cmake 学习笔记(二)

    在 Cmake学习笔记一 中通过一串小例子简单学习了cmake 的使用方式. 这次应该简单看看语法和常用的命令了. 简单的语法 注释 # 我是注释 命令语法 COMMAND(参数1 参数2 ...) ...

  5. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  6. Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  7. Typescript 学习笔记六:接口

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  8. cmake 学习笔记(三) (转)

    接前面的 Cmake学习笔记(一) 与 Cmake学习笔记(二) 继续学习 cmake 的使用. 学习一下cmake的 finder. finder是神马东西? 当编译一个需要使用第三方库的软件时,我 ...

  9. python3.4学习笔记(六) 常用快捷键使用技巧,持续更新

    python3.4学习笔记(六) 常用快捷键使用技巧,持续更新 安装IDLE后鼠标右键点击*.py 文件,可以看到Edit with IDLE 选择这个可以直接打开编辑器.IDLE默认不能显示行号,使 ...

随机推荐

  1. asp.net 连接access数据库方法

    在 Web.Config 中配置 Access 数据库驱动和数据库文件名称. 请看代码 <appSettings> <add key="DBDriver" val ...

  2. 关于MVC EntityType has no key defined的问题

    关于MVC EntityType has no key defined的问题 在测试MVC时发现一个奇怪的问题,在Model中定义数据类时,如 public class UserInfo { publ ...

  3. DEV中gridview常用属性的设置

    1.隐藏最上面的GroupPanel: gridView1.OptionsView.ShowGroupPanel=false; 2.得到当前选定记录某字段的值: sValue=Table.Rows[g ...

  4. hdu 2815 Mod Tree 高次方程,n不为素数

    Accepted 406MS 8576K 2379 B C++/** 这里加了一点限制,,大体还是一样的,, **/ #include <iostream> #include <cs ...

  5. cocos2dx 随机函数

    cocos2dx 随机数  2.2.3版本 1.初始化时设定随机数种子,只需一次. time_t now = time(NULL); srand((unsigned int)now); 2.需要的时候 ...

  6. (Problem 42)Coded triangle numbers

    The nth term of the sequence of triangle numbers is given by, tn = ½n(n+1); so the first ten triangl ...

  7. The request failed with HTTP status 401: Unauthorized.

    Reporting Service 控件默认由IIS里面的应用程序池标识 里面所定义的用户连接,如果用户没有权限则报以下错误 The request failed with HTTP status 4 ...

  8. android天气查询(一)websevice之ksoap2软件包的使用

    对于用到天气信息,首先我想: 第一:数据不可能是我测得的,必须是网上的信息. 第二:网上的信息分为好多种,具体哪种比较好一点,这里我总结了两种. 第三:数据JSON怎么解析. 第四:如何提出数据与显示 ...

  9. JAVA GUI学习 - 总结

    一:项目 二:重要组件补充 三:组件高级操作

  10. HDU 1104 Remainder( BFS(广度优先搜索))

    Remainder Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...