开发者社区> su9257_海澜> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Unity 之 Assertion(断言)另一种 Debug

简介: 在日常开发中,我们会经常使用Debug或对应的封装输出日志,在Unity Debug输出到屏幕并保存到本地笔者也曾有过介绍,今天笔者和大家聊聊另一种Debug输出 --- 【断言】,,笔者所介绍的断言库早在unity5.1版本中就已经出现。
+关注继续查看

在日常开发中,我们会经常使用Debug或对应的封装输出日志,在Unity Debug输出到屏幕并保存到本地笔者也曾有过介绍,今天笔者和大家聊聊另一种Debug输出 --- 【断言】,,笔者所介绍的断言库早在unity5.1版本中就已经出现。在单元测试中断言的使用频率还是很高的。

官方博客:https://blogs.unity3d.com/cn/2015/08/25/the-unity-assertion-library/

官网API:https://docs.unity3d.com/ScriptReference/Assertions.Assert.html


有说错或不准确的地方欢迎留言指正


在使用上还是比较简单的,主要API如下:

  • Assert.AreEqual 与 Assert.AreNotEqual
  • Assert.AreApproximatelyEqual 与 Assert.AreNotApproximatelyEqual
  • Assert.IsTrue 与 Assert.IsFalse
  • Assert.IsNull 与 Assert.IsNotNull
检测是否违背指定的相等或不相等原则
    public void TestAssertEqual()
    {
        Assert.AreEqual("123", "456", "断言检测违背相等原则");

        Assert.AreNotEqual("123", "123", "断言检测违背不相等原则");
    }
img_b3a81722594220f8269fda167fc3100c.png
检测是否约等于或不等于是否成立
    public void TestAreApproximatelyEqual()
    {
        // 默认允许误差小于 0.00001f,这里我们制定误差为 0.01f
        Assert.AreApproximatelyEqual(0.9f, 0.91f, 0.01f, "断言检测 约等于 不成立");

        Assert.AreNotApproximatelyEqual(0.9f, 0.9000001f, 0.01f, "断言检测 不约等于 不成立");
    }
img_476fbb8fe87a25c412b7067d2ac2cef0.png
检测数值为True或False

    public void TestIsTrue()
    {
        Assert.IsTrue(1 > 2, "违背结果为真的原则");

        Assert.IsTrue(Testbool());

        Assert.IsFalse(1 < 2, "违背结果为假的原则");
    }

    public bool Testbool()
    {
        return false;
    }
img_799188691fc49be8a0d4572ef71ec796.png
检测是否为Null
    public void TestIsNull()
    {
        Student student1 = new Student();

        Assert.IsNull(student1,"检测结果值不为null");

        student1 = null;

        Assert.IsNotNull<Student>(student1,"检测结果为null");
    }
img_d6fdd4308b47d9b5feca7f5750a46ac6.png

在断言中也可以自定义比较规则,代码如下

public class Student
{
    public string name;
    public int number;
    public int age;
}
    public void TestCustomEqualityComparer()
    {
        Student S1 = new Student() { age = 1 };
        Student S2 = new Student() { age = 2 };
        Assert.AreEqual(S1, S2, "自定义比较结果为不相等", new CustomEqualityComparer<Student>((s1, s2) => { return s1.age == s2.age; }));
    }
比较的部分在于继承 IEqualityComparer 重新实现我们要比较的规则
public class CustomEqualityComparer<T> : IEqualityComparer<T>
{
    public  Func<T,T, bool> EqualsComparer;

    public CustomEqualityComparer(Func<T, T, bool> equalsComparer)
    {
        EqualsComparer = equalsComparer;
    }
    public bool Equals(T x, T y)
    {
        if ( EqualsComparer!=null)
        {
            return EqualsComparer(x, y);
        }
        else
        {
            return false;
        }
    }

    public int GetHashCode(T obj)
    {
        return obj.ToString().GetHashCode();
    }
}

断言中还有一个特性就是否阻止触发条件以后的代码块执行,使用对用的API为Assert.raiseExceptions,默认值为false

效果如下:

Assert.raiseExceptions = false;

    public void TestRaiseExceptions()
    {
        Assert.raiseExceptions = false;

        Assert.IsTrue(1 > 2);

        Assert.IsTrue(1 > 2, "自定义输出");

        Debug.LogError(new string('*', 20));

        Debug.Log("执行");
    }
img_a08bf09bffcc399b8cd47e48ffae5aa0.png

Assert.raiseExceptions = true;

    public void TestRaiseExceptions()
    {
        Assert.raiseExceptions = true;

        Assert.IsTrue(1 > 2);

        Assert.IsTrue(1 > 2, "自定义输出");

        Debug.LogError(new string('*', 20));

        Debug.Log("执行");
    }
img_93e5d60e38c138b9688add7511b31b8f.png

打完收工~

img_569463b7983f645f063dd7b1bef93e0c.png

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【Debug 篇】FTP 无法连接目录或显示空白
FTP 无法连接目录或显示空白,报错提示 “服务器发回了不可路由的地址,使用服务器地址代替”。
1916 0
Docker入门系列之一:在一个Docker容器里运行指定的web应用
Docker入门系列之一:在一个Docker容器里运行指定的web应用
50 0
Changing the Way of Continuous Delivery with Docker (Part 2)
Docker has reformed the way of conducting continuous delivery. Docker allows you to package an application with all of its dependencies into a standar.
1841 0
Changing the Way of Continuous Delivery with Docker (Part 1)
The internet industry has been constantly changing market demands and products, forcing organizations to adapt by making constant deliveries and updates to their production environment.
1651 0
Unity3d 下websocket的使用
今天介绍一下如何在Unity3D下使用WebSocket。 首先介绍一下什么是websocket,以及与socket,和http的区别与联系,然后介绍一下websocket的一些开源的项目。 WebSocket是什么 WebSocket协议是为了实现网络客户端和服务器端全双工通信而引入的一种基于消息帧和TCP的通信机制,这个协议本身的目标是为了在http服务器上引入双向通信的机制,从而克服http单向通信的缺陷(http设计的初衷就不是为了双向通信),其可以在复用http的端口,支持http的代理,认证等,虽然如此,websocket可以独立于http存在。
3168 0
红帽虚拟化RHEV3.2创建虚拟机(图文Step by Step)
目录 目录 前言 Install RHEV 创建Data CenterClusterHost 创建存储 创建虚拟机 前言 RHEV3.2的Web管理界面有了很大的改进,更加的简单和便捷,还可以使用中文浏览。
1100 0
关于socket tcp 断线重连
这个问题困扰过我几次,都没有来得及研究,今天研究一下。 首先写一个最简易的socket tcp程序,连接成功后再关闭服务器然后再用客户端各种操作看是什么情况 测试表明 (1)客户端已经连接,当服务端关闭程序时,客户端调用send函数发送失败,WSAGetLastError() 返回10054(远程主机强迫关闭了一个现有的连接)  (2)客户端已经连接,当客户端关闭程序时,服务端调用recv函数接收失败,WSAGetLastError() 返回10054(远程主机强迫关闭了一个现有的连接) ,这时对这个客户端的socket调用select函数时,会立即返回可读。
1400 0
+关注
su9257_海澜
一个爱讲故事的无趣灵魂
98
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载