Unity 测试调研
我们要测试的是前端 APP。测试前端 APP 有若干种方式,“单元测试”是最贴近“白盒测试”的方式,因为需要测试人员熟悉、理解前端的设计和 Unity 框架中代码的运行逻辑;而“模拟测试”则是最贴近“黑盒测试”的方式,测试人员只需要以正常用户的身份使用 APP 即可,当然,这种“使用”的方式既可以是真正的使用,也可以是使用一些自动化工具来进行自动化测试。以下简单介绍对两种方式对 Unity APP 的使用方法。
Unity 测试框架包
Unity 测试框架包(Unity Test Framework,UTF)是一款工具,可在“编辑模式”和“播放模式”下以及在目标平台(如独立平台、Android 或 iOS)上测试代码。
常规 NUnit 测试(在“编辑模式”和“播放模式”下运行):
[Test]
public void GameObject_CreatedWithGiven_WillHaveTheName()
{
var go = new GameObject("UMetaObject");
Assert.AreEqual("UMetaObject", go.name);
}
“播放模式”下的示例:
[UnityTest]
public IEnumerator GameObject_WithRigidBody_WillBeAffectedByPhysics()
{
var go = new GameObject();
go.AddComponent<Rigidbody>();
var originalPosition = go.transform.position.y;
yield return new WaitForFixedUpdate();
Assert.AreNotEqual(originalPosition, go.transform.position.y);
}
“编辑模式”下的示例:
[UnityTest]
public IEnumerator EditorUtility_WhenExecuted_ReturnsSuccess()
{
var utility = RunEditorUtilityInTheBackgroud();
while (utility.isRunning)
{
yield return null;
}
Assert.IsTrue(utility.isSuccess);
}
通过 Test Runner API 从任何脚本以编程方式运行测试。可以检索将在“编辑模式”、“播放模式”或同时在这两种模式下运行的测试的列表(不运行它们)。可以在每个测试的开始和结束、测试周期(即整个测试程序集)中的每个级别、每个单独的测试固定例程以及每个测试类和测试上挂接一些注册/取消注册回调。
在每个测试开始时,可以获得有关将要运行的测试路线的信息。测试完成后,可以看到测试结果。
除了在 Unity Editor 中以“播放模式”运行 UTF 之外,还可以使用新的自定义点在目标设备上运行它。这是在构建 Player 之前调用的;可以修改 Player 构建选项,例如,更改测试运行设置和指定构建位置。
void Execute(ExecutionSettings executionSettings);
void RegisterCallbacks<T>(T testCallbacks, int priority = 0) where T : ICallbacks;
void UnregisterCallbacks<T>(T testCallbacks) where T : ICallbacks;
void RetrieveTestList(TestMode testMode, Action<ITestAdaptor> callback);
Airtest
AirtestIDE 是网易开发的跨平台的UI自动化测试编辑器,适用于游戏和 App,支持自动化脚本录制、一键回放、报告查看,轻而易举实现自动化测试流程;支持基于图像识别的 Airtest 框架,适用于所有 Android / iOS / Windows 应用;支持基于 UI 控件搜索的 Poco 框架,适用于 Unity3d ,Cocos2d 与 Android / iOS App 等多种平台;能够运行在Windows、MacOS、Linux平台上。
1. 连接设备
1)连接 Android 手机
通过 ADB 连接电脑和 Android 手机,即可开始调试 Android 应用。
打开 AirtestIDE,按照以下步骤进行连接:
- 打开手机
设置-开发者选项-USB调试
开关; - 在 AirtestIDE 设备面板中点击
refresh ADB
按钮,查看连接上的设备 - 能够成功看到设备后,点击对应设备的
Connect
按钮,进行初始化
手机连接成功后,即可在 AirtestIDE 中看到手机屏幕的镜像显示,并对手机画面进行实时操作。
2)连接 Windows 窗口
对于 Windows 桌面程序的测试,AirtestIDE 可以将被测窗口嵌入,方便脚本录制和调试。
- 在 AirtestIDE 设备面板中点击
选择游戏画面
按钮 - 将鼠标移动到被测程序的窗口上,会显示红色边框,将对应的窗口框出
- 单击鼠标左键即可将对应的窗口嵌入到 AirtestIDE 中
- 也可以点击
搜索窗口
按钮,选择对应标题的窗口,然后点击连接
3)连接 iOS 手机
要连接 iOS 手机,需要先准备好一台安装了 Xcode 的 Mac。
2. 录制自动化脚本
连上设备后即可录制自动化测试脚本。
1)模拟输入
模拟输入的意思即为模仿人的操作去点击设备上的某个指定位置。
① 基于图像识别
Airtest 支持通过图像识别的方式,找到想要点击的位置并进行操作,非常高级!
也可以点击左侧辅助窗上的touch
按钮,然后在设备窗口上框选精确的图标,也可以自动生成一条touch
语句。
类似的模拟输入操作还有滑动:点击swipe
按钮,在设备窗口上框选精确的图标作为滑动起点,然后点击滑动终点位置,即会自动生成一个swipe
语句。
其他模拟输入的 API 包括:
text
:文字输入keyevent
:按键输入,包括 HOME / BACK / MENU 等sleep
:等待snapshot
:截屏
② 基于 UI 控件
如果图像识别不够精确,还可以使用基于UI控件搜索的方式进行自动化测试,目前支持 Unity3d、Cocos2d、白鹭引擎等多种游戏引擎,以及 Android / iOS 原生 App。
如果是 Android / iOS 原生应用,是即插即用的,无需接入 SDK。但由于游戏引擎使用 OpenGL 等图形接口直接渲染,而没有使用原生的 UI 系统,因此需要与游戏的 Runtime 进行通信获取整个 UI 结构。
可以使用现成的 SDK 接入方法,甚至还可以自行扩展 SDK。接入完成后手机启动游戏,在 AirtestIDE 中的 Poco 辅助窗切换模式至对应引擎类型,即可看到整个UI结构。
点击录制按钮,然后随着鼠标操作,会自动生成 Poco 语句到脚本编辑框中。
同样,也可以通过 UI 树形结构更精确地检视 UI 控件,双击节点自动生成 Poco 语句,或者自行选择更好的写法。
对于 Android / iOS 的原生应用无需接入 SDK 即可使用,例如在连上 Android 手机后,将 Poco 辅助窗的模式切换至Android
,能可以看到整个UI树形结构。
2)框架信息
上述两种UI识别方式,分别是基于两个框架:
- 基于图像识别的 Airtest 框架
- 基于UI控件搜索的 Poco 框架
3)断言
① 验证 UI 界面
录制方法与模拟输入类似
assert_exists
:断言图片存在assert_not_exists
:断言图片不存在
② 验证数值
通过 Poco 获取属性值,手写代码进行断言
assert_equal
:断言相等assert_not_equal
:断言不等
例如
# ... 向 lyyf 发送好友申请
value = Poco("StatusButton").attr("Text")
assert_equal(value, "已发送")
4. 查看测试报告
脚本运行完毕后,点击查看报告
按钮(快捷键 Ctrl + L),会使用默认浏览器打开结果报告页面。报告中将展示出每一个步骤的内容和实际执行过程的截图、运行结果,方便查看步骤是否执行成功。
5. 命令行接口
可以使用命令行接口将自动化测试与持续集成结合起来。
6. 问题
Airtest 看上去是网易游戏的测试人员为方便批量自动化测试而开发的自动化测试工具,主要运行在 Windows 7 上,基本不受高 DPI 缩放的影响。然而,工具本身在同时连接了具有不同高分辨率(4K + 2K)和缩放比例(300% + 150%)的显示器的 Windows 10 电脑上有严重 Bug,导致前述的 fancy 功能基本无法正常使用。
- 录制截图定位偏离严重
- 窗口比例失调且无法缩放
- 无法识别第二屏幕上的窗口
如果这些 fancy 功能无法正常使用,测试脚本必须全部手动硬编码,而对于我们时间紧迫的敏捷开发流程来说有点得不偿失。最终我们只是试用并学习了这个有趣的测试工具,希望网易团队能尽快修复这些 Bug,让工具更好用~
原创文章,作者:wdmbts,如若转载,请注明出处:https://blog.ytso.com/tech/273229.html