이 페이지에서

TestCase QML Type

단위 테스트 케이스를 나타냅니다. 더 보기...

Import Statement: import QtTest
Inherits:

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 *********

자바스크립트 속성의 작동 방식상, 테스트 함수가 발견되는 순서는 예측할 수 없습니다. 예측 가능성을 높이기 위해 테스트 프레임워크는 함수를 이름의 오름차순으로 정렬합니다. 이는 두 개의 테스트를 순서대로 실행해야 할 때 도움이 될 수 있습니다.

여러 개의 TestCase 유형을 지정할 수 있습니다. 모든 테스트가 완료되면 테스트 프로그램이 종료됩니다.

데이터 기반 테스트

"_data"로 끝나는 함수 이름을 사용하여 테스트에 테이블 데이터를 제공할 수 있습니다. 또는 ` init_data() ` 함수를 사용하여, TestCase 유형 내에 일치하는 "_data" 함수가 없는 모든 테스트 함수에 대한 기본 테스트 데이터를 제공할 수 있습니다:

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 벤치마크 프레임워크를 통해 여러 번 실행되며, 실행 결과의 평균 실행 시간이 보고됩니다. 이는 C++ 버전의 QTestLib에서 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 열거형 값이나 latin1 문자(길이 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.cpp
| - main.qml
| — 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
}

SignalSpy 및 Qt Quick Test.

속성 문서

completed : bool

이 속성은 테스트 케이스의 실행이 완료되면 true로 설정됩니다. 테스트 케이스는 한 번만 실행됩니다. 초기값은 false입니다.

running 및 when도 참조하십시오 .

name : string

이 속성은 결과 보고를 위한 테스트 케이스의 이름을 정의합니다. 기본값은 빈 문자열입니다.

TestCase {
    name: "ButtonTests"
    ...
}

running : bool

이 속성은 테스트 케이스가 실행되는 동안 true로 설정됩니다. 초기 값은 false이며, 테스트 케이스가 완료되면 값은 다시 false로 돌아갑니다.

completed 및 when도 참조하십시오 .

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 유형이 트리거되어 실행되면 테스트 애플리케이션이 종료됩니다.

completed도 참조하십시오 .

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 = "")

actual 가 expected 과 다를 경우 현재 테스트 케이스를 실패로 처리하고, 선택 사항인 message 을 표시합니다. C++의 QCOMPARE(actual, expected) 와 유사합니다.

tryCompare() 및 fuzzyCompare도 참조하십시오 .

QtObject createTemporaryObject(Component component, QtObject parent, var properties)

이 함수는 주어진 ` component `와 지정된 선택적 ` parent ` 및 ` properties`을 사용하여 QML 객체를 동적으로 생성합니다. 반환된 객체는 ` cleanup()`의 실행이 완료된 후(아직 소멸되지 않은 경우) 소멸됩니다. 즉, 이 함수로 생성된 객체는 테스트의 성공 여부와 관계없이 각 테스트가 끝난 후 반드시 소멸됩니다.

객체 생성 중에 오류가 발생하면 null 가 반환됩니다.

이 함수는 내부적으로 component.createObject()를 호출합니다.

Managing Dynamically Created Test Objects도 참조하십시오 .

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

이 함수는 지정된 ` qml ` 문자열과 ` parent`을 사용하여 QML 객체를 동적으로 생성합니다. 반환된 객체는 ` cleanup()`의 실행이 완료된 후(아직 소멸되지 않은 경우) 소멸됩니다. 즉, 이 함수로 생성된 객체는 테스트의 성공 여부와 관계없이 각 테스트가 끝난 후 반드시 소멸됩니다.

객체 생성 중에 오류가 발생하면 null 이 반환됩니다.

filePath 가 지정된 경우, 생성된 객체에 대한 오류 보고에 사용됩니다.

이 함수는 내부적으로 Qt.createQmlObject()를 호출합니다.

Managing Dynamically Created Test Objects도 참조하십시오 .

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 는 문자열이거나 메시지 패턴을 지정하는 정규 표현식일 수 있습니다. 후자의 경우, 발견된 각 경고에 대해 일치하는 첫 번째 패턴이 실패를 유발하고, 나머지 패턴은 무시됩니다.

모든 패턴은 각 테스트 함수가 종료될 때 지워집니다.

예를 들어, 다음 코드 조각은 "Something bad happened"라는 텍스트가 포함된 경고가 발생하면 테스트를 실패로 처리합니다:

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)

parent 의 첫 번째 자식 요소를 objectName 로 반환하며, 해당 항목이 존재하지 않을 경우 null 를 반환합니다. 시각적 자식 요소와 비시각적 자식 요소 모두 재귀적으로 검색되며, 시각적 자식 요소가 먼저 검색됩니다.

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

fuzzyCompare(actual, expected, delta, message = "")

actual 와 expected 사이의 차이가 delta 보다 크면 현재 테스트 케이스를 실패로 처리하고, 선택 사항인 message 를 표시합니다. C++의 qFuzzyCompare(actual, expected) 와 유사하지만, delta 값이 필수로 지정됩니다.

actual 와 expected 값을 모두 색상 값으로 변환할 수 있는 경우, 이 함수는 색상 비교에도 사용할 수 있습니다. RGBA 채널 값 간의 차이 중 하나라도 delta 보다 크면 테스트는 실패합니다.

tryCompare() 및 compare()도 참조하십시오 .

QtObject grabImage(Item 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 위치에 있는 픽셀의 알파 채널 값을 반환합니다
  • 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) 지정된 경로에 이미지를 저장합니다. 이미지를 저장할 수 없는 경우 예외가 발생합니다. (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 XML 5.12부터는 ` message `가 문자열이거나, 무시할 메시지의 패턴을 제공하는 정규 표현식일 수 있습니다.

예를 들어, 다음 코드 조각은 문자열 형태의 경고 메시지를 무시합니다:

ignoreWarning("Something sort of bad happened")

그리고 다음 코드 조각은 여러 가지 가능한 경고 메시지와 일치하는 정규 표현식을 무시합니다:

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

참고: JavaScript RegExp 객체이긴하지만 , 그대로 해석되지는 않습니다. 대신, 해당 패턴은 ` QRegularExpression`에 전달됩니다.

warn()도 참조하십시오 .

init()

이 함수는 ` TestCase ` 유형에서 실행되는 각 테스트 함수 앞에 호출됩니다. 기본 구현은 아무 작업도 수행하지 않습니다. 애플리케이션은 각 테스트 함수 실행 전에 초기화를 수행하기 위해 자체 구현을 제공할 수 있습니다.

cleanup() 및 initTestCase()도 참조하십시오 .

initTestCase()

이 함수는 ` TestCase ` 타입에 정의된 다른 모든 테스트 함수보다 먼저 호출됩니다. 기본 구현은 아무 작업도 수행하지 않습니다. 애플리케이션에서는 테스트 케이스 초기화를 수행하기 위해 자체 구현을 제공할 수 있습니다.

cleanupTestCase() 및 init()도 참조하십시오 .

bool isPolishScheduled(object itemOrWindow)

itemOrWindow 가 Item 인 경우, 이 함수는 마지막 polish() 호출 이후 updatePolish()가 호출되지 않았다면 true 를 반환하고, 그렇지 않으면 false 를 반환합니다.

Qt 6.5부터는, itemOrWindow 가 Window 인 경우, 이 함수는 해당 항목들에 대한 마지막 polish() 호출 이후로 updatePolish()가 해당 항목 중 어느 하나에 대해서도 호출되지 않았다면 true 를 반환하고, 그렇지 않은 경우 false 를 반환합니다.

QML에서 속성에 값을 할당할 때, 해당 할당으로 인해 항목이 수행해야 하는 레이아웃 작업이 즉시 적용되지 않고, 항목이 폴리싱될 때까지 연기될 수 있습니다. 이러한 경우, 이 함수를 사용하여 테스트 실행이 계속되기 전에 항목이 폴리싱되었는지 확인할 수 있습니다. 예를 들어:

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

위의 ` isPolishScheduled() ` 호출이 없다면, ` waitForItemPolished() ` 호출 시 폴리싱이 예약되지 않은 것을 감지하고, 항목이 이미 폴리싱된 것으로 가정하여 즉시 통과될 수 있습니다. 이 함수는 항목이 폴리싱되지 않은 이유를 명확히 보여주고, 이러한 상황에서 테스트가 조기에 실패하도록 합니다.

waitForPolish(), QQuickItem::polish(), QQuickItem::updatePolish()도 참조하십시오 .

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

현재 포커스가 맞춰진 항목에 대해 ‘ key ’ 클릭을 시뮬레이션하며, 선택적으로 ‘ modifiers ’을 적용합니다. ‘ delay ’ 값이 0보다 크면, 테스트는 ‘ delay ’ 밀리초 동안 대기합니다.

key 에서 허용되는 형식에 대한 자세한 내용은 Simulating Keyboard and Mouse Events 을 참조하십시오.

이 이벤트는 TestCase 창으로 전송되며, 여러 개의 창이 있는 경우에는 현재 활성화된 창으로 전송됩니다. 자세한 내용은 QGuiApplication::focusWindow()을 참조하십시오.

keyPress() 및 keyRelease()도 참조하십시오 .

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

현재 포커스가 맞춰진 항목에서 선택 사항인 modifiers 을 함께 적용하여 key 를 누르는 동작을 시뮬레이션합니다. delay 가 0보다 크면, 테스트는 delay 밀리초 동안 대기합니다.

허용되는 key 형식에 대한 자세한 내용은 Simulating Keyboard and Mouse Events 을 참조하십시오.

이벤트는 TestCase 창으로 전송되거나, 여러 창이 있는 경우 현재 활성화된 창으로 전송됩니다. 자세한 내용은 QGuiApplication::focusWindow()을 참조하십시오.

참고: 나중에 keyRelease()를 사용하여 키를 해제해야 합니다.

keyRelease() 및 keyClick()도 참조하십시오 .

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

현재 포커스가 맞춰진 항목에 대해 선택적 지연 시간( modifiers )을 지정하여 key 를 놓는 동작을 시뮬레이션합니다. delay 값이 0보다 크면, 테스트는 delay 밀리초 동안 대기합니다.

허용되는 key 형식에 대한 자세한 내용은 Simulating Keyboard and Mouse Events 을 참조하십시오.

이 이벤트는 TestCase 창으로 전송되거나, 여러 창이 있는 경우 현재 활성화된 창으로 전송됩니다. 자세한 내용은 QGuiApplication::focusWindow()을 참조하십시오.

keyPress() 및 keyClick()도 참조하십시오 .

keySequence(keySequence)

keySequence 의 입력 동작을 시뮬레이션합니다. 키 시퀀스는 standard keyboard shortcuts 중 하나로 설정하거나, 최대 4개의 키 누름 순서가 포함된 문자열로 지정할 수 있습니다.

각 이벤트는 TestCase 창으로 전송되어야 하며, 창이 여러 개인 경우에는 현재 활성화된 창으로 전송되어야 합니다. 자세한 내용은 QGuiApplication::focusWindow()을 참조하십시오.

keyPress(), keyRelease(), GNU Emacs Style Key Sequences 및 Shortcut.sequence도 참조하십시오 .

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

item 에서 마우스 클릭( button )을 시뮬레이션하며, 선택적으로 modifiers 를 적용할 수 있습니다. 클릭 위치는 x 및 y 로 정의됩니다. x 와 y 가 정의되지 않은 경우, 위치는 item 의 중심이 됩니다. delay 가 지정된 경우, 테스트는 버튼을 누르기 전과 놓기 전에 지정된 밀리초 수만큼 대기합니다.

x 및 y 로 지정된 위치는 item 의 좌표계에서 창 좌표로 변환된 후 전달됩니다. item 가 다른 항목에 가려져 있거나, item 의 자식 요소가 해당 위치를 차지하고 있는 경우, 이벤트는 대신 다른 항목으로 전달됩니다.

mousePress(), mouseRelease(), mouseDoubleClickSequence(), mouseMove(), mouseDrag() 및 mouseWheel()도 참조하십시오 .

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

item 에서 마우스 더블 클릭 button 시 생성되는 전체 이벤트 시퀀스를 시뮬레이션하며, 선택적으로 modifiers 를 적용할 수 있습니다.

이 메서드는 사용자가 더블 클릭을 수행할 때 생성되는 마우스 이벤트 시퀀스(Press-Release-Press-DoubleClick-Release)를 재현합니다.

클릭 위치는 x 및 y 으로 정의됩니다. x 및 y 가 정의되지 않은 경우, 위치는 item 의 중심이 됩니다. delay 가 지정된 경우, 테스트는 버튼을 누르기 전과 놓기 전에 지정된 밀리초 수만큼 대기합니다.

x 및 y 로 지정된 위치는 item 의 좌표계에서 창 좌표로 변환된 후 전달됩니다. item 가 다른 항목에 가려져 있거나, item 의 자식 항목이 해당 위치를 차지하고 있는 경우, 이벤트는 대신 다른 항목으로 전달됩니다.

이 Qml 메서드는 Qt 5.5에서 도입되었습니다.

mousePress(), mouseRelease(), mouseClick(), mouseMove(), mouseDrag(), mouseWheel()도 참조하십시오 .

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

button 키를 누른 상태에서 item 위에서 마우스를 드래그하는 동작을 시뮬레이션하며, 선택적으로 modifiers 를 사용할 수 있습니다. 초기 드래그 위치는 x 및 y 로 정의되며, 드래그 거리는 dx 및 dy 로 정의됩니다. delay 가 지정된 경우, 테스트는 지정된 밀리초 동안 대기한 후 버튼을 놓습니다.

x 및 y 로 지정된 위치는 item 의 좌표계에서 창 좌표계로 변환된 후 전달됩니다. item 가 다른 항목에 가려져 있거나, item 의 자식 요소가 해당 위치를 차지하고 있는 경우, 이벤트는 대신 다른 항목으로 전달됩니다.

mousePress(), mouseClick(), mouseDoubleClickSequence(), mouseMove(), mouseRelease() 및 mouseWheel()도 참조하십시오 .

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

buttons 가 지정된 경우 이를 누른 상태로 유지하면서, item 내에서 x 및 y 로 지정된 위치로 마우스 포인터를 이동합니다. Qt 6.0부터는 x 및 y 가 정의되지 않은 경우, 위치는 item 의 중심이 됩니다.

delay (밀리초 단위)가 지정된 경우, 테스트는 마우스 포인터를 이동하기 전에 잠시 대기합니다.

x 와 y 로 지정된 위치는 item 의 좌표계에서 창 좌표계로 변환된 후 전달됩니다. item 가 다른 항목에 가려져 있거나, item 의 자식 요소가 해당 위치를 차지하고 있는 경우, 이벤트는 대신 다른 항목으로 전달됩니다.

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 을 지정할 수 있습니다. 위치는 x 및 y 으로 정의됩니다. x 또는 y 이 정의되지 않은 경우, 위치는 item 의 중심이 됩니다. delay 이 지정된 경우, 테스트는 클릭하기 전 지정된 밀리초 수만큼 대기합니다.

x 및 y 로 지정된 위치는 item 의 좌표계에서 창 좌표계로 변환된 후 전달됩니다. item 가 다른 항목에 가려져 있거나, item 의 자식 요소가 해당 위치를 차지하고 있는 경우, 이벤트는 대신 다른 항목으로 전달됩니다.

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 을 지정할 수 있습니다. 버튼을 놓는 위치는 x 및 y 로 정의됩니다. x 또는 y 가 정의되지 않은 경우, 위치는 item 의 중심이 됩니다. delay 가 지정된 경우, 테스트는 지정된 밀리초 수만큼 대기한 후 버튼을 놓습니다.

x 및 y 로 지정된 위치는 item 의 좌표계에서 창 좌표계로 변환된 후 전달됩니다. item 가 다른 항목에 가려져 있거나, item 의 자식 요소가 해당 위치를 차지하고 있는 경우, 이벤트는 대신 다른 항목으로 전달됩니다.

mousePress(), mouseClick(), mouseDoubleClickSequence(), mouseMove(), mouseDrag() 및 mouseWheel()도 참조하십시오 .

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

button 키를 누른 상태에서 modifiers(선택 사항)을 함께 누른 채로 item 에서 마우스 휠을 회전하는 것을 시뮬레이션합니다. 휠 이벤트의 위치는 x 및 y 로 정의됩니다. delay 가 지정된 경우, 테스트는 지정된 밀리초 수만큼 기다린 후 버튼을 놓습니다.

x 및 y 로 지정된 위치는 item 의 좌표계에서 창 좌표계로 변환된 후 전달됩니다. item 가 다른 항목에 가려져 있거나, item 의 자식 요소가 해당 위치를 차지하고 있는 경우, 이벤트는 대신 다른 항목으로 전달됩니다.

xDelta 및 yDelta 에는 휠 회전 거리가 8분의 1도 단위로 포함됩니다. 자세한 내용은 QWheelEvent::angleDelta()을 참조하십시오.

mousePress(), mouseClick(), mouseDoubleClickSequence(), mouseMove(), mouseRelease(), mouseDrag() 및 QWheelEvent::angleDelta()도 참조하십시오 .

skip(message = "")

현재 테스트 케이스를 건너뛰고 선택 사항인 ` message`을 출력합니다. 데이터 기반 테스트인 경우, 현재 행만 건너뜁니다. C++의 ` QSKIP(message) `과 유사합니다.

sleep(ms)

Qt 이벤트를 처리하지 않은 채로 ms 밀리초 동안 대기합니다.

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 = "")

obj 에 지정된 property 가 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()`를 사용하십시오.

예를 들어, 아래 코드에서는 currentItem 속성이 짧은 시간 동안 null 일 수 있으므로 tryCompare()을 사용할 수 없습니다:

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

대신 tryVerify()를 사용하여 먼저 currentItem 가 null 가 아닌지 확인한 다음, 그 후에 일반적인 비교 연산을 수행할 수 있습니다:

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)

Qt 이벤트를 처리하는 동안 ms 밀리초 동안 대기합니다.

참고: 이 메서드는 실제 대기 작업을 수행하기 위해 정밀 타이머를 사용합니다. 그러나 대기 중인 이벤트 자체는 정밀 타이머를 사용하지 않을 수도 있습니다. 특히, 모든 애니메이션과 Timer QML 타입은 다양한 요인에 따라 정밀 타이머나 대략적 타이머 중 하나를 사용할 수 있습니다. 대략적인 타이머의 경우, TestCase::wait()에서 사용하는 정밀 타이머에 비해 약 5% 정도의 오차가 발생할 수 있음을 예상해야 합니다. 다만, 운영 체제가 일반적으로 타이머에 대해 확실한 보장을 제공하지 않기 때문에 Qt 역시 이 오차에 대해 확실한 보장을 할 수는 없습니다.

sleep(), waitForRendering() 및 Qt::TimerType도 참조하십시오 .

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

windowOrItem 가 Item인 경우, 이 함수는 timeout 밀리초 동안 대기하거나 isPolishScheduled(windowOrItem) 가 false 를 반환할 때까지 대기합니다. isPolishScheduled(windowOrItem) 가 timeout 밀리초 이내에 false 를 반환하면 true 를 반환하고, 그렇지 않으면 false 를 반환합니다.

windowOrItem 가 Window인 경우, 이 함수는 timeout 밀리초 동안 대기하거나, isPolishScheduled() 가 해당 창에서 관리하는 모든 항목에 대해 false 를 반환할 때까지 대기합니다. isPolishScheduled() 가 timeout 밀리초 이내에 모든 항목에 대해 false 를 반환하면 true 를 반환하고, 그렇지 않으면 false 를 반환합니다.

이 메서드는 Qt 6.5에서 도입되었습니다.

isPolishScheduled(), QQuickItem::polish() 및 QQuickItem::updatePolish()도 참조하십시오 .

waitForRendering(item, timeout = 5000)

timeout 밀리초 동안, 또는 렌더러가 item 를 렌더링할 때까지 대기합니다. item 가 timeout 밀리초 이내에 렌더링되면 true를 반환하고, 그렇지 않으면 false를 반환합니다. timeout 의 기본값은 5000입니다.

sleep() 및 wait()도 참조하십시오 .

warn(message)

경고 메시지로 message 을 출력합니다. C++의 qWarning(message) 와 유사합니다.

ignoreWarning()도 참조하십시오 .

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.