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 Тесты доступны по коммерческим лицензиям от The Qt Company. Кроме того, они доступны по лицензиям свободного ПО. Начиная с Qt 5.4, эти лицензии свободного ПО — GNU Lesser General Public License, version 3 или GNU General Public License, version 2. Для получения дополнительной информации см. Qt Licensing.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/qtquicktest-index.html