cmake 學習筆記(六)
睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接
希望這是現階段阻礙閱讀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
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成