您的位置:首页 > 其它

cmake 学习笔记(六)

2014-09-17 13:57 183 查看
希望这是现阶段阻碍阅读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中对其有不少介绍了(略)。

参考

http://www.itk.org/Wiki/CMake_Testing_With_CTest

http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:add_test

from:/article/1700005.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: