<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    cmake 學習筆記(六)

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注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中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全