NUnit基本使⽤⽅法
通常的单元测试框架都以他们⽀持的语⾔的开头字母加上Unit作为名字,他们统称为xUnit框架。C++的叫做CppUnit,Java的叫做JUnit,.Net的叫做NUnit。当然不是所有的都这么命名,但⼤部分如此。下⾯我主要讲解⼀下NUni的⼀些基本操作。
1:Nunit两个重要属性
1.1:[TestFixture]
这个是标识包含⾃动化测试的类,可能改成TestClass⼤家更加理解。但是代码是⽆法编译过去的。
1.2:[Test]
这个是标识这个⽅法需要⾃动化测试的。记得把这个属性加在要测试的⽅法上。
2:编写第⼀个单元测试
2.1:⼀个单元测试通常包含三个⾏为:
2.1.1:准备对象(就是对哪个对象就⾏操作)
2.1.2:操作对象(对对象进⾏⼀些逻辑处理)
2.1.3:断⾔(Assert)和预判产⽣的结果对⽐
2.2:编写⼀个判断后缀名的⽅法
public bool IsValidExtensions(string fileName)
{
if (string.IsNullOrWhiteSpace(fileName)) throw new ArgumentNullException("fileName");
var extension = Path.GetExtension(fileName);
if (extension.Contains("pdf"))
{
return true;
}
return false;
}
2.3:编写测试⽅法
2.3.1:Assert这个类
Assert.IsFalse(bool condition, string message)
参数1:返回的结果参数2:展⽰失败的信息
Assert.AreEqual(int expected, int actual, string message)
参数1:期望的结果参数2:实际的结果参数3:展⽰失败的信息
当然Assert很多⽅法可以⾃⼰去学习。
[Test]
public void IsValidExtensions_BadExtension_ReturnsFalse()
{
var arithmetic=new Arithmetic();
bool restlt = arithmetic.IsValidExtensions("log.pdf");
Assert.IsFalse(restlt,"没有返回正确值");
}
2.3.2:编译项⽬然后打开Nunit,点击NUnit的File打开这个编译的dll⽂件然后如下图
2.3.3:我们要修改单元测试⽅法
右键点击上图的ArithmeticTest选择LoadFixture就会重新导⼊这个ArithmeticTest。ClearFixTure清理这个ArithmeticTest
2.4:使⽤参数重构测试
⽐喻上⾯我们的参数叫做log.pdf但是现在⼜要测试怎么办,如果说2个可以写,10个乃⾄100个呢不⽤担⼼NUnit给我们提供了两个特性
[TestCase]
ok我们来修改上⾯的单元测试代码
[TestCase("log.pdf")]
[TestCase("")]
public void IsValidExtensions_BadExtension_ReturnsFalse(string fileName)
{
var arithmetic=new Arithmetic();
bool restlt = arithmetic.IsValidExtensions(fileName);
Assert.IsFalse(restlt,"没有返回正确值");
}
我们在运⾏NUnit看看效果:
看到效果了吧我们就出现了两个⽅法。这样⼀来是不是很简单。
但是有的⼜说我可不可以指定我预期的效果呢,很明显是可以的我们在此修改测试⽅法
[TestCase("log.pdf",true)]
[TestCase("",false)]
public void IsValidExtensions_BadExtension_ReturnsFalse(string fileName)
{
var arithmetic=new Arithmetic();
bool restlt = arithmetic.IsValidExtensions(fileName);
Assert.IsTrue(restlt,"没有返回预期的值");
}
我们运⾏会发现这2个都能通过编译这⾥就不贴图了。
2.5:setup和teardown
setup特性以后表⽰每次运⾏这个测试类⾸先就会进⼊这个⽅法相当于我们常说的构造函数
teardown表⽰⽅法运⾏结束以后再运⾏这个⽅法,我们常说的析构函数。
[setup]A()
[test]B()
[teardown]C()
运⾏顺序是A到B到C
2.6:异常检测
2.6.1:ExpectedException标识这种标识是很常见的⼀种测试异常的⽅法下⾯来看它的⽤法
public bool IsValidExtensions(string fileName)
{
if (string.IsNullOrWhiteSpace(fileName)) throw new ArgumentNullException();
var extension = Path.GetExtension(fileName);
if (extension.Contains("pdf"))
{
return true;
}
return false;
}
[Test]
[ExpectedException(typeof(ArgumentNullException),ExpectedMessage = "值不能为 null。")]
public void IsVaildFileName_EmptyFileName_ThrowException()
{
var arithmetic = new Arithmetic();
arithmetic.IsValidExtensions("");
}
第⼀个参数:表⽰显⽰异常的类
第⼆个参数:表⽰期望的异常
注意:这个异常并没有调⽤Assert因为ExpectedException本⾝带有判断。
我们看看测试结果:
表⽰异常和我们期待的⼀样,但是这有⼀个问题如果我们构造函数抛出⼀个异常测试同样会通过,所以就会导致测试出现了不真实性。(我测试过在构造函数抛出空异常同样测试通过)
那么就引进了另⼀个异常的测试⽅式Lambda表达式来改造⼀下
[Test]
public void IsVaildFileName_EmptyFileName_ThrowException() {
var arithmetic = new Arithmetic();
var ex = Assert.Catch<Exception>(() => arithmetic.IsValidExtensions(string.Empty));
StringAssert.Contains("值不能为 null。", ex.Message);//可以不写值不能为Null也能通过测试
}
这样就避免了上⾯的情况,只要是lambda表达式抛出异常就通过测试否则任何地⽅抛出异常都不能通过测试。
2.7:忽略测试
有时候有些代码不需要测试,但是你⼜把它迁⼊主项⽬那么你就可以考虑把他忽略掉(当然这种情况很少的)
[Test]
[Ignore("这个⽅法⽬前不⽤进⾏测试")]
public void IsVaildFileName_BadExtension_ReturnFalse()
{
var arithmetic = new Arithmetic();
Assert.IsTrue(arithmetic.IsValidExtensions("11"));
}
测试效果:
黄⾊的就表⽰暂时不考虑测试的⽅法。
2.8:设置测试类别
在实际开发中可能我们很多测试,为了分开测试我们可以设置类别,也可以在测试中选择⼀些分类测试下⾯我们看看怎么实现的[Test]
[Category("后台单元测试")]
public void IsVaildFileName_BadExtension_ReturnFalse()
{
var arithmetic = new Arithmetic();
Assert.IsTrue(arithmetic.IsValidExtensions("11"));
}
[Test]
[Category("前端单元测试")]
public void IsVaildFileName_EmptyFileName_ThrowException() {
var arithmetic = new Arithmetic();
var ex = Assert.Catch<Exception>(() => arithmetic.IsValidExtensions(string.Empty));
StringAssert.Contains("值不能为 null。", ex.Message);
}
我们看看效果:
⼤家可以⾃⼰动⼿测试下,实际功能⽐这强⼤很多的。
2.9:测试类中某个属性没有返回值怎么办
这个⽐较简单我直接贴代码了。
public bool IsOnline { get; set; }
public void IsValidExtensions(string fileName)
{
if (string.IsNullOrWhiteSpace(fileName)) throw new ArgumentNullException();
var extension = Path.GetExtension(fileName);
if (!extension.Contains("pdf")) return;
typeof的用法
IsOnline = true;
}
[Test]
public void IsVaildFileName_BadExtension_ReturnFalse()
{
var arithmetic = new Arithmetic();
arithmetic.IsValidExtensions("log.pdf");
Assert.IsTrue(arithmetic.IsOnline);
}
这个效果很明显是通过的。这样来验证类的⼀个属性(但是有⼀个依耐项)
以上参考单元测试的艺术

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。