假设我有许多 QML 组件。
它们与我用 C++ 编写并以某种方式公开的组件或 a QObject
(假设它是一个数据源,但可以是任何东西,甚至是带有方法的旧Horse
// Animal
)一起工作。Dog
bark()
main.cpp
虽然适当的单元测试当然会存根它,但我可能想编写一个集成测试以查看它们是否可以很好地协同工作。
然后我将如何使它们可见qmltestrunner
?
如果根本不可能,那么一种最佳方法是如何对 QML 和 C++ 组件进行集成测试?
假设我有许多 QML 组件。
它们与我用 C++ 编写并以某种方式公开的组件或 a QObject
(假设它是一个数据源,但可以是任何东西,甚至是带有方法的旧Horse
// Animal
)一起工作。Dog
bark()
main.cpp
虽然适当的单元测试当然会存根它,但我可能想编写一个集成测试以查看它们是否可以很好地协同工作。
然后我将如何使它们可见qmltestrunner
?
如果根本不可能,那么一种最佳方法是如何对 QML 和 C++ 组件进行集成测试?
我已经解决了集成测试的问题(除了您描述的问题之外,对我来说,QML 文件还需要资源文件中的内容,如果我通过基于文件的访问需要组件,则无法找到这些内容,一样)通过在 my中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);
}
}