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

时间: 2024-11-02 14:02:49

cmake 学习笔记(六)的相关文章

cmake 学习笔记(三)

转自:http://blog.csdn.net/dbzhang800/article/details/6329314 接前面的 Cmake学习笔记(一) 与 Cmake学习笔记(二) 继续学习 cmake 的使用. 学习一下cmake的 finder. finder是神马东西? 当编译一个需要使用第三方库的软件时,我们需要知道: 去哪儿找头文件 .h 对比GCC的 -I 参数 去哪儿找库文件 (.so/.dll/.lib/.dylib/...) 对比GCC的 -L 参数 需要链接的库文件的名字

kvm虚拟化学习笔记(六)之kvm虚拟机控制台登录配置

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://koumm.blog.51cto.com/703525/1290996 KVM虚拟化学习笔记系列文章列表 ---------------------------------------- kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51cto.com/703525/1288795 kvm虚拟化学习笔记(二)之linux kvm虚拟机安装 h

cmake学习笔记(五)

在cmake 学习笔记(三) 中简单学习了 find_package 的 model 模式,在cmake 学习笔记(四)中了解一个CMakeCache相关的东西.但靠这些知识还是不能看懂PySide使用CMakeLists文件,接下来继续学习find_package的 config 模式及package configure文件相关知识 find_package 的 config 模式 当CMakeLists.txt中使用find_package命令时,首先启用的是 module 模式: 按照 C

cmake 学习笔记(二)

在 Cmake学习笔记一 中通过一串小例子简单学习了cmake 的使用方式. 这次应该简单看看语法和常用的命令了. 简单的语法 注释 # 我是注释 命令语法 COMMAND(参数1 参数2 ...) 字符串列表 A;B;C # 分号分割或空格分隔的值 变量(字符串或字符串列表) set(Foo a b c) 设置变量 Foo command(${Foo}) 等价于 command(a b c) command("${Foo}") 等价于 command("a b c"

cmake 学习笔记(一)

最大的Qt4程序群(KDE4)采用cmake作为构建系统 Qt4的python绑定(pyside)采用了cmake作为构建系统 开源的图像处理库 opencv 采用cmake 作为构建系统 ... 看来不学习一下cmake是不行了,一点一点来吧,找个最简单的C程序,慢慢复杂化,试试看: 例子一 单个源文件 main.c 例子二 ==>分解成多个 main.c hello.h hello.c 例子三 ==>先生成一个静态库,链接该库 例子四 ==>将源文件放置到不同的目录 例子五 ==&g

cmake 学习笔记(四)

接前面的一二三,学习一下 CMakeCache.txt 相关的东西. CMakeCache.txt 可以将其想象成一个配置文件(在Unix环境下,我们可以认为它等价于传递给configure的参数). CMakeLists.txt 中通过 set(... CACHE ...) 设置的变量 CMakeLists.txt 中的 option() 提供的选项 CMakeLists.txt 中find_package() 等find命令引入变量 命令行 cmake . -D <var>:<typ

JSP学习笔记(六)-----在多个JSP页面之间传递参数

js|笔记|页面 1. 怎么在多个JSP页面之间进行参数传递?需要使用JSP的内置作用域对象session.利用它的两个方法setAttribute(),getAttribute()2. 下面的这个实例实现了把第一个JSP页面的参数传递给第三个页面的功能3. 代码如下:1.jsp<html><form method=get action=2.jsp>what's your name<input type=text name=username><input type

cmake学习笔记

CMake是干嘛的,我不详说.我只知道,我写一个程序要将多个文件组织起来并编译.从头写一个MakeFile太麻烦.CMake配置文件比MakeFile要简单很多. 从原理上讲,CMake只是在帮助我们自动生成MakeFile而己.我们编译程序还是要make一下的. 我写了一个简单的示例,内容我们不需要关心,只关心其文件结构就行了.如下: . |-- CMakeLists.txt |-- main.cpp `-- person     |-- CMakeLists.txt     |-- pers

【Alljoyn】 Alljoyn学习笔记六 Alljoyn基本概念

一.历史: Alljoyn是高通2011年推出的近距离P2P通讯技术,它为分布式应用程序在不同设备中提供了运行环境,特别是移动性.安全性和动态配置,支持Microsoft Windows.Linux.ios和Android等主流的操作系统平台,可以说AllJoyn是专门处理异构分布式系统中的难题而产生的,同时Alljoyn还是一项开源项目(项目地址http://www.alljoyn.org),按道理说应该很火才对, 因此高通在2013年12月份将该项目贡献了处理,并拉了一帮的大佬小弟(Linu