集成测试:使 C++ 组件对 `qmltestrunner` 可见

Posted

技术标签:

【中文标题】集成测试:使 C++ 组件对 `qmltestrunner` 可见【英文标题】:Integration testing: making C++ components visible to `qmltestrunner` 【发布时间】:2015-09-12 06:57:02 【问题描述】:

假设我有许多 QML 组件。

他们使用我写的组件或QObject(假设它是一个数据源,但可以是任何东西,甚至是旧的Horse/Animal/Dog 和方法bark()) C++ 和我以某种方式暴露在我的main.cpp 中。

虽然适当的单元测试当然会存根它,但我可能想编写一个集成测试来看看它们一起玩得很好。

然后我如何使它们对qmltestrunner 可见?

如果根本不可能,如何最好地进行 QML 和 C++ 组件的集成测试?

【问题讨论】:

【参考方案1】:

我已经解决了集成测试的问题(除了您描述的问题之外,对我来说,QML 文件还需要资源文件中的内容,如果我通过文件需要组件,则找不到这些内容基于访问,就像qmltestrunner 所做的那样)通过在我的main.cpp 中有一个标志TEST_RUNNER 来确定是否应该启动常规应用程序或是否应该启动quick_test_mainquick_test_main 是可编程访问的核心或@987654326 @)。它看起来如下:

// 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);
    

【讨论】:

...这花了您 三年? ;-) 代表下一个偶然发现此问题的人感谢您。

以上是关于集成测试:使 C++ 组件对 `qmltestrunner` 可见的主要内容,如果未能解决你的问题,请参考以下文章

第1664期Vue组件库工程探索与实践之单元测试

组件 vs 集成 vs 功能测试

将 C 组件集成到 C++ 框架中的最佳实践是啥?

SpringBoot2 游戏集成测试组件有哪些方法?

如何自动化集成测试?

SpringBoot2 游戏集成测试组件有哪些方法?