Qt Quick Test

简介

Qt Quick Test 是为 QML 应用程序提供的单元测试框架。测试用例以 TestCase 类型中的 JavaScript 函数的形式编写。

import QtQuick 2.3
import QtTest 1.0

TestCase {
    name: "MathTests"

    function test_math() {
        compare(2 + 2, 4, "2 + 2 = 4")
    }

    function test_fail() {
        compare(2 + 2, 5, "2 + 2 = 5")
    }
}

名字以 test_ 开头的函数被视为待执行的测试用例。有关编写测试用例的更多信息,请参阅 TestCaseSignalSpy 类型的文档。

注意:对 Qt Quick Test 模块没有二进制兼容性保证。这意味着使用 Qt Quick Test 的应用程序仅保证与它开发的 Qt 版本兼容。然而,源代码兼容性是有保证的。

使用模块

QML API

通过 QtTest 导入使用 Qt Quick Test 中的 QML 类型。要使用这些类型,请将以下导入语句添加到您的 .qml 文件中

import QtTest

C++ API

使用 C++ API 需要链接到模块库,无论是直接还是通过其他依赖项。几个构建工具都对此有专门的支持,包括 CMakeqmake

使用 CMake 构建

使用 find_package() 命令查找 Qt6 包中所需的模块组件

find_package(Qt6 REQUIRED COMPONENTS QuickTest)
target_link_libraries(mytarget PRIVATE Qt6::QuickTest)

另请参阅使用 CMake 构建概述。

使用 qmake 构建

有两种方法可以将相应的 C++ 库链接起来。如果您的测试项目使用 QML TestCase,则您应该在项目文件中已经有以下行

CONFIG += qmltestcase

这将导致测试链接到 C++ QtQuickTest 库。

如果您有一个仅使用 C++ 的测试项目,可以添加以下行到您的项目文件

QT += qmltest

运行测试

由以下代码组成的 C++ 兜架启动测试用例

#include <QtQuickTest>
QUICK_TEST_MAIN(example)

其中 "example" 是用于唯一标识此组测试的标识符。

使用您最喜欢的生成器配置您的 CMakeLists.txt 文件并构建您的项目。

cmake_minimum_required(VERSION 3.2)

project(tst_example LANGUAGES CXX)

enable_testing()

find_package(Qt6 REQUIRED COMPONENTS QuickTest Qml)

#[[The test harness scans the specified source directory recursively
for "tst_*.qml" files. By default, it looks in the current directory,
which is usually where the executable is. This command makes it look
in the project's source directory instead.]]
add_definitions(-DQUICK_TEST_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}")

qt_standard_project_setup(REQUIRES 6.6)

add_executable(tst_example tst_example.cpp)

add_test(NAME tst_example COMMAND tst_example)

target_link_libraries(tst_example
    PRIVATE
    Qt6::QuickTest
    Qt6::Qml
)

CONFIG += qmltestcase 添加到您的项目文件

TEMPLATE = app
TARGET = tst_example
CONFIG += warn_on qmltestcase
SOURCES += tst_example.cpp

如果 .pro 文件中指定了 IMPORTPATH,则当使用 "make check" 运行测试时,将自动传递为命令行参数添加到 IMPORTPATH 中的每个导入路径。

IMPORTPATH += $$PWD/../imports/my_module1 $$PWD/../imports/my_module2

测试工具会对指定的源目录递归地进行“tst_*.qml”文件搜索。如果没有定义QUICK_TEST_SOURCE_DIR,则在工具运行时当前目录将被搜索。测试还可能使用其他*.qml文件作为辅助QML组件。

可以在运行时设置-input命令行选项来从不同的目录运行测试用例。在编译的目录名指向主机时,当在目标设备上运行测试时可能需要这样做。例如

tst_example -input /mnt/SDCard/qmltests

也可以使用-input选项单独运行一个文件。例如

tst_example -input data/test.qml
tst_example -input <full_path>/test.qml

注意: 指定qml测试文件的完整路径例如在影子构建中需要。

如果测试用例需要导入QML,那么可以将它们作为-import选项添加到测试程序的命令行中。

-functions命令行选项会返回当前测试的所有函数列表。可以使用测试函数的名称作为参数来运行单个测试函数。例如

tst_example Test_Name::function1

-help命令行选项会返回所有可用的选项。

tst_example -help

注意: 即使在测试代码不涉及任何Quick UI的情况下,运行Qt Quick测试用例也总是会在屏幕上显示一个窗口。为了避免这种情况,请在具有-platform offscreen的测试可执行文件上运行测试。

在QML测试前执行C++

要在运行任何QML测试之前执行C++代码,可以使用QUICK_TEST_MAIN_WITH_SETUP宏。这可以用于设置QML引擎的上下文属性,以及其他之类的功能。

这个宏与QUICK_TEST_MAIN相同,但是它还包含一个额外的类型参数。测试框架将调用具有以下名称的槽和可调用函数:

名称用途
void applicationAvailable()在QApplication对象实例化之后立即调用。使用此函数执行不需要QQmlEngine实例的设置。Qt 5.12
void qmlEngineAvailable(QQmlEngine *)当QML引擎可用时调用。到此时,任何导入路径、插件路径和额外的文件选择器都将被设置在引擎上。

此函数对每个QML测试文件调用一次,因此任何参数对该测试都是唯一的。这意味着每个QML测试文件都有自己的QML引擎。

此函数可以用于注册QML类型和添加导入路径,以及其他之类的功能。

Qt 5.11
void cleanupTestCase()在测试执行完成之后立即调用。使用此函数在开始销毁所有内容之前进行清理。Qt 5.12

以下示例演示了如何使用这个宏在QML引擎上设置上下文属性:

// src_qmltest_qquicktest.cpp
#include <QtQuickTest>
#include <QQmlEngine>
#include <QQmlContext>
#include <QGuiApplication>

class Setup : public QObject
{
    Q_OBJECT

public:
    Setup() {}

public slots:
    void applicationAvailable()
    {
        // Initialization that only requires the QGuiApplication object to be available
    }

    void qmlEngineAvailable(QQmlEngine *engine)
    {
        // Initialization requiring the QQmlEngine to be constructed
        engine->rootContext()->setContextProperty("myContextProperty", QVariant(true));
    }

    void cleanupTestCase()
    {
        // Implement custom resource cleanup
    }
};

QUICK_TEST_MAIN_WITH_SETUP(mytest, Setup)

#include "src_qmltest_qquicktest.moc"

基于.cpp文件的文件名设置.moc包含。例如,在上面的示例中,.cpp文件的名称是src_qmltest_qquicktest.cpp。如果文件名为MyTest.cpp,则包含将如下:

#include "MyTest.moc"

参考

许可证

Qt Quick Tests可在商业许可下从Qt公司获取。此外,它还可在自由软件许可下获取。自Qt 5.4以来,这些自由的软件许可包括GNU Lesser General Public License,版本3GNU General Public License,版本2。有关更详细的信息,请参阅Qt许可证

© 2024 The Qt Company Ltd. 此处包含的文档贡献是各自所有者的版权。提供的文档受GNU自由文档许可证(版本1.3)条款的许可,由自由软件基金会发布。Qt及其 respective 标志是芬兰和其他国家的Qt公司有限公司的商标。所有其他商标都是各自所有者的财产。