Предположим, у меня есть несколько компонентов QML.
Они работают с компонентом или QObject
(предположим, что это источник данных, но может быть что угодно, даже старый Horse
/Animal
/Dog
с методом bark()
), что я написал в C ++, и я выставляю в моем main.cpp
как-то.
В то время как правильный модульный тест, конечно, заглушить его, я могу написать интеграционный тест чтобы увидеть, что они хорошо играют вместе.
Как бы я тогда сделал их видимыми для qmltestrunner
?
Если это вообще невозможно, как лучше подходить к интеграционному тестированию компонентов QML и C ++?
Я решил проблему интеграционного тестирования (в которой, помимо описанной вами проблемы, у меня также была проблема с файлами QML, требующими содержимого в файле ресурсов, которое не будет найдено, если мне потребуются компоненты через файловый доступ, как qmltestrunner
делает) имея флаг TEST_RUNNER
в моем main.cpp
который определяет, следует ли запускать обычное приложение или quick_test_main
должно быть начато (quick_test_main
будучи программно доступным ядром или qmltestrunner
). Это выглядит следующим образом:
// define to enable the test harness
#define TEST_RUNNER
#ifdef TEST_RUNNER
#include <QtQuickTest/quicktest.h>
#endif
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
// register components here as you're already doing
#ifndef TEST_RUNNER
// not defined: regular application start
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml")));
return app.exec();
#else
// adapt path accordingly
return quick_test_main(argc, argv, "MyTests", "../my_qmltests_path/");
#endif
}
Тестовый пример выглядит следующим образом (обратите внимание, что я загружаю компонент через путь к ресурсу, потому что так работает мое приложение; загрузка через файл не сможет загрузить ресурсы, необходимые для файлов QML …):
import QtQuick 2.0
import QtTest 1.0
TestCase {
name: "MainMenu"
Loader {
id: main_loader
source: "qrc:/qml/main.qml"}
function test_on_off(){
wait(3000);
}
}