运行QtQuickTest单元测试

时间:2016-07-05 10:40:28

标签: qt unit-testing qml

QtQuickTest docs并未明确说明如何引用其他组件,对其进行测试等。

编写tst_foo.qml,在其中定义一个GUI对象和TestCase相对简单,该对象运行称为test_*的函数,用于检查GUI对象的各个方面,但这不是现实世界的情况。您可以让您的组件在称为tst_*的文件中进行测试。所以我的问题是:

  • 测试仪自动运行名为tst_*.qml的所有QML文件。这意味着有单独测试的单独的 qml文件。但到目前为止,我只能做this person所做的事情:将要测试的QML对象重命名为tst_foo.qml并在其中定义TestCase。所以随后的问题是:
  • 您是否应该在GUI元素中定义TestCase并从tst_foo.qml文件中调用它?如果是这样,怎么样?
  • 或者您是否应该在TestCase内定义引用GUI组件的tst_foo.qml?如果是这样,怎么样?

另一个问题是单元测试的QML加载器似乎使用QQuickView,因此它只能加载从QQuickItem派生的项目。那么你如何测试ApplicationWindow?在这种情况下,将QML文件重命名为tst_mainApp.qml甚至无法正常工作:&#34; QQuickView仅支持加载源自QQuickItem的根对象。&#34; < / p>

1 个答案:

答案 0 :(得分:1)

  

您是否应该在GUI元素中定义TestCase并从tst_foo.qml文件中调用它?如果是这样,怎么样?

不,绝对不是。

  

或者您是否应该在tst_foo.qml中定义一个引用GUI组件的TestCase?如果是这样,怎么样?

取决于GUI对象的位置。如果它有自己的导入,则可以使用-imports参数来测试可执行文件,如文档here所示。您还可以在测试的IMPORTPATH文件中使用qmake .pro变量,如此处所述。您的测试可能如下所示:

import QtQuick 2.6
import QtTest 1.0

import MyImport 1.0

TestCase {
    id: testCase
    name: "Untitled"
    width: 200
    height: 200
    when: windowShown

    Component {
        id: myItemComponent

        MyItem {
            // ...
        }
    }

    function test_stuff() {
        var myItem = myItemComponent.createObject(testCase);
        verify(myItem);

        // test myItem

        myItem.destroy();
    }
}

如果您想测试自己编写的按钮(如您所编写的按钮),则此方法可以正常工作。这就是大多数Qt Quick Controls&#39;例如,测试工作。

但是,如果您想以与用户交互方式相同的方式测试应用程序,您有两个选择(我知道):

  1. 使用Squish等测试工具。我还没有使用过它,但就尽可能接近用户与应用程序的交互而言,它很难被击败。它的工作原理是记录开发人员的输入,然后重播&#34; on&#34;运行测试时的应用程序。

  2. 在我的最新项目中,我决定尝试测试应用程序中使用的完全相同的QML。为此,您需要使用C ++编写测试,并且应用程序的C ++ / QML必须构建两次:如果您正在构建应用程序,则需要构建一次;如果您正在构建测试,则需要构建一次。它工作得很好,但我的应用程序并不是那么大,因此构建起来并不需要很长时间。

  3. 第二个选项可能更强大,因为在C ++中编写测试时你有很大的灵活性,但它需要更多的Qt知识。

      

    另一个问题是单元测试的QML加载器似乎使用QQuickView,因此它只能加载从QQuickItem派生的项目。那么如何测试ApplicationWindow?

    您需要使用Qt Test为此编写C ++测试,然后使用QQmlEngineQQmlApplicationEngine加载UI。有关示例,请参阅this test。但是,您不应该测试ApplicationWindow,除非您正在使用我上面提到的方法。