我正在努力将 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 生成的项目中?
我将测试放在应用程序下的子目录中......所以例如应用程序名称/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()
...
最终构建后,您将获得用于测试的可执行文件。