QtQuickTest docs并未明确说明如何引用其他组件,对其进行测试等。
编写tst_foo.qml
,在其中定义一个GUI对象和TestCase
相对简单,该对象运行称为test_*
的函数,用于检查GUI对象的各个方面,但这不是现实世界的情况。您可以让您的组件在不称为tst_*
的文件中进行测试。所以我的问题是:
tst_*.qml
的所有QML文件。这意味着有单独测试的单独的 qml文件。但到目前为止,我只能做this person所做的事情:将要测试的QML对象重命名为tst_foo.qml
并在其中定义TestCase
。所以随后的问题是:TestCase
并从tst_foo.qml
文件中调用它?如果是这样,怎么样?TestCase
内定义引用GUI组件的tst_foo.qml
?如果是这样,怎么样?另一个问题是单元测试的QML加载器似乎使用QQuickView
,因此它只能加载从QQuickItem
派生的项目。那么你如何测试ApplicationWindow
?在这种情况下,将QML文件重命名为tst_mainApp.qml
甚至无法正常工作:&#34; QQuickView仅支持加载源自QQuickItem的根对象。&#34; < / p>
答案 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;例如,测试工作。
但是,如果您想以与用户交互方式相同的方式测试应用程序,您有两个选择(我知道):
使用Squish等测试工具。我还没有使用过它,但就尽可能接近用户与应用程序的交互而言,它很难被击败。它的工作原理是记录开发人员的输入,然后重播&#34; on&#34;运行测试时的应用程序。
在我的最新项目中,我决定尝试测试应用程序中使用的完全相同的QML。为此,您需要使用C ++编写测试,并且应用程序的C ++ / QML必须构建两次:如果您正在构建应用程序,则需要构建一次;如果您正在构建测试,则需要构建一次。它工作得很好,但我的应用程序并不是那么大,因此构建起来并不需要很长时间。
第二个选项可能更强大,因为在C ++中编写测试时你有很大的灵活性,但它需要更多的Qt知识。
另一个问题是单元测试的QML加载器似乎使用QQuickView,因此它只能加载从QQuickItem派生的项目。那么如何测试ApplicationWindow?
您需要使用Qt Test为此编写C ++测试,然后使用QQmlEngine
或QQmlApplicationEngine
加载UI。有关示例,请参阅this test。但是,您不应该测试ApplicationWindow
,除非您正在使用我上面提到的方法。