个人技术博客——Unity中的自动化测试框架

222200233_蔡文韬 2024-12-19 23:06:49

目录

  • 技术概述
  • 技术详述
  • 技术使用中遇到的问题和解决过程
  • 总结
  • 参考文献

技术概述

UnityTest 是 Unity 测试框架,用于在编辑和播放模式下测试代码。Unity Test适用于需要自动化测试的游戏开发场景,以确保代码质量和减少测试工作,以及提高开发效率和代码可靠性。学习该技术的原因来自于UnityTest是 Unity引擎自带的测试工具,使用难度较低。
技术难点在于该技术在在国内使用较少,缺少相关的使用参考资料。掌握测试框架的使用和编写高质量的测试用例并不容易。

技术详述

unity中进行测试工作的测试运行器分为两种模式

img

PlayMode和Edit模式,PlayMode测试是在Unity编辑器的Play模式下执行的测试。这种测试模式允许测试游戏在实际运行时的行为,包括游戏逻辑、动画、物理交互、AI行为等。PlayMode测试通常用于模拟玩家与游戏的交互,以及游戏内部组件之间的交互。
EditMode测试是在Unity编辑器的Edit模式下执行的测试。这种测试模式可以测试不依赖于游戏运行时的代码,例如工具类、数据管理、算法逻辑等。EditMode测试通常用于单元测试,测试代码的独立功能模块。

在这张图中左上角是编辑器,左下角是测试运行的播放器

img

在Edit模式编写测试代码简单且加载速度快,下面以测试键盘设置函数的一段简单的自动化测试代码为例来示范测试运行器的使用方法

using NUnit.Framework; // 使用 NUnit 测试框架
using UnityEngine; // 使用 UnityEngine 命名空间
using UnityEngine.TestTools; // 使用 Unity Test Framework
using CircleOfLife.Key;
using System.Collections; // 使用 CircleOfLife.Key 命名空间
public class KeyboardSetTests
{
    [UnityTest]
    public IEnumerator TestKeyboardMapping()
    {
        // 测试键盘映射是否正确
        Assert.AreEqual(KeyCode.W, KeyboardSet.GetKeyCode(KeyEnum.Up));
        Assert.AreEqual(KeyCode.S, KeyboardSet.GetKeyCode(KeyEnum.Down));
        Assert.AreEqual(KeyCode.A, KeyboardSet.GetKeyCode(KeyEnum.Left));
        Assert.AreEqual(KeyCode.D, KeyboardSet.GetKeyCode(KeyEnum.Right));
 
        yield return null;
    }
 
    [UnityTest]
    public IEnumerator TestChangeKey()
    {
        // 测试更改键位
        KeyboardSet.ChangeKey(KeyEnum.Up, KeyCode.L);
        Assert.AreEqual(KeyCode.L, KeyboardSet.GetKeyCode(KeyEnum.Up));
        KeyboardSet.ChangeKey(KeyEnum.Up, KeyCode.W);
        Assert.AreEqual(KeyCode.W, KeyboardSet.GetKeyCode(KeyEnum.Up));
        yield return null;
        // 测试重复键位是否被阻止
        KeyboardSet.ChangeKey(KeyEnum.Up, KeyCode.D);
        Assert.AreNotEqual(KeyCode.D, KeyboardSet.GetKeyCode(KeyEnum.Up));
        KeyboardSet.ChangeKey(KeyEnum.Up, KeyCode.W);
        yield return null;
    }
 
    [UnityTest]
    public IEnumerator TestResetKey()
    {
        // 测试重置键位
        KeyboardSet.ResetKey(KeyEnum.Up);
        Assert.AreEqual(KeyCode.None, KeyboardSet.GetKeyCode(KeyEnum.Up));
 
        yield return null;
    }
}
 

测试代码内会自动调用键盘设置相关脚本内的方法,输入参数后,Assert自动断言类的方法自动比较结果是否符合预期
由于这段脚本被放在了含有EditTest名字的程序集引用的文件夹内,并且每个测试方法添加了 [UnityTest]前缀,这样这些代码就会被测试运行检测到,并显示在测试运行器上

img

在编写好自动测试代码后,项目组其他成员只需要,选择测试场景(目前大部分自动测试请选择空场景),打开菜单后选择测试运行器,点击每个函数图标就会自动运行的测试,如果结果无错误通过测的话,相关测试方法就会显示一个绿色的钩

img

在使用Test Framework后,只要每个类的底层框架没有修改,大部分的类只需要点击测试运行器的run all,便可以自动显示结果,对于正在进行的项目来说非常方便。

技术使用中遇到的问题和解决过程

  • 自动测试一直报告代码错误,但实际上代码并无问题
    测试代码检查的是当前帧的结果,而脚本对数值的修改实在下一帧才开始生效。使用yield return null;来暂停测试的执行,直到下一个编辑器更新周期。

  • 在编写测试代码的过程中无法附加脚本
    需要先创建一个默认的游戏对象,然后把脚本附加到这个对象上,再填写相关数据进行测试


private GameObject cameraObject;
private CameraController cameraController;

[SetUp]
public void Setup()
{

    cameraObject = new GameObject();
    cameraController = cameraObject.AddComponent<CameraController>();

    cameraObject.AddComponent<Camera>();
    cameraController.FollowTarget = new GameObject();
}

[TearDown]
public void Teardown()
{
   GameObject.DestroyImmediate(cameraObject);
}

总结

unity测试框架基本流程很简单,编写测试代码调用要测试的脚本,检查运行脚本过后相关数值是否被修改或者超出界限,再测试运行器上浏览每段单元测试的运行结果。

参考文献

Unity技术手册

...全文
142 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

239

社区成员

发帖
与我相关
我的任务
社区管理员
  • FZU_SE_teacherW
  • 助教赖晋松
  • D's Honey
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧