zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    显示和隐藏密码
    如何给input的右上角加个清除的按钮?
    手机号中间四位用*号代替
    利用JS+正则表达式获取URL的GET数据
    腾讯QQ头像/QQ网名等相关获取API接口
    jqurey 在编辑的时候为select设置选中项
    html面试题
    js splice和delete删除数组长度会变化吗
    webp与jpg、png比较,它有什么优劣势?如何选择?
    iOS开发技术之应用代码注入防护
  • 原文地址:https://www.cnblogs.com/lidabo/p/3976972.html
Copyright © 2011-2022 走看看