.net持续集成测试篇之Nunit常见断言 (2)

很多时候,Not包含的范围非常广,进行单元测试是为了在开发阶段找出问题,解决问题,因此断言的范围越窄越好,我们不能仅仅让单元测试通过了事.
比如一个方法返回的结果是数字类型,我们要断定它是正数?大于某一个数的正数?在一定范围的正数?是一个具体的正数?而不能简单的是零,不是零.当然这还要根据业务本身来确实,有些时候范围可能确实很大,但是一定要注意单元测试原则.

Assert.Greater(OrEqual)

用于断言数字类型的变量大于(或者等于)某一个值

Assert.Less(OrEqual)

用于断言数字类型小于(或者等于)某一值

Assert.Contains

用于断言集合中是否包含某一元素.
比如以下方法,用于断言字符串数组中是否包含特定字符串

Avatar

Assert.AreSame

用于断言两个对象是否相等

这个静态方法并没有提供重载参数用于指定一个比较器来比较引用对象的相等性,需要实现equals和gethashcode方法才能得到预期结果,但在实际中我们往往把比较器放在类外边,如何在比较引用对象的时候加载一个比较器在后面章节会有介绍,这里先略过.

Nunit测试基础之复杂断言 Nunit测试基础之复杂断言

上面一篇我们讲解了一些基本断言,利用这些断言我们就可以进行单元测试了,然而仅仅使用简单断言还是不够的,如果逻辑复杂度较高,使用简单的断言会导致单元测试代码量增加,最终导致单元测试本身过于复杂和难以维护.需要说明的是这里所说的复杂断言仍然在Assert的静态方法里面,本身也不是特别复杂,只是比前面讲的秒复杂一些,只是如果没有了这些方法,一些特殊功能实现起来比较费劲基本无法实现.

下面就介绍一下这些方法.

Assert.Catch

Assert.Catch有泛型和异步方法,这里只介绍其泛型方法.很多即使经常使用单元测试功能的人也未必用过这个方法.
其实这个方法和Assert.Throw用法上类似,只是有一点不同的是要测试的方法里的异常可以是catch到的异常的子类,实际开发中,如果我们能确立异常的类型,则最好捕获具体类型异常,然而不能排除有一些不够规范的代码整段代码被一个try catch包围,这时候不一定能够捕获到想要的特定异常,这时候可以使用Assert.Catch

Avatar

以上代码类似上一节中讲throw时使用的代码,只是这里泛型参数里是Exception而不是具体的异常信息,我们运行这段代码,依然能够测试通过.
在单元测试中,期待的状态越具体越好,然而由于种种原因(比如立项时候没有对代码规范做过多要求,开发者水平不高,要测试的代码是别人写的,写单元测试的人对其中逻辑并不是特别清楚等)我们无法做到非常具体,这个时候可以把要获得的状态放宽以后,待条件完备了再修改单元测试以进一步收窄状态.

Assert.Ignore

Assert.Ignore和Ignore注解功能类似,可以在测试的时候忽略一个单元测试.有些情况下我们需要暂时忽略一个测试,比如说要进行测试的内容有一个外部依赖,现在外部依赖暂时不可用,如果我们不忽略的话测试将会失败,在自动化环境下,失败将导致无法进行下一步动作,此时我们可以暂时忽略这个测试.
忽略的测试前面有一个 黄色叹号标志,警示我们需要注意.

Assert. Fail

我们先看一下面一段代码

Avatar

在这个单元测试本身使用到了try catch,我们知道WhetherNameContainsB方法在Person类的Name没有提供值的情况下会抛出异常,然而我们的代码并没有断言这个异常存在,此时由于catch代码块存在,会把异常吞掉,因此最终我们断言person的Age为正数的时候将会通过(我们在构造类的时候设置了Age为32)
这显然不行的,这时候我把们Assert.Fail(e.Message)取消注释,测试便会变成失败状态.

Assert.IsNaN

用于断言一个Double类型数字是否是NaN

Avatar

虽然实际业务中我们并不会写以上代码,但是如果除数和被除数是通过复杂计算得来的则有可能除数和被除数都是零.

Assert.IsInstanceOf

用于断言一个对象是否是指定类型的实例,

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxpzx.html