如何将 QML 单元测试添加到 Qt Creator (cmake) 中生成的 QML 模块可执行文件

问题描述 投票:0回答:1

我正在努力将 QML 单元测试添加到 Qt Creator 中生成的 Qt Quick 应用程序中。

我已经在 Qt Creator 中生成了一个 Qt Quick 应用程序,其中包含以下 CMakeLists.txt (Qt 6.6)

cmake_minimum_required(VERSION 3.16)

project(QuickApp VERSION 0.1 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Qt6 6.5 REQUIRED COMPONENTS Quick)

qt_standard_project_setup(REQUIRES 6.5)

qt_add_executable(appQuickApp
    main.cpp
)

qt_add_qml_module(appQuickApp
    URI QuickApp
    VERSION 1.0
    QML_FILES Main.qml
)

# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1.
# If you are developing for iOS or macOS you should consider setting an
# explicit, fixed bundle identifier manually though.
set_target_properties(appQuickApp PROPERTIES
#    MACOSX_BUNDLE_GUI_IDENTIFIER com.example.appQuickApp
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
    MACOSX_BUNDLE TRUE
    WIN32_EXECUTABLE TRUE
)

target_link_libraries(appQuickApp
    PRIVATE Qt6::Quick
)

include(GNUInstallDirs)
install(TARGETS appQuickApp
    BUNDLE DESTINATION .
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

我添加了以下内容:

add_executable(appQuickAppTest
  tst_main.cpp
  tst_main.qml
)
target_compile_definitions(appQuickAppTest PRIVATE
  -DQUICK_TEST_SOURCE_DIR="${CMAKE_SOURCE_DIR}"
)
target_link_libraries(appQuickAppTest
  PRIVATE Qt6::QuickTest Qt6::Quick
)
//tst_main.cpp
#include <QtQuickTest/quicktest.h>
QUICK_TEST_MAIN(QuickAppTest)
//tst_main.qml
import QtQuick
import QtTest
import QuickApp

Main {
  width: 400
  height: 400

  TestCase {
    name: "MainTest"
    when: windowShown

    function test_show() {
      wait(1000000)
    }
  }
}

尝试从 Qt Creator 运行

appQuickAppTest
目标时,无法导入 QuickApp 模块

QWARN  : QuickAppTest::tst_main::compile() 
  /Users/qwqqqw/dev/QuickApp/tst_main.qml produced 2 error(s):
    /Users/qwqqqw/dev/QuickApp/tst_main.qml:5,1: Type Main unavailable
    qrc:/qt/qml/QuickApp/Main.qml: No such file or directory
  Working directory: /Users/qwqqqw/dev/build-QuickApp-Qt_6_6_1_for_macOS-Debug
  Import paths:
    '/Users/qwqqqw/dev/build-QuickApp-Qt_6_6_1_for_macOS-Debug'
    'qrc:/qt-project.org/imports'
    'qrc:/qt/qml'
    '/Users/qwqqqw/dev/Qt/6.6.1/macos/qml'
  Plugin paths:
    '.'

FAIL!  : QuickAppTest::tst_main::compile() Type Main unavailable

我认为问题在于 QML 模块和可执行文件是单个目标。 请参阅此处:可作为 QML 模块执行

https://doc.qt.io/qt-6/qt-add-qml-module.html

但也许还有办法让它以某种方式发挥作用? 有没有更简单的方法将 QML 单元测试添加到 Qt Creator 生成的项目中?

qt cmake qml
1个回答
0
投票

我将测试放在应用程序下的子目录中......所以例如应用程序名称/test/tst_tests.qml

然后测试就有了自己的

CMakeLists.txt
。主要部件有:

...
// include the application parts
include_directories(../../AppName)

// create the test app
file(GLOB QML_SOURCES RELATIV ${CMAKE_CURRENT_SOURCE_DIR} tst_*.qml)
source_group("Test Files" FILES ${QML_SOURCES})
add_executable(AppNameTests main.cpp
           setup.cpp setup.h ${QML_SOURCES})

// link the app
target_link_libraries(AppNameTests
                  PRIVATE Qt${QT_VERSION_MAJOR}::QuickTest
                  PRIVATE Qt${QT_VERSION_MAJOR}::Qml
                  PRIVATE Qt6::Quick
                  PRIVATE Qt6::QuickControls2
                  PRIVATE AppName)

...

在主应用程序中,您包含此目录:

...

set(MY_UNITTESTS TRUE)
enable_testing()

...

if(${MY_UNITTESTS})
    add_subdirectory(tests/)    
endif()

...

最终构建后,您将获得用于测试的可执行文件。

© www.soinside.com 2019 - 2024. All rights reserved.