android自动化测试unity|android自动化测试unity,基于Unity3D引擎的UI自动化测试方案

一、基本思路
熟悉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对象的各种组件属性的Set、Get
UI对象的属性的Get
屏幕的Touch等事件
4、API层设计
API层是封装整个自动化测试的所有原子操作,让自动化测试框架的UI对象层、业务逻辑层和用户测试脚本层不用关心原子操作是如何实现的,这样就可以与其他测试框架兼容。
5、UI对象层设计
UI对象层是根据UI对象来封装这个对象的一些属性和方法,这样可以让上层不用再去关心这些属性和方法具体是如何实现。
这一层在减少上层的程序复杂性的同时还可以将UI对象的一些属性(例如tag、id、name等)进行封装,这样可以减少上层对具体的tag等属性的依赖,这样就可以减少在游戏代码有变动的时候的工作量,同时也会减轻自动化框架移植去测试其他游戏时代码迁移的工作量。
6、业务逻辑层设计
业务逻辑层是为了进一步提供用户脚本的稳定性,将常用业务逻辑进行封装,减少业务逻辑的变化对脚本稳定性的影响。
【android自动化测试unity|android自动化测试unity,基于Unity3D引擎的UI自动化测试方案】例如:登录、查看公告、开局等等

    推荐阅读