基于Unity3D引擎的UI自动化测试方案

发表于2016-01-21
评论3 5.8k浏览


一、       基本思路

熟悉Unity3D开发后就会发现,游戏的每个场景都有一个UI树,而通过这个UI树的根节点可以遍历整个UI树的所有UI对象。而Unity3D是通过挂载脚本的方式来控制游戏逻辑的,因此我们可以在场景的UI树的跟对象上挂载脚本来获取整个UI树的所有UI对象。再通过GameObject的GetComponent方法来获取我们需要的组件,利用组件属性的Get、Set方法来操控游戏UI对象,而不需要修改游戏代码。

然后我们再通过Socket接口来连接自动化测试框架和挂载在游戏上的脚本,使自动化框架可以操控游戏对象。对于一些Unity3D组件较难模拟的事件,例如touch事件、重力感应事件等,我们可以通过编写一个Android插件的形式来模拟Android事件,然后在Unity3D脚本中调用Android插件即可。


二、       意义及优势

1、     Unity3D引擎日渐成为主流,对基于Unity3D引擎的游戏的自动化非常有必要

2、     基于引擎的自动化测试不需要修改游戏代码,不会带入第三方bug

3、     基于引擎自动化东距可以跨平台(Android插件这部分不能跨平台)

4、     SDK和自动化框架基于Socket传送数据,对自动化框架没有平台要求

5、     可以兼容其他的自动化测试框架。


三、       具体方案

1、基于Unity3D引擎的游戏结构

首先一个游戏可以有多个场景,但是每次Application只载入一个场景。

场景中可以挂载多层Gameobject树形结构,每个游戏UI对象都是一个GameObject对象。

对于不同UI对象,GameObject添加不同的组件来体现不同的特性。

游戏逻辑是通过脚本来实现的,而脚本直接挂载到对应的GameObject上,通过挂载的GameObject的创建来启动执行脚本。

下图的左图就是一个场景的UI树结构,右图是其中一个UI对象的组件列表。

   

从上文我们就很容易想到通过遍历UI树来找到我需要的UI对象,然后遍历对象的组件列表找到我们需要的组件,在通过组件属性的Get、Set方法来操控UI对象。从而到达我们需要的自动化测试需求。

2、     基于Unity3D引擎的UI自动化测试系统架构图:

游戏App中的SDK为挂载在场景根目录上遍历游戏对象的脚本,负责按需求操控游戏UI对象;Socket服务器负责接收PC端自动化框架发送过来的需求指令,并转发给SDK做相应操作,并将SDK操作的结果返回给PC端。

自动化测试框架中的Socket客户端负责将API层的测试需求指令发送给游戏App,并接收游戏App返回的处理结果返回给API层;API层封装整个游戏自动化测试中的所有原子操作;往上封装了UI对象层、业务逻辑层,这两层按UI对象和业务逻辑对游戏的一些对象方法和逻辑方法封装,便于用户测试脚本按需调用。用户测试脚本可以根据需要调用业务逻辑层封装好的业务逻辑方法和API的原子操作。

3、     SDK设计

由于每次程序只会加载一个场景,所以我们可以通过将SDK脚本挂载到所有场景的根UI对象上,我们就可以通过this.transform的FindChild找到场景中所有的UI对象,然后就可以通过GetComponent来取到我们所需的组件。

主要接口:

通过UI路径、屏幕位置来获取UI对象

UI对象的各种组件属性的SetGet

UI对象的属性的Get

屏幕Touch事件

4     API层设计

API层是封装整个自动化测试的所有原子操作,让自动化测试框架的UI对象层、业务逻辑层和用户测试脚本层不用关心原子操作是如何实现的,这样就可以与其他测试框架兼容。

5     UI对象层设计

  UI对象层是根据UI对象来封装这个对象的一些属性和方法,这样可以让上层不用再去关心这些属性和方法具体是如何实现

  这一层在减少上层的程序复杂性同时还可以将UI对象的一些属性例如tagidname进行封装这样可以减少上层对具体tag等属性的依赖,这样就可以减少在游戏代码有变动的时候的工作量同时也会减轻自动化框架移植测试其他游戏时代码迁移的工作量

6     业务逻辑层设计

  业务逻辑层是为了进一步提供用户脚本的稳定性,将常用业务逻辑进行封装,减少业务逻辑的变化对脚本稳定性的影响。

 

例如:登录、查看公告、开局等等

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

0个评论