Тип QML TestCase
Представляет тестовый случай для модульного тестирования Подробнее...
| Оператор импорта: | import QtTest 1.1 |
| С момента: | Qt 4.8 |
| Наследует: |
Свойства
Методы
- cleanup()
- cleanupTestCase()
- compare(actual, expected, message)
- expectFail(tag, message)
- expectFailContinue(tag, message)
- fail(message)
- QtObject findChild(parent, objectName)
- fuzzyCompare(actual, expected, delta, message)
- object grabImage(item)
- ignoreWarning(message)
- init()
- initTestCase()
- keyClick(key, modifiers, delay)
- keyPress(key, modifiers, delay)
- keyRelease(key, modifiers, delay)
- mouseClick(item, x, y, button, modifiers, delay)
- mouseDoubleClick(item, x, y, button, modifiers, delay)
- mouseDoubleClickSequence(item, x, y, button, modifiers, delay)
- mouseDrag(item, x, y, dx, dy, button, modifiers, delay)
- mouseMove(item, x, y, delay)
- mousePress(item, x, y, button, modifiers, delay)
- mouseRelease(item, x, y, button, modifiers, delay)
- mouseWheel(item, x, y, xDelta, yDelta, button, modifiers, delay)
- skip(message)
- sleep(ms)
- tryCompare(obj, property, expected, timeout, message)
- verify(condition, message)
- wait(ms)
- waitForRendering(item, timeout)
- warn(message)
Подробное описание
Введение к тестовым случаям QML
Тестовые случаи записываются как функции JavaScript в типе TestCase:
import QtQuick 2.0
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_", рассматриваются как тестовые случаи, которые необходимо выполнить. Свойство 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.1
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 является специальным - он выводится тестовой средой, когда строка завершается неудачей, чтобы помочь читателю определить, какой случай завершился неудачей среди набора в противном случае проходящих тестов.
Benchmarks
Функции, имена которых начинаются с "benchmark_", будут выполняться несколько раз с помощью фреймворка Qt benchmark, а среднее время выполнения для запусков будет отображаться. Это эквивалентно использованию макроса QBENCHMARK в C++ версии QTestLib.
TestCase {
id: top
name: "CreateBenchmark"
function benchmark_create_component() {
var component = Qt.createComponent("item.qml")
var 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 (строка длиной один).
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(), mouseDoubleClick(), mouseDoubleClickSequence() и mouseMove() могут использоваться для моделирования событий мыши аналогичным образом.
Примечание: события клавиатуры и мыши могут быть переданы только после того, как главное окно было показано. Попытки передать события до этого момента завершатся неудачей. Используйте свойства when и windowShown для отслеживания момента отображения главного окна.
См. также SignalSpy и Qt Quick Test Reference Documentation.
Документация по свойствам
completed : bool
Это свойство будет установлено в значение true после завершения выполнения тестового случая. Тестовые случаи выполняются только один раз. Начальное значение — false.
name : string
Это свойство определяет имя тестового случая для отчётности о результатах. По умолчанию пустая строка.
TestCase {
name: "ButtonTests"
...
} optional : bool
В приложении для тестирования можно предоставить несколько типов TestCase. Приложение завершит работу после завершения всех типов. Если тест не нужно запускать (потому что предварительное условие не выполнено), то можно установить это свойство в значение true. Значение по умолчанию — false.
TestCase {
when: false
optional: true
function test_not_run() {
verify(false)
}
} running : bool
Это свойство будет установлено в значение true во время выполнения тестового случая. Начальное значение — false, и значение станет false снова после завершения тестового случая.
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.
См. также optional и completed.
windowShown : bool
Это свойство будет установлено в значение true после отображения окна просмотра QML. Обычно тестовые случаи выполняются сразу после загрузки тестового приложения и до отображения окна. Если тестовый случай включает визуальные типы и поведение, то его может потребоваться отложить до отображения окна.
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. Аналогично QCOMPARE(actual, expected) в C++.
См. также tryCompare() и fuzzyCompare.
expectFail(tag, message)
В тестовом случае с данными помечает строку, связанную с tag, как ожидающую ошибку. При возникновении ошибки отображает message, прерывает тест и помечает тест как пройденный. Аналогично QEXPECT_FAIL(tag, message, Abort) в C++.
Если тест не ориентирован на данные, то tag должен быть пустой строкой.
См. также expectFailContinue().
expectFailContinue(tag, message)
В тестовом случае с данными помечает строку, связанную с tag, как ожидающую ошибку. При возникновении ошибки отображает message и продолжает тест. Аналогично QEXPECT_FAIL(tag, message, Continue) в C++.
Если тест не ориентирован на данные, то tag должен быть пустой строкой.
См. также expectFail().
fail(message = "")
Прерывает текущий тестовый случай с необязательным message. Аналогично QFAIL(message) в C++.
QtObject findChild(parent, objectName)
Возвращает первого потомка parent с именем objectName или null, если такого элемента нет. Поиск проводится рекурсивно, как среди визуальных, так и среди невизуальных потомков, при этом визуальные потомки проверяются в первую очередь.
compare(findChild(item, "childObject"), expectedChildObject);
Этот метод QML был введён в Qt 5.4.
fuzzyCompare(actual, expected, delta, message = "")
Прерывает текущий тестовый случай, если разница между actual и expected больше, чем delta, и отображает необязательное message. Аналогично qFuzzyCompare(actual, expected) в C++, но с необходимым значением delta.
Эта функция также может использоваться для сравнения цветов, если оба значения actual и expected могут быть преобразованы в значения цветов. Если какая-либо из разниц для значений каналов RGBA больше, чем delta, тест прерывается.
См. также tryCompare() и compare().
object grabImage(item)
Возвращает объект изображения-снимка заданного item.
Возвращаемый объект изображения имеет следующие методы:
- 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) Возвращает
true, если это изображение идентично image - см. QImage::operator== (с версии 5.6)Например:
var image = grabImage(rect); compare(image.red(10, 10), 255); compare(image.pixel(20, 20), Qt.rgba(255, 0, 0, 255)); rect.width += 10; var newImage = grabImage(rect); verify(!newImage.equals(image));
ignoreWarning(message)
Помечает message как игнорируемое сообщение об ошибке. При его появлении предупреждение не будет выводиться, и тест пройдёт. Если сообщение не появится, тест завершится с ошибкой. Аналогично QTest::ignoreMessage(QtWarningMsg, message) в C++.
См. также warn().
init()
Эта функция вызывается перед каждой тестовой функцией, выполняемой в типе TestCase. По умолчанию она ничего не делает. Приложение может предоставить собственную реализацию для выполнения инициализации перед каждой тестовой функцией.
См. также cleanup() и initTestCase().
initTestCase()
Эта функция вызывается перед любыми другими тестовыми функциями в типе TestCase. По умолчанию она ничего не делает. Приложение может предоставить собственную реализацию для выполнения инициализации тестового случая.
См. также cleanupTestCase() и init().
keyClick(key, modifiers = Qt.NoModifier, delay = -1)
Имитирует нажатие клавиши key с необязательными modifier на текущем фокусированном элементе. Если delay больше 0, тест подождёт delay миллисекунд.
Событие будет отправлено в окно TestCase или, в случае нескольких окон, в текущее активное окно. Подробнее см. QGuiApplication::focusWindow().
См. также keyPress() и keyRelease().
keyPress(key, modifiers = Qt.NoModifier, delay = -1)
Имитирует нажатие клавиши key с необязательными modifier на текущем фокусированном элементе. Если delay больше 0, тест подождёт delay миллисекунд.
Событие будет отправлено в окно TestCase или, в случае нескольких окон, в текущее активное окно. Подробнее см. QGuiApplication::focusWindow().
Примечание: В какой-то момент вам нужно отпустить клавишу с помощью keyRelease().
См. также keyRelease() и keyClick().
keyRelease(key, modifiers = Qt.NoModifier, delay = -1)
Имитирует отпускание клавиши key с необязательными modifier на текущем фокусированном элементе. Если delay больше 0, тест подождёт delay миллисекунд.
Событие будет отправлено в окно TestCase или, в случае нескольких окон, в текущее активное окно. Подробнее см. QGuiApplication::focusWindow().
См. также keyPress() и keyClick().
mouseClick(item, x = item.width / 2, y = item.height / 2, button = Qt.LeftButton, modifiers = Qt.NoModifier, delay = -1)
Имитирует нажатие кнопки мыши button с необязательными modifier на элементе item. Позиция клика определяется x и y. Если x и y не определены, позиция будет в центре item. Если указано delay, тест подождёт указанное количество миллисекунд до нажатия и отпускания кнопки.
Позиция, заданная x и y, преобразуется из системы координат item в координаты окна и затем передаётся. Если item скрыт другим элементом или элемент, являющийся потомком item, занимает эту позицию, событие будет передано этому другому элементу.
См. также mousePress(), mouseRelease(), mouseDoubleClick(), mouseDoubleClickSequence(), mouseMove(), mouseDrag() и mouseWheel().
mouseDoubleClick(item, x = item.width / 2, y = item.height / 2, button = Qt.LeftButton, modifiers = Qt.NoModifier, delay = -1)
Имитирует двойной щелчок кнопки мыши button с необязательными modifier на элементе item. Позиция клика определяется x и y. Если x и y не определены, позиция будет в центре item. Если указано delay, тест подождёт указанное количество миллисекунд до нажатия и отпускания кнопки.
Позиция, заданная x и y, преобразуется из системы координат item в координаты окна и затем передаётся. Если item скрыт другим элементом или элемент, являющийся потомком item, занимает эту позицию, событие будет передано этому другому элементу.
См. также mouseDoubleClickSequence(), mousePress(), mouseRelease(), mouseClick(), mouseMove(), mouseDrag() и mouseWheel().
mouseDoubleClickSequence(item, x = item.width / 2, y = item.height / 2, button = Qt.LeftButton, modifiers = Qt.NoModifier, delay = -1)
Имитирует полную последовательность событий, генерируемых двойным щелчком мыши с необязательной клавишей модификатора по элементу item.
Этот метод воспроизводит последовательность событий мыши, генерируемых при двойном щелчке пользователем: Нажатие-Отпускание-Нажатие-Двойной щелчок-Отпускание.
Позиция щелчка определяется значениями x и y. Если x и y не определены, позиция будет центром элемента item. Если задано delay, тест подождёт указанное количество миллисекунд перед нажатием и отпусканием кнопки.
Позиция, заданная значениями x и y, преобразуется из системы координат элемента item в систему координат окна и затем доставляется. Если элемент item скрыт другим элементом или дочерний элемент item занимает эту позицию, событие будет доставлено другому элементу вместо этого.
Этот метод QML был представлен в Qt 5.5.
См. также mouseDoubleClick(), mousePress(), mouseRelease(), mouseClick(), mouseMove(), mouseDrag() и mouseWheel().
mouseDrag(item, x, y, dx, dy, button = Qt.LeftButton, modifiers = Qt.NoModifier, delay = -1)
Имитирует перетаскивание мыши по элементу item с нажатой кнопкой button и необязательными клавишами модификации. Начальная позиция перетаскивания определяется значениями x и y, а расстояние перетаскивания — значениями dx и dy. Если задано delay, тест подождёт указанное количество миллисекунд перед отпусканием кнопки.
Позиция, заданная значениями x и y, преобразуется из системы координат элемента item в систему координат окна и затем доставляется. Если элемент item скрыт другим элементом или дочерний элемент item занимает эту позицию, событие будет доставлено другому элементу вместо этого.
Примечание: этот метод не подразумевает действие сбрасывания. Для выполнения действия сбрасывания необходимо дополнительно вызвать mouseRelease(item, x + dx, y + dy).
См. также mousePress(), mouseClick(), mouseDoubleClick(), mouseDoubleClickSequence(), mouseMove(), mouseRelease() и mouseWheel().
mouseMove(item, x, y, delay = -1)
Перемещает указатель мыши в позицию, заданную значениями x и y внутри элемента item. Если задано значение delay (в миллисекундах), тест подождёт перед перемещением указателя мыши.
Позиция, заданная значениями x и y, преобразуется из системы координат элемента item в систему координат окна и затем доставляется. Если элемент item скрыт другим элементом или дочерний элемент item занимает эту позицию, событие будет доставлено другому элементу вместо этого.
См. также mousePress(), mouseRelease(), mouseClick(), mouseDoubleClick(), mouseDoubleClickSequence(), mouseDrag() и mouseWheel().
mousePress(item, x = item.width / 2, y = item.height / 2, button = Qt.LeftButton, modifiers = Qt.NoModifier, delay = -1)
Имитирует нажатие кнопки мыши button с необязательными клавишами модификации на элементе item. Позиция определяется значениями x и y. Если x или y не определены, позиция будет центром элемента item. Если задано delay, тест подождёт указанное количество миллисекунд перед нажатием.
Позиция, заданная значениями x и y, преобразуется из системы координат элемента item в систему координат окна и затем доставляется. Если элемент item скрыт другим элементом или дочерний элемент item занимает эту позицию, событие будет доставлено другому элементу вместо этого.
См. также mouseRelease(), mouseClick(), mouseDoubleClick(), mouseDoubleClickSequence(), mouseMove(), mouseDrag() и mouseWheel().
mouseRelease(item, x = item.width / 2, y = item.height / 2, button = Qt.LeftButton, modifiers = Qt.NoModifier, delay = -1)
Имитирует отпускание кнопки мыши button с необязательными клавишами модификации на элементе item. Позиция отпускания определяется значениями x и y. Если x или y не определены, позиция будет центром элемента item. Если задано delay, тест подождёт указанное количество миллисекунд перед отпусканием кнопки.
Позиция, заданная значениями x и y, преобразуется из системы координат элемента item в систему координат окна и затем доставляется. Если элемент item скрыт другим элементом или дочерний элемент item занимает эту позицию, событие будет доставлено другому элементу вместо этого.
См. также mousePress(), mouseClick(), mouseDoubleClick(), mouseDoubleClickSequence(), mouseMove(), mouseDrag() и mouseWheel().
mouseWheel(item, x, y, xDelta, yDelta, button = Qt.LeftButton, modifiers = Qt.NoModifier, delay = -1)
Имитирует вращение колеса мыши по элементу item с нажатой кнопкой button и необязательными клавишами модификации. Позиция события колеса мыши определяется значениями x и y. Если задано delay, тест подождёт указанное количество миллисекунд перед отпусканием кнопки.
Позиция, заданная значениями x и y, преобразуется из системы координат элемента item в систему координат окна и затем доставляется. Если элемент item скрыт другим элементом или дочерний элемент item занимает эту позицию, событие будет доставлено другому элементу вместо этого.
Значения xDelta и yDelta содержат расстояние поворота колеса в восьмых градусах. Смотрите QWheelEvent::angleDelta() для получения дополнительной информации.
См. также mousePress(), mouseClick(), mouseDoubleClick(), mouseDoubleClickSequence(), mouseMove(), mouseRelease(), mouseDrag() и QWheelEvent::angleDelta().
skip(message = "")
Пропускает текущий тестовый случай и выводит необязательное сообщение message. Если это тест с данными, то пропускается только текущая строка. Аналогично QSKIP(message) в C++.
sleep(ms)
Засыпает на ms миллисекунд без обработки событий Qt.
См. также wait() и waitForRendering().
tryCompare(obj, property, expected, timeout = 5000, message = "")
Прерывает текущий тестовый случай, если указанное свойство property объекта obj не совпадает с 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().
verify(condition, message = "")
Прерывает текущий тестовый случай, если условие condition ложно, и отображает необязательное сообщение message. Аналогично QVERIFY(condition) или QVERIFY2(condition, message) в C++.
wait(ms)
Ожидает ms миллисекунд, обрабатывая события Qt.
См. также sleep() и waitForRendering().
waitForRendering(item, timeout = 5000)
Ожидает timeout миллисекунд или до отрисовки item рендерером. Возвращает true, если item отрисовано за timeout миллисекунд, в противном случае возвращает false. Значение timeout по умолчанию равно 5000.
warn(message)
Выводит message в качестве предупреждения. Аналогично QWARN(message) в C++.
См. также ignoreWarning().
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.6/qml-qttest-testcase.html