测试框架nunit之assertion断言使用详解
任何xunit工具都使用断言进行条件的判断,nunit自然也不例外,与其它的xunit(如junit、phpunit、pythonunit)相比,由于大量使用了generic、attribute等语言特征,nunit提供了更为方面、灵活的测试方法,下面先介绍一下断言。
nunit一共有四个类断言类,分别是assert、stringassert、fileassert和directoryassert,它们都在nunit.framework命名空间,其中assert是常用,也是我们最熟悉的,而另外三个断言类,顾名思义,分别对应于字符串的断言、文件的断言和目录的断言,理论上,仅assert类就可以完成所有条件的判断,然而,如果合理的运用后面的三个断言,将使代码更加简洁、美观,也更加便于理解和维护。
一:assert类
对于我们通常的单元测试代码,assert类中的静态方法就可以完成,其中大家最熟悉的应该是assert. areequal()方法,其实,除了areequal,nunit还提供了众多的比较方式,满足不同的代码要求。
1:相等/不相等判断
areequal:判断两个值相等
arenotequal:判断两个值不相等
示例:
int a=1
assert.areequal(a,1);//通过判断
assert.areequal(a,2);//不能通过判断
注意,除了areequal/ arenotequal,下面几乎所有的方法都支持多态(多种数据类型),以及多参数,除了经常使用的assert .areequal(int a,int b),还有一种典型的参数形式:
assert.areequal(int a,int b,string message);
或者 assert.xxx(int a,int b,string message);
其中第三个参数是条件不通过时输出的信息,以便于错误的定位
对于double和decimal类型,这两个方法还支持比较时的浮点误差
例如以下代码:
double a = 1.1;
double b = 1.11;
double c = 0.1;
assert.areequal(a, b, c);//通过判断
c=0.01;
assert.areequal(a, b, c);//不能通过判断
2:类的判断
aresame:判断两个对象相等
arenotsame:判断两个对象不相等
contains:判断是否是否某对象
示例:
list<string> list = new list<string>();
list.add("a");
list.add("b");
assert.contains("a", list); //通过判断
assert.contains("aa", list); //不能通过判断
3:条件判断
istrue:判断条件为真
true:同上
isfalse:判断条件为假
false:同上
isnull:判断是否为空
null:同上
isnotnull:判断不为空间
notnull:同上
isnan:判断数值是nan
isempty/isnotempty:判断字符串是否为空/不为空
isempty/isnotempty:判断集合是否为空/不为空
示例:
int a=100;
assert. istrue(a==100);//通过判断
assert. true(a==100);//通过判断
4:比较判断
greater:大于
greaterorequal:大于等于
less:小于
lessorequal:小于大于
示例:
int a = 100;
assert.greater(a, 99);
assert.greaterorequal(a, 100);
5:类型判断
isinstanceoftype/ isnotinstanceoftype:是/不是某个类的实例(从2.5之后支持泛型)
例如:
public class person
{
public string name {set;get;}
}
person p = new person();
p.name = "a";
assert.isinstanceof(typeof(person), p);//通过判断
assert.isinstanceof(typeof(system.string), p);//不能通过判断
6:异常判断
throws:应该抛出某类型的异常
doesnotthrow:不应该抛出某类型的异常
7:其它常用的方法
pass:强行让测试通过
fail:强行让测试失败
ignore:忽略该测试方法
inconclusive:未验证该测试
二:stringassert类
stringassert用于string类型的断言判断:
stringassert.contains:是否包含子串
stringassert.startswith:是否以某子串开头
stringassert.endswith:是否以某子串结尾
stringassert.areequalignoringcase:两个字符串是否在不区分大小写时相等
stringassert.ismatch:是否匹配,(使用正则表达式进行字符串比较)
示例:
string s1 = "abc";
stringassert.contains("b", s1);
stringassert.startswith("a", s1);
stringassert.endswith("c", s1);
string s2 = "abc";
stringassert.areequalignoringcase(s1, s2);
stringassert.ismatch("[a|book]", "123");
三:collectionassert类
allitemsareinstancesoftype:集合中的各项是否是某某类型的实例
allitemsarenotnull:集合中的各项均不为空
allitemsareunique:集合中的各项唯一
areequal:两个集合相等
areequivalent:两个集合相当
arenotequal:两个集合不相等
arenotequivalent:两个集合不相当
doesnotcontain:集合中不包含某对象
issubsetof:一个集合是另外一个集合的子集
isnotsubsetof:一个集合不是另外一个集合的子集
isempty:集合为空
isnotempty:集合不为空
isordered:集合的各项已经排序
示例:
list<int> a = new list<int>();
list<int> b = new list<int>();
collectionassert.isempty(a);
for (int i = 1; i <= 10; i++)
{
a.add(i);
b.add(i);
}
collectionassert.areequal(a, b);
collectionassert.isordered(a);
b.remove(1);
collectionassert.issubsetof(b, a);
collectionassert.areequal(a, b);