cmake 学习笔记(六)
2011-04-22 15:12
288 查看
希望这是现阶段阻碍阅读shiboken和PySide源码的涉及cmake的最后一个障碍 ^ _^
学习 cmake 的单元测试部分 ctest。
最简单的使用ctest的方法,就是在 CMakeLists.txt 添加命令:
该命令需要在源码的根目录文件内。
从这一刻起,就可以在工程中添加add_test命令了
name 指定一个名字
Debug|Release 控制那种配置下生效
dir 设置工作目录
command
如果是可执行程序目标,则会被cmake替换成生成的程序的全路径
后面的参数可以使用 $<...> 这种语法,比如 $<TARGET_FILE:tgt> 指代tgt这个目标的全名
继续以 ApiExtractor 为例学习ctest的使用
顶层的CMakeLists.txt文件的内容片段:
创建选项,让用户控制是否启用单元测试。如果启用,则添加进 tests 子目录,我们看其CMakeLists.txt文件
首先是创建一个declare_test的宏
使用 qt4_automoc 进行moc处理
生成可执行文件
调用 add_test 加入测试
后续就简单了,需要的配置文件直接使用configure_file 的 COPYONLY
QTestLib 模块用起来还是很简单的,我们这儿稍微一下cmake和qmake的一点不同。
使用qmake时,我们只需要一个源文件,比如测试 QString 类时,写一个 testqstring.cpp 文件
然后pro文件内启用 testlib 模块,其他和普通Qt程序一样了。
使用 cmake 时,我们将其分成两个文件
与
然后处理方式就是我们前面看到的那个宏了。
QTEST_APPLESS_MAIN
QTEST_NOOP_MAIN
QTEST_MAIN
最终都是调用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
学习 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_CTesthttp://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:add_test
相关文章推荐
- cmake学习笔记之add_library、target_link_libraries和link_directories
- cmake 学习笔记(一)
- cmake 学习笔记(二)
- cmake学习笔记
- CMake 学习笔记 —— 初见
- CMake 学习笔记 —— 进阶
- cmake 学习笔记(三)
- CMake学习笔记
- cmake学习笔记(五)
- cmake 学习笔记(一)
- 【Cmake学习笔记】编译安装
- cmake 学习笔记(一)
- cmake 学习笔记(一)
- cmake 学习笔记(二)
- cmake 学习笔记(三) (转)
- cmake学习笔记1--单文件编译(霜之小刀)
- cmake 学习笔记(四)
- cmake 学习笔记(一)
- cmake 学习笔记(一)
- cmake 学习笔记(一)