系列目录
Nunit测试基础之简单断言在开始本篇之前需要补充一些内容,通过前面搭建Nunit测试环境我们知道要使一个方法成为单元测试方法首先要在此方法所在类加上TestFixture注解,并且在该方法上添加上Test注解.
然而还有一点需要注意:所有进行单元测试的方法必须标识为public访问级别,否则无法识别为单元测试方法
此外,单元测试方法还有以下特征
单元测试方法不带返回参数,也即都是Void类型
由于单元测试方法都是用来断言特定状态的,因此返回值是没有意义的.此外也不要尝试在一个单元测试方法中调用另一个,这样做违反的单元测试的初衷(一旦出现错误不知道是哪个方法出出现的,还需要借助单元调用去发现是哪个方法出现的)
单元测试方法不能带有参数
这里说的不能是指不能像普通方法一样带有普通的参数(可以带基于注解的特殊参数)
如果像普通方法一样带参数,虽然编译能通过,但是运行时会抛出异常.
单元测试方法不能重载
这里说的不能是不应该,实践中是可以的,但是重载方法会带来无尽的麻烦,读者可以自己实践一下.
进行单元测试无非就是对不同参数引起方法出现不同结果的断言(一般情况下所有的单元测试方法都有断言)下面我们来看Nunit中最基本最常用的断言
Assert.True用于断言布尔参数是否为true
Assert.True的重载方法还支持可空布尔参数
Assert.True还支持自定义错误提示
上面代码改为如下
如果返回错误的时候,我们自定义的错误信息就会显示出来.
其它的断言方法也大都有此重载
Assert.IsTrue此断言方法为Assert.True的亲兄弟,二者功能一模一样.
ssert.False与Assert.True断言状态相反,断言某一参数的结果为false
这里需要特别说明的是,单元测试应该力求简单,明了,断言尤其如此.
上面的断言还也可以写成
Assert.False(!firstCondition);
这和断言变量firstCondition为true最终功能一样,但是看上去很不直接明了,通常情况下我见到Assert.False第一反应就是断言一个变量为False,这里则反其道行之,实际上是断言一个变量为true,这种情况应当避免.
Assert.False的亲兄弟,二者表现一模一样
Nunit Assert类还有还多其它的前面带有Is的方法,它们都和不带Is的一模一样,其中带Is的是为了兼容老版本写法.
Assert.Null用于断言一个变量是否为null,这里不再举例,但是实际中用的却比较多.
Assert.NotNull用于断言一个变量不是null,它和Assert.Null()功能相同,只是断言的状态相反.
Nunit里还有其它的前缀有Not的方法,它和不带Not的方法用法一样,只是断言的状态相反
Assert.Throws
用于断言特定方法在运行的时候会抛出异常.此方法有泛型版本,异步版本,这里仅对异步版本进行说明
由于示例越来越复制,我们不能只在测试方法内写一些简单代码进行测试了,这里我们新建一个Person类如下
这个类里面包含一个WhetherNameContainsB方法,用于判断实例的Name是否包含字母B,
这个方法里面有三个逻辑分支,单元测试的时候每一个都要覆盖到,这里我们断言如果name为null则抛出ArgumentNullException
我们编写如下单元测试方法
运行这个测试,则会返回成功状态,因为预期的异常出现了.
Assert.IsEmpty用于断言字段串是否为空字符串.
Assert.Positive用于断言数字类型(int,long,float,double,decimal等)为正数(大于零的数)
其实很多断言都可以断言都可以用Assert.True来完成,比如断言一个数是否为正数,可以用Assert.True(a>0),这里由于a只是一个普通变量,使用a>0作为条件主义仍然十分清析,然而到了后面有我们不仅要判断一个变通变量,还要判断lambda表达式,如果条件过于复杂,则语义会变得不是特别清析了,使用Assert自带的静态方法主义会更加清析,可读性更高.
Assert.Negative用于断言数字类型为负数(小于零,不包括零)
Assert.Zero用于断言数字类型为数字零
Assert.NotZero用于断言数字类型不是零.