软件自动化测试范畴很广,理论我就不说了,只针对我这次选的题目——Java自定义组件的测试,从Java事件机制的基础说起,其中有一小部分关于开源软件测试框架Abbot的简单介绍
还是先说说Abbot吧,Abbot可以支持Java GUI组件从单元测试到集成测试,简单地说,单元测试时,你可以使用Abbot的一些类库,把你要测试的GUI扔给某个方法,然后Abbot可以查找某个组件,比如特定按钮,然后对那个按钮调用一下 click(我的按钮),就可以实现“点击”的效果, 你会看到屏幕上的鼠标移动到那个按钮上并点击,很有趣吧,当然你可以手工编写一堆代码控制鼠标移动到那个按钮上并点击,但是那样很麻烦,Abbot帮你封装了很多底层的操作。
对于一个已经做好的GUI,Abbot也可以进行脚本录制,也就是你在你的GUI上操作,Abbot自动记下你的动作,以脚本形式保存起来,以后你还可以进行重放。下面是官方介绍的一部分翻译:
Abbot 框架
abbot提供了一个框架测试你的GUI代码,而不用考虑你的代码的当前状态。如果你喜欢进行测试驱动的开发,那么abbot提供相关工具为你生成单元测试代码。如果你已经有一堆代码但不是基于单元测试的,abbot也可以帮你生成脚本
总的来说,abbot测试首先要获得组件的引用,然后要么模拟用户操作,要么对组件的状态进行断言。abbot提供ComponentReference获得组件的句柄,以及扩展的、类似robot的对象,用来模拟用户行为。这些操作既可以通过脚本,也可以通过java代码来实现
abbot的目标:
1.用户输入的可靠重现
GUI测试不彻底的一大原因就是不能很好的重现用户输入
2.利用脚本控制动作
使用动态解析的脚本,省去了写新的测试代码的麻烦,并且这些脚本还能直接调用java单元测试的代码
3.降低组件之间的绑定
如果修改了原有的GUI布局,组件的位置、大小改变了,那么之前的测试代码可能会失效(比如找不到新的组件位置)在不同平台下,组件的位置大小都可能改变,那样测试框架就不能跨平台了。abbot使用查询机制,只要能查询到组件,即使位置大小改变了,abbot一样可以运行
4.底层使用低级的操作系统事件来实现高级的语义行为
java.awt.robot提供了便利的方法直接生成事件,但是其功能太过基础,不方便使用,abbot在其上抽象出方便的接口(正如Swing对基本窗口的抽象一样)。通过抽象语句,你可以很容易的推断出测试代码的功能,比如像下面这样:
Click on 100, 100
Move to 110, 110
Press down key
Press down key
Click on 110, 110
Select "blue" from the color list
5.支持动态录制高级语义事件
你可以手工编辑xml文件,也可以一条条修改测试语句,但是有了Costello editor ,电脑会帮你记录所有用户动作,并自动生成脚本
6.用户动作的记录和生成是可扩展的
你可以自己扩展上述框架,以支持自定义的组件。虽然说用基本的robot可以在不修改测试代码的情况下测试任何东西,不过使用扩展的好处在于:你的代码更加抽象,就好像调用CalRow(10)而不是click(x,y),其中x、y指的是第10行的中心坐标