TestCase QML 类型

表示一个单元测试用例。 更多信息...

导入语句import QtTest
继承

Item

属性

方法

详细描述

QML 测试用例简介

测试用例是以 TestCase 类型内嵌 JavaScript 函数的形式编写的。

import QtQuick 2.0
import QtTest 1.2

TestCase {
    name: "MathTests"

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

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

以 "test_" 开头的函数被视为要执行的测试用例。使用 name 属性作为输出函数的前缀。

********* Start testing of MathTests *********
Config: Using QTest library 4.7.2, Qt 4.7.2
PASS   : MathTests::initTestCase()
FAIL!  : MathTests::test_fail() 2 + 2 = 5
   Actual (): 4
   Expected (): 5
   Loc: [/home/.../tst_math.qml(12)]
PASS   : MathTests::test_math()
PASS   : MathTests::cleanupTestCase()
Totals: 3 passed, 1 failed, 0 skipped
********* Finished testing of MathTests *********

由于 JavaScript 属性的行为方式,测试函数的发现顺序是不可预测的。为了帮助提高可预测性,测试框架将函数按照名称的升序排序。这在有两个测试必须按顺序运行的情况下很有帮助。

可以提供多个 TestCase 类型。当所有测试用例都完成时,测试程序将退出。如果测试用例不需要运行(因为先决条件失败),则可以将 optional 设置为 true。

数据驱动测试

可以使用以 "_data" 结尾的函数名将表数据提供给测试。或者,可以使用 init_data() 函数为 TestCase 类型中的所有测试函数提供默认测试数据。

import QtQuick 2.0
import QtTest 1.2

TestCase {
    name: "DataTests"

    function init_data() {
      return [
           {tag:"init_data_1", a:1, b:2, answer: 3},
           {tag:"init_data_2", a:2, b:4, answer: 6}
      ];
    }

    function test_table_data() {
        return [
            {tag: "2 + 2 = 4", a: 2, b: 2, answer: 4 },
            {tag: "2 + 6 = 8", a: 2, b: 6, answer: 8 },
        ]
    }

    function test_table(data) {
        //data comes from test_table_data
        compare(data.a + data.b, data.answer)
    }

    function test__default_table(data) {
        //data comes from init_data
        compare(data.a + data.b, data.answer)
    }
}

测试框架将迭代表中的所有行,并将每一行传递给测试函数。如所示,可以将列提取出来在测试中使用。tag 列是特殊的 - 当行失败时,测试框架将其打印出来,帮助读者识别一组其他通过的测试中的哪个测试失败了。

基准测试

以 "benchmark_" 开头的函数将在 Qt 基准测试框架中运行多次,并报告运行的平均时间值。这相当于在 QTestLib 的 C++ 版本中使用 QBENCHMARK 宏。

TestCase {
    id: top
    name: "CreateBenchmark"

    function benchmark_create_component() {
        let component = Qt.createComponent("item.qml")
        let obj = component.createObject(top)
        obj.destroy()
        component.destroy()
    }
}

RESULT : CreateBenchmark::benchmark_create_component:
     0.23 msecs per iteration (total: 60, iterations: 256)
PASS   : CreateBenchmark::benchmark_create_component()

要获得 QBENCHMARK_ONCE 宏的效果,请在测试函数名称前加上 "benchmark_once_"。

模拟键盘和鼠标事件

可以使用 keyPress()、keyRelease() 和 keyClick() 方法在单元测试中模拟键盘事件。事件被传递到当前聚焦的 QML 元素。您可以通过传递 Qt.Key 枚举值或拉丁1 字符(长度为一的字符串)。

Rectangle {
    width: 50; height: 50
    focus: true

    TestCase {
        name: "KeyClick"
        when: windowShown

        function test_key_click() {
            keyClick(Qt.Key_Left)
            keyClick("a")
            ...
        }
    }
}

可以使用 mousePress()、mouseRelease()、mouseClick()、mouseDoubleClickSequence() 和 mouseMove() 方法以类似的方式在测试中模拟鼠标事件。

如果您的测试创建了其他窗口,这些窗口可能会成为激活窗口,从而从 TestCase 的窗口中夺取焦点。为确保 TestCase 的窗口是激活的,请使用以下代码:

testCase.Window.window.requestActivate()
tryCompare(testCase.Window.window, "active", true)

注意:键盘和鼠标事件只能在主窗口显示后传递。在那时之前尝试传递事件将失败。使用 `when` 和 `windowShown` 属性来跟踪主窗口何时显示。

管理动态创建的测试对象

QML 测试的典型模式是在测试函数结束时动态创建一个项目并销毁它。

TestCase {
    id: testCase
    name: "MyTest"
    when: windowShown

    function test_click() {
        let item = Qt.createQmlObject("import QtQuick 2.0; Item {}", testCase);
        verify(item);

        // Test item...

        item.destroy();
    }
}

这种模式的问题是,如果测试函数中发生任何错误,将会跳过对 item.destroy() 的调用,导致项目在场景中悬挂,直到测试案例结束。这可能会导致干扰后续测试;例如,通过阻塞输入事件或产生与代码执行无关的调试输出,使得代码执行难以跟踪。

通过调用 createTemporaryQmlObject() 来代替,可以保证对象在测试函数结束时被销毁。

TestCase {
    id: testCase
    name: "MyTest"
    when: windowShown

    function test_click() {
        let item = createTemporaryQmlObject("import QtQuick 2.0; Item {}", testCase);
        verify(item);

        // Test item...

        // Don't need to worry about destroying "item" here.
    }
}

对于通过 `Component` 的 createObject() 函数创建的对象,可以使用 createTemporaryObject() 函数。

将测试与应用程序逻辑分离

在大多数情况下,您会想将测试与应用程序逻辑分离,将它们拆分到不同的项目中并链接它们。

例如,您可以有以下项目结构

.
| — CMakeLists.txt
| - main.qml
| — src
    | — main.cpp
| — MyModule
    | — MyButton.qml
    | — CMakeLists.txt
| — tests
    | — tst_testqml.qml
    | — main.cpp
    | — setup.cpp
    | — setup.h

现在,要测试 MyModule/MyButton.qml,在 MyModule/CMakeLists.txt 中为 MyModule 创建库并将其链接到您的测试项目,tests/UnitQMLTests/CMakeLists.txt

    ...
qt_add_library(MyModule STATIC)

qt6_add_qml_module(MyModule
    URI MyModule
    QML_FILES MyButton.qml
)
    ...
#include <QtQuickTest/quicktest.h>
#include "setup.h"

QUICK_TEST_MAIN_WITH_SETUP(TestQML, Setup)
#include "setup.h"

void Setup::applicationAvailable()
{
    // custom code that doesn't require QQmlEngine
}

void Setup::qmlEngineAvailable(QQmlEngine *engine)
{
    // add import paths
}

void Setup::cleanupTestCase()
{
    // custom code to clean up before destruction starts
}
#ifndef SETUP_H
#define SETUP_H

#include <QObject>
#include <QQmlEngine>

class Setup : public QObject
{
    Q_OBJECT
public:
    Setup() = default;

public slots:
    void applicationAvailable();
    void qmlEngineAvailable(QQmlEngine *engine);
    void cleanupTestCase();
};

#endif // SETUP_H
    ...
add_subdirectory(MyModule)
add_subdirectory(tests)

qt_add_executable(MyApplication
    src/main.cpp
)

qt_add_qml_module(MyApplication
    URI MyApplication
    QML_FILES main.qml
)
    ...

然后,在 tests/tst_testqml.qml 中,您可以使用 MyModule/MyButton.qml

import QtQuick
import QtQuick.Controls

import QtTest
import MyModule

Item {
    width: 800
    height: 600

    MyButton {
        id: myButton
        anchors.centerIn: parent
    }

    TestCase {
        name: "MyButton"
        when: windowShown

        function test_clickToExpand() {
            const widthBeforeClick = myButton.width;
            mouseClick(myButton);
            const widthAfterClick = myButton.width;
            verify(widthBeforeClick < widthAfterClick);
        }
    }
}
import QtQuick
import QtQuick.Controls

Button {
    width: 50
    height: 50
    onClicked: width = 100
}

另请参阅SignalSpyQt Quick Test

属性说明

completed : bool

测试案例执行完成后,此属性将设置为 true。测试案例仅执行一次。初始值是 false。

另请参阅runningwhen


name : string

此属性定义测试案例的名称以供结果报告使用。默认值是空字符串。

TestCase {
    name: "ButtonTests"
    ...
}

optional : bool

测试应用中可以提供多种测试用例类型。当所有测试用例都完成后,应用程序将退出。如果不需要运行测试用例(因为前置条件失败),则可以将此属性设置为 true。默认值是 false。

TestCase {
    when: false
    optional: true
    function test_not_run() {
        verify(false)
    }
}

另请参阅whencompleted


running : bool

在测试用例运行期间,此属性将被设置为 true。初始值是 false,当测试用例完成后,值将再次变为 false。

另请参阅completedwhen


when : bool

当应用程序希望运行测试用例时,应将此属性设置为 true。默认值是 true。以下示例中,当用户按下鼠标按钮时运行测试

Rectangle {
    id: foo
    width: 640; height: 480
    color: "cyan"

    MouseArea {
        id: area
        anchors.fill: parent
    }

    property bool bar: true

    TestCase {
        name: "ItemTests"
        when: area.pressed
        id: test1

        function test_bar() {
            verify(bar)
        }
    }
}

在所有 TestCase 类型的测试用例被触发并运行后,测试应用程序将退出。可以使用optional属性来排除一个TestCase类型。

另请参阅optionalcompleted


windowShown : bool

此属性将在QML查看窗口显示后设置为 true。通常测试用例在测试应用程序加载并显示窗口之前立即运行。如果测试用例涉及视觉类型和行为,则可能需要在窗口显示后延迟运行。

Button {
    id: button
    onClicked: text = "Clicked"
    TestCase {
        name: "ClickTest"
        when: windowShown
        function test_click() {
            button.clicked();
            compare(button.text, "Clicked");
        }
    }
}

方法文档

cleanup()

此函数在执行TestCase类型中的每个测试函数后调用。默认实现不执行任何操作。应用程序可以提供自己的实现,在每个测试函数后执行清理。

另请参阅init()和cleanupTestCase


cleanupTestCase()

TestCase类型中的所有其他测试函数完成后,将调用此函数。默认实现不执行任何操作。应用程序可以提供自己的实现以执行测试用例清理。

另请参阅initTestCase()和cleanup


compare(actual, expected, message = "")

如果actualexpected不同,则失败当前测试用例,并显示可选的message。类似于C++中的QCOMPARE(actual, expected)

另请参阅tryCompare()和fuzzyCompare


object createTemporaryObject(Component component, object parent, object properties)

此函数从给定的component动态创建QML对象,带有指定的可选parentproperties。在cleanup()执行完毕后,将销毁返回的对象(如果尚未销毁),这意味着使用此函数创建的物体确保在每次测试之后被销毁,无论测试是否失败。

如果在创建对象时发生错误,将返回null

此函数内部调用component.createObject()。

另请参阅管理动态创建的测试对象


object createTemporaryQmlObject(string qml, object parent, string filePath)

此函数从给定的qml字符串动态创建QML对象,指定了parent。在cleanup()执行完毕后,将销毁返回的对象(如果尚未销毁),这意味着该函数创建的对象 guaranteeed 在每次测试后销毁,无论测试是否失败。

如果在创建对象时发生错误,将返回null

如果指定了filePath,它将用于创建对象的错误报告。

此函数内部调用Qt.createQmlObject()。

另请参阅管理动态创建的测试对象


expectFail(tag, message)

在数据驱动的测试中,标记与tag关联的行预期会失败。当发生失败时,显示message,终止测试,并将测试标记为通过。类似于C++中的QEXPECT_FAIL(tag, message, Abort)

如果测试不是数据驱动的,那么tag必须设置为空字符串。

另请参阅expectFailContinue


expectFailContinue(tag, message)

在数据驱动的测试中,标记与tag关联的行预期会失败。当发生失败时,显示message然后继续测试。类似于C++中的QEXPECT_FAIL(tag, message, Continue)

如果测试不是数据驱动的,那么tag必须设置为空字符串。

另请参阅expectFail


fail(message = "")

用可选的message失败当前测试用例。类似于C++中的QFAIL(message)


[since 6.3] failOnWarning(message)

将测试日志中的每个匹配message的警告添加为测试失败。当添加失败时,测试函数将继续执行。

message可以是字符串,也可以是提供消息模式的正则表达式。在后一种情况下,对于遇到的每个警告,第一个匹配的图案将导致失败,其余的图案将被忽略。

在每次测试函数结束时清除所有模式。

例如,以下片段将在产生具有文本“发生了不良事情”的警告时失败测试

failOnWarning("Something bad happened")

以下片段将在遇到匹配给定模式的任何警告时失败测试

failOnWarning(/[0-9]+ bad things happened/)

要使触发给定警告的每个测试都失败,请在init()中传递适当的正则表达式

function init() {
    failOnWarning(/.?/)
}

注意:尽管是JavaScript RegExp对象,但不会将其解释为正则表达式,而是将模式传递到QRegularExpression

注意:ignoreMessage()优先于此函数,因此任何匹配给定的ignoreMessage()failOnWarning()模式的警告都将被忽略。

此方法是在Qt 6.3中引入的。

另请参阅QTest::failOnWarning()和warn


QtObject findChild(parent, objectName)

返回具有objectNameparent的第一个子项,如果不存在此类项,则返回null。递归搜索可视和非可视子项,首先搜索可视子项。

compare(findChild(item, "childObject"), expectedChildObject);

fuzzyCompare(实际值, 预期值, delta, message = "")

如果实际值和预期值的差异大于delta,将失败当前测试用例,并显示可选的message。类似于C++中的qFuzzyCompare(actual, expected),但需要一个必须的delta值。

此函数还可以用于颜色比较,如果实际值和预期值都可以转换为颜色值。如果RGBA通道值之间的任何差异大于delta,则测试失败。

另请参阅tryCompare() 和 compare


object grabImage(item)

返回给定item的快照图像对象。

返回的图像对象具有以下属性

  • width 返回底层图像的宽度(自5.10起)
  • height 返回底层图像的高度(自5.10起)
  • size 返回底层图像的大小(自5.10起)

此外,返回的图像对象还具有以下方法

  • red(x, y) 返回位于x,y位置的像素的红色通道值
  • green(x, y) 返回位于x,y位置的像素的绿色通道值
  • blue(x, y) 返回位于x,y位置的像素的蓝色通道值
  • alpha(x, y) 返回位于x,y位置的像素的alpha通道值
  • pixel(x, y) 返回位于x,y位置的像素的颜色值
  • equals(image) 如果此图像与image相同,则返回true - 请参阅QImage::operator==(自5.6起)

    例如

    let image = grabImage(rect);
    compare(image.red(10, 10), 255);
    compare(image.pixel(20, 20), Qt.rgba(255, 0, 0, 255));
    
    rect.width += 10;
    let newImage = grabImage(rect);
    verify(!newImage.equals(image));
  • save(path) 将图像保存到指定的<(machine_name>path)。如果无法保存图像,则抛出异常。(自5.10起)

    这对于对失败的测试进行事后分析很有用,例如

    let image = grabImage(rect);
    try {
        compare(image.width, 100);
    } catch (ex) {
        image.save("debug.png");
        throw ex;
    }

ignoreWarning(message)

message标记为忽略的警告消息。当它出现时,警告不会打印,测试通过。如果消息没有出现,则测试失败。类似于C++中的 QTest::ignoreMessage(QtWarningMsg, message)

从Qt 5.12开始,message可以是字符串,或者是一个正则表达式,它提供要忽略的消息的模式。

例如,以下代码片段将忽略一个字符串警告消息

ignoreWarning("Something sort of bad happened")

以下代码片段将忽略一个匹配多个可能的警告消息的正则表达式

ignoreWarning(new RegExp("[0-9]+ bad things happened"))

注意:尽管是JavaScript RegExp对象,但不会将其解释为正则表达式,而是将模式传递到QRegularExpression

另请参阅warn


init()

此函数在每个执行在< a href="qml-qttest-testcase.html" translate="no">TestCase类型的测试函数之前被调用。默认实现不执行任何操作。应用程序可以提供自己的实现以在每个测试函数之前执行初始化。

另请参阅cleanup() 和 initTestCase


initTestCase()

此函数在每个TestCase类型的其他所有测试函数之前被调用。默认实现不执行任何操作。应用程序可以提供自己的实现以执行测试用例初始化。

另请参阅cleanupTestCase() 和 init


bool isPolishScheduled(object itemOrWindow)

如果itemOrWindowItem,则此函数返回updatePolish()自polish()以来的最后一次调用上未在它上调用,否则返回false

自Qt 6.5以来,如果 itemOrWindow 是一个 窗口,则此函数会在自上一次对那些项目调用 updatePolish() 后,如果它管理的任何项都没有调用 polish(),则返回 true,否则返回 false

在QML中分配属性值时,由于分配而产生布局变更可能不会立即生效,而是可以推迟到项被抛光时。在这些情况下,您可以使用此函数确保在测试继续执行之前项已经抛光。例如:

verify(isPolishScheduled(item))
verify(waitForItemPolished(item))

如果没有上面对 isPolishScheduled() 的调用,那么对 waitForItemPolished() 的调用可能会看到没有抛光预定并立即通过,假设项目已经抛光。此函数使得未抛光的原因显而易见,并允许在这样的情况下测试早点失败。

另请参阅waitForPolishQQuickItem::polishQQuickItem::updatePolish


keyClick(key, modifiers = Qt.NoModifier, delay = -1)

在当前焦点项目中模拟 key 的点击,可带有可选的 modifiers。如果 delay 大于0,则测试将等待 delay 毫秒。

该事件将被发送到 TestCase 窗口或者在多个窗口的情况下,发送到当前活动的窗口。更多详情见 QGuiApplication::focusWindow

另请参阅keyPresskeyRelease


keyPress(key, modifiers = Qt.NoModifier, delay = -1)

在当前焦点项目中模拟 key 的按键,可带有可选的 modifiers。如果 delay 大于0,则测试将等待 delay 毫秒。

该事件将被发送到 TestCase 窗口或者在多个窗口的情况下,发送到当前活动的窗口。更多详情见 QGuiApplication::focusWindow

注意: 在某个时刻,应该使用 keyRelease() 释放按键。

另请参阅keyReleasekeyClick


keyRelease(key, modifiers = Qt.NoModifier, delay = -1)

在当前焦点项目中模拟 key 的释放,可带有可选的 modifiers。如果 delay 大于0,则测试将等待 delay 毫秒。

该事件将被发送到 TestCase 窗口或者在多个窗口的情况下,发送到当前活动的窗口。更多详情见 QGuiApplication::focusWindow

另请参阅keyPresskeyClick


keySequence(keySequence)

模拟输入 keySequence。键序列可以设置为 标准键盘快捷键 之一,或者可以用包含最多四个按键序列的字符串来描述。

每个事件都应发送到 TestCase 窗口或者在多个窗口的情况下,发送到当前活动的窗口。更多详情见 QGuiApplication::focusWindow

另请参阅keyPresskeyReleaseGNU Emacs 风格键序列快捷键.sequence


mouseClick(item, x = item.width / 2, y = item.height / 2, button = Qt.LeftButton, modifiers = Qt.NoModifier, delay = -1)

模拟使用可选的 修饰符 上点击鼠标 按钮。点击位置由 xy 定义。如果未定义 xy,则位置将是 的中心。如果指定了 延迟,则测试将在按下和释放按钮之前等待指定数量的毫秒数。

xy 给定的位置将从 的坐标系转换为窗口坐标系,然后传递。如果 被另一个项遮挡,或者 的子项占用了该位置,则事件将发送到另一个项。

另请参阅 mousePress()、mouseRelease()、mouseDoubleClickSequence()、mouseMove()、mouseDrag() 和 mouseWheel


mouseDoubleClickSequence(item, x = item.width / 2, y = item.height / 2, button = Qt.LeftButton, modifiers = Qt.NoModifier, delay = -1)

模拟在 上使用可选的 修饰符 双击鼠标 按钮 所引发的事件全部序列。

此方法重现了用户执行双击时产生的鼠标事件序列:按下-释放-按下-双击-释放。

点击位置由 xy 定义。如果未定义 xy,则位置将是 的中心。如果指定了 延迟,则测试将在按下和释放按钮之前等待指定数量的毫秒数。

xy 给定的位置将从 的坐标系转换为窗口坐标系,然后传递。如果 被另一个项遮挡,或者 的子项占用了该位置,则事件将发送到另一个项。

此 QML 方法是在 Qt 5.5 中引入的。

另请参阅 mousePress()、mouseRelease()、mouseClick()、mouseMove()、mouseDrag() 和 mouseWheel


mouseDrag(item, x, y, dx, dy, button = Qt.LeftButton, modifiers = Qt.NoModifier, delay = -1)

模拟在按下 按钮 和可选的 修饰符 压在 上的鼠标拖动。初始拖动位置由 xy 定义,拖动距离由 dxdy 定义。如果指定了 延迟,则测试将在释放按钮之前等待指定数量的毫秒数。

xy 给定的位置将从 的坐标系转换为窗口坐标系,然后传递。如果 被另一个项遮挡,或者 的子项占用了该位置,则事件将发送到另一个项。

另请参阅 mousePress()、mouseClick()、mouseDoubleClickSequence()、mouseMove()、mouseRelease() 和 mouseWheel


mouseMove(item, x = item.width / 2, y = item.height / 2, delay = -1, buttons = Qt.NoButton)

将鼠标指针移动到 内由 xy 给定的位置,同时按下 buttons(如果有给)。从 Qt 6.0 开始,如果未定义 xy,则位置将是 的中心。

如果给出了 延迟(以毫秒为单位),则测试将在移动鼠标指针之前等待。

xy 给定的位置将从 的坐标系转换为窗口坐标系,然后传递。如果 被另一个项遮挡,或者 的子项占用了该位置,则事件将发送到另一个项。

另请参阅 mousePress()、mouseRelease()、mouseClick()、mouseDoubleClickSequence()、mouseDrag() 和 mouseWheel()。


mousePress(item, x = item.width / 2, y = item.height / 2, button = Qt.LeftButton, modifiers = Qt.NoModifier, delay = -1)

模拟在 item 上按鼠标 button,带有可选的 modifiers。位置由 xy 定义。如果 xy 未定义,则位置为 item 的中心。如果指定了 delay,则测试将在按之前等待指定的毫秒数。

xy 给定的位置将从 的坐标系转换为窗口坐标系,然后传递。如果 被另一个项遮挡,或者 的子项占用了该位置,则事件将发送到另一个项。

另请参阅 mouseRelease()、mouseClick()、mouseDoubleClickSequence()、mouseMove()、mouseDrag() 和 mouseWheel()。


mouseRelease(item, x = item.width / 2, y = item.height / 2, button = Qt.LeftButton, modifiers = Qt.NoModifier, delay = -1)

模拟在 item 上释放鼠标 button,带有可选的 modifiers。释放位置由 xy 定义。如果 xy 未定义,则位置为 item 的中心。如果指定了 delay,则测试将在释放按钮之前等待指定的毫秒数。

xy 给定的位置将从 的坐标系转换为窗口坐标系,然后传递。如果 被另一个项遮挡,或者 的子项占用了该位置,则事件将发送到另一个项。

另请参阅 mousePress()、mouseClick()、mouseDoubleClickSequence()、mouseMove()、mouseDrag() 和 mouseWheel()。


mouseWheel(item, x, y, xDelta, yDelta, button = Qt.LeftButton, modifiers = Qt.NoModifier, delay = -1)

模拟在按 button 时在 item 上旋转鼠标滚轮,带有可选的 modifiers。轮事件的位置由 xy 定义。如果指定了 delay,则测试将在释放按钮之前等待指定的毫秒数。

xy 给定的位置将从 的坐标系转换为窗口坐标系,然后传递。如果 被另一个项遮挡,或者 的子项占用了该位置,则事件将发送到另一个项。

xDeltayDelta 包含轮旋转角度的八分之一。有关更多详情,请参阅 QWheelEvent::angleDelta()。

另请参阅 mousePress()、mouseClick()、mouseDoubleClickSequence()、mouseMove()、mouseRelease()、mouseDrag() 和 QWheelEvent::angleDelta()。


skip(message = "")

跳过当前的测试用例并打印可选的 message。如果这是一个数据驱动的测试,则仅跳过当前行。类似于 C++ 中的 QSKIP(message)


sleep(ms)

暂停 ms 毫秒,不处理 Qt 事件。

另请参阅 wait() 和 waitForRendering()。


TouchEventSequence touchEvent(object item)

通过模拟触摸屏(QPointingDevice)开始一系列触摸事件。事件被发送到包含 item 的窗口。

返回的对象用于枚举要发送的单个 QTouchEvent 的事件。除非指定,否则触摸事件将被发送到包含 TestCase 的窗口。

Rectangle {
    width: 640; height: 480

    MultiPointTouchArea {
        id: area
        anchors.fill: parent

        property bool touched: false

        onPressed: touched = true
    }

    TestCase {
        name: "ItemTests"
        when: windowShown
        id: test1

        function test_touch() {
            let touch = touchEvent(area);
            touch.press(0, area, 10, 10);
            touch.commit();
            verify(area.touched);
        }
    }
}

另请参阅 TouchEventSequence::press(),TouchEventSequence::move(),TouchEventSequence::release(),TouchEventSequence::stationary(),TouchEventSequence::commit(),以及 QInputDevice::DeviceType


tryCompare(obj, property, expected, timeout = 5000, message = "")

如果在指定的 propertyobj 不是与 expected 相同,则当前测试用例失败,并显示可选的 message。测试将在 timeout(以毫秒为单位)达到之前重试多次。

此函数旨在测试基于异步事件的属性值改变的应用程序。使用 compare()测试同步属性更改。

tryCompare(img, "status", BorderImage.Ready)
compare(img.width, 120)
compare(img.height, 120)
compare(img.horizontalTileMode, BorderImage.Stretch)
compare(img.verticalTileMode, BorderImage.Stretch)

SignalSpy::wait()提供了等待信号发出的替代方法。

另请参阅 compare()和 SignalSpy::wait()。


tryVerify(function, timeout = 5000, message = "")

如果在指定的 timeout(以毫秒为单位)之前 function 评估不到 true,则当前测试用例失败。函数会在超时之前多次评估。失败时将显示可选的 message

此函数旨在测试基于异步事件的条件改变的应用程序。使用 verify()测试同步条件变化,使用 tryCompare()测试异步属性变化。

例如,在下面的代码中,无法使用 tryCompare(),因为 currentItem 属性可能在短时间内为 null

tryCompare(listView.currentItem, "text", "Hello");

相反,我们首先可以使用 tryVerify() 检查 currentItem 不是 null,然后使用常规的 compare 后续操作。

tryVerify(function(){ return listView.currentItem })
compare(listView.currentItem.text, "Hello")

另请参阅 verify(),compare(),tryCompare()和 SignalSpy::wait()。


verify(condition, message = "")

如果 condition 为 false,则当前测试用例失败,并显示可选的 message。类似于 C++ 中的 QVERIFY(condition)QVERIFY2(condition, message)


wait(ms)

等待 ms 毫秒以处理 Qt 事件。

注意:此方法使用精确计时器进行实际等待。您等待的事件可能不是这样。特别是,任何动画以及 Timer QML 类型都可以使用精确或粗略计时器,具体取决于各种因素。对于粗略计时器,您必须期望与 TestCase::wait() 使用的精确计时器相比大约 5% 的偏移。尽管如此,Qt 无法就 drift 提供硬性保证,因为操作系统通常不为计时器提供硬性保证。

另请参阅 sleep(),waitForRendering()和 Qt::TimerType


[自6.5起] bool waitForPolish(object windowOrItem, int timeout = 5000)

如果 windowOrItem 是一个 Item,这个函数将等待 timeout 毫秒或直到 isPolishScheduled(windowOrItem) 返回 false。如果在 timeout 毫秒内 isPolishScheduled(windowOrItem) 返回 false,则返回 true,否则返回 false

如果 windowOrItem 是一个 Window,这个函数将等待 timeout 毫秒或直到该窗口管理的所有项的 isPolishScheduled() 返回 false。如果在 timeout 毫秒内所有项的 isPolishScheduled() 返回 false,则返回 true,否则返回 false

此方法是在 Qt 6.5 中引入的。

另请参阅isPolishScheduled()、QQuickItem::polish() 和 QQuickItem::updatePolish()。


waitForRendering(item, timeout = 5000)

等待 timeout 毫秒或直到渲染器渲染 item。如果在 timeout 毫秒内渲染 item,则返回 true,否则返回 false。默认的 timeout 值为 5000。

另请参阅sleep() 和 wait()。


warn(message)

message 打印为警告消息。类似于 C++ 中的 qWarning(message)

另请参阅ignoreWarning()。


© 2024 The Qt Company Ltd. 本文件中包含的文档贡献是其各自所有者的版权所有。本文件提供的文档是根据自由软件基金会发布的 GNU 自由文档许可版本 1.3 的条款提供的。Qt 及相关标志是在芬兰及其它国家和地区由 The Qt Company Ltd. 的商标。所有其他商标均属其各自所有者。