这一部分讨论Squish的一个先进并且强大的特性——如何创建提供应用程序绑定的包装器。
自动动态绑定:
从Squish4.0开始,已经加强了对Squish绑定的支持。对于Java和基于Qt的应用程序,Squish现在可以动态的创建包装器,它可以自动的为所有的标准库对象提供绑定,这些库对象供AUT使用,也为AUT自己的自定义类提供绑定。用Java的时候,甚至不是自动动态绑定的类可以使用Java的自省功能来访问。这意味着在大多数情况下,没有必要创建自定义绑定。
对于Qt AUT的绑定,Squish将会自动绑定slots和属性(甚至为可安装的信号绑定句柄)。slots是类public slots: 的成员函数;使用Qt的Q_PROPERTY宏声明属性。如果想绑定原始方法,最简单的就是将它们声明为slots。然而,如果不想让方法设为slots,或者想绑定全局函数,可以按照该部分的说明的方法创建自己的绑定。
Squish已经带有其支持的GUI工具包的完整的脚本绑定,如Qt 和 Java AWT/Swing 和 Java SWT。这测试工程师就有机会访问这些工具包提供的所有的widgets、functions、和properties。对于AUT使用的任意标准对象(例如widgets),使用这些脚本绑定,可以检索和这事对象属性、调用对象方法。这使得实现复杂的和稳定的测试脚本成为可能,该测试脚本可以使用验证点验证应用程序的状态和行为的。
在大多数情况下,Squish提供的脚本绑定足够使用了。但是在一些情况下,可能需要访问AUT中定义的对象或者AUT使用的组件中的对象,但是该组件又不在GUI工具包的标准类中。对于Squish 4.0不是问题,因为从这个版本开始,AUT类的绑定是Squish自动创建的。但是对于早期的版本,必须手动实现。
为什么我们要访问自定义AUT组件而非那些AUT内置的GUI工具包呢?因为有时我们想访问附加的自定义属性或者调用自动以组件提供的自定义方法。例如,我们可能想测试一个CAD应用程序,它的自定义Canvas widget是一个key组件。为了提供有综合力的测试,我们想能够获取自定义Canvas来验证测试已经画好的对象是正确的。
为了这个目的,Squish提供了一个非常强大的机制,它可以组装C++代码以及为之创建脚本绑定。设置了绑定之后可以调用函数和访问应用程序中声明的属性,同时又不改变应用程序本身。
这个部分将会给出一个例子,用来展示如何创建绑定使得测试脚本可以访问AUT的API。我们将会一步一步教你做,因此你可以看到如何组装应用程序。
例如,将使用canvas例子,canvas使用了Qt,对于Qt3存放在examples/qt3/canvas下,对于Qt4存放在examples/qt/canvas下。
这个程序是一个非常简单的矢量绘图应用程序。通过点击canvas视图,即插入一个新的矩形。拖动(点击并按下左键移动)可移动矩形。
为了验证canvas是否正确的插入和移动,需要访问它的API,这样我们可以查询它们的大小和位置。
Ⅰ.20.1 组装和包装
为了创建绑定我们必须组装AUT或附加的组件,然后生成一个绑定库(也叫做包装器库)。
首先我们将要组装应用程序。使用squishidl工具可以实现这个功能,这个工具解析C++头文件并产生绑定代码,该绑定代码将应用程序的API透漏给脚本语言。这个工具提供了许多命令行选项。代替手动为每个文件运行squishidl,我们使用frglogic的编译工具(叫’build‘),这个编译工具相当的简化了任务。‘build’使用了一个类JavaScript语言来描述编译规则和目标,是一种便携式的替代品。
编译包装器:
尽管为应用程序你没有使用build,我们还是推荐使用它来生成绑定库。
为了使用build来创建应用程序绑定,在应用程序的源代码所在路径下创建一个名为Buildroot的文件。这个文件必须有单独的一行包含Squish安装路径的绝对路径。例如,如果Squish已经安装在了/usr/local/squish下,Buildroot文件将会包含这样一行:
/usr/local/squish
这将会确保build可以定位到创建一个绑定库所有需要的文件。
所需的源编译:
尽管使用Squish的一个二进制版本,还是需要源格式的Squish来创建绑定——特别是src自路径。这是必须的,因为源代码包含文件和信息,这些信息对于解决对外部库的依赖性是有必要的,而这些外部库在编译期间是必须的。
当build运行时,除了寻找知道Squish在哪的Buildroot文件,还要寻找一个名叫Buildsub的