Qt Quick Test
Введение
Qt Quick Test — это фреймворк для модульных тестов приложений QML. Тестовые кейсы написаны как функции JavaScript внутри типа TestCase:
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_ , обрабатываются как тестовые кейсы для выполнения. Для получения дополнительной информации о написании тестовых кейсов обратитесь к документации типов TestCase и SignalSpy.
Примечание: Для модуля Qt Quick Test не гарантируется бинарная совместимость. Это означает, что приложение, использующее Qt Quick Test, гарантированно будет работать только с версией Qt, на которой оно было разработано. Однако гарантируется совместимость исходного кода.
Использование модуля
QML API
Типы QML в Qt Quick Test доступны через импорт QtTest. Для использования типов добавьте следующую инструкцию импорта в свой файл .qml:
import QtTest
C++ API
Использование C++ API требует подключения к библиотеке модуля, либо напрямую, либо через другие зависимости. Несколько инструментов сборки поддерживают это, включая CMake и qmake.
Сборка с CMake
Используйте команду find_package() для поиска необходимых компонентов модуля в пакете Qt6:
find_package(Qt6 COMPONENTS QuickTest REQUIRED) 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» — идентификатор для уникальной идентификации этого набора тестов. Наконец, добавьте CONFIG += qmltestcase в файл проекта:
TEMPLATE = app TARGET = tst_example CONFIG += warn_on qmltestcase SOURCES += tst_example.cpp
Тестовая утилита рекурсивно сканирует указанную исходную директорию на наличие файлов «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 в командную строку тестовой программы.
Если IMPORTPATH указано в вашем файле .pro, каждый путь к импорту, добавленный в IMPORTPATH , будет передан в качестве аргумента командной строки при запуске теста с помощью «make check»:
IMPORTPATH += $$PWD/../imports/my_module1 $$PWD/../imports/my_module2
Команда -functions командной строки вернёт список текущих тестовых функций. Можно запустить одну тестовую функцию, используя имя тестовой функции в качестве аргумента. Например:
tst_example Test_Name::function1
Команда -help командной строки вернёт все доступные опции.
tst_example -help
Выполнение C++ кода перед QML тестами
Для выполнения C++ кода перед запуском любого QML теста можно использовать макрос QUICK_TEST_MAIN_WITH_SETUP. Это может быть полезно для установки свойств контекста в QML движке, среди прочего.
Макрос идентичен QUICK_TEST_MAIN, за исключением того, что он принимает дополнительный QObject* аргумент. Тестовый фреймворк будет вызывать слоты и вызываемые функции с следующими именами:
| Имя | Назначение | С версии |
|---|---|---|
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>
class Setup : public QObject
{
Q_OBJECT
public:
Setup() {}
public slots:
void qmlEngineAvailable(QQmlEngine *engine)
{
engine->rootContext()->setContextProperty("myContextProperty", QVariant(true));
}
};
QUICK_TEST_MAIN_WITH_SETUP(mytest, Setup)
#include "src_qmltest_qquicktest.moc" Включённое .moc основано на имени файла .cpp файла. Например, в примере выше файл .cpp имеет имя src_qmltest_qquicktest.cpp. Если бы файл был назван MyTest.cpp, включённый код был бы:
#include "MyTest.moc"
Справочник
Лицензии
Qt Quick Tests доступен по коммерческим лицензиям от The Qt Company. Кроме того, он доступен по лицензиям свободного программного обеспечения. Начиная с Qt 5.4, эти лицензии свободного программного обеспечения — GNU Lesser General Public License, версия 3 или GNU General Public License, версия 2. Дополнительные сведения см. в Qt Licensing.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.0/qtquicktest-index.html