美文网首页Unity3D 成神之路unity3D技术分享
Unity 之 Assertion(断言)另一种 Debug

Unity 之 Assertion(断言)另一种 Debug

作者: su9257_海澜 | 来源:发表于2018-08-24 00:40 被阅读72次

    在日常开发中,我们会经常使用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", "断言检测违背不相等原则");
        }
    
    检测是否约等于或不等于是否成立
        public void TestAreApproximatelyEqual()
        {
            // 默认允许误差小于 0.00001f,这里我们制定误差为 0.01f
            Assert.AreApproximatelyEqual(0.9f, 0.91f, 0.01f, "断言检测 约等于 不成立");
    
            Assert.AreNotApproximatelyEqual(0.9f, 0.9000001f, 0.01f, "断言检测 不约等于 不成立");
        }
    
    检测数值为True或False
    
        public void TestIsTrue()
        {
            Assert.IsTrue(1 > 2, "违背结果为真的原则");
    
            Assert.IsTrue(Testbool());
    
            Assert.IsFalse(1 < 2, "违背结果为假的原则");
        }
    
        public bool Testbool()
        {
            return false;
        }
    
    检测是否为Null
        public void TestIsNull()
        {
            Student student1 = new Student();
    
            Assert.IsNull(student1,"检测结果值不为null");
    
            student1 = null;
    
            Assert.IsNotNull<Student>(student1,"检测结果为null");
        }
    

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

    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("执行");
        }
    

    Assert.raiseExceptions = true;

        public void TestRaiseExceptions()
        {
            Assert.raiseExceptions = true;
    
            Assert.IsTrue(1 > 2);
    
            Assert.IsTrue(1 > 2, "自定义输出");
    
            Debug.LogError(new string('*', 20));
    
            Debug.Log("执行");
        }
    

    打完收工~

    相关文章

      网友评论

      • dark黑黑:感觉没看出应用场景啊 这个东西
        su9257_海澜:@令国栋 单元测试,test runner 可以了解一下

      本文标题:Unity 之 Assertion(断言)另一种 Debug

      本文链接:https://www.haomeiwen.com/subject/popviftx.html