一、为什么要进行单元测试?
大部分开发者都有个习惯(包括本人在内),常常不喜欢去做单元测试。因为我们对自己写的程序总是盲目自信,或者存在侥幸心理每次运行通过后就直接扔给测试组的妹子们了。结果妹子一测,大把大把的bug出现了,最后每每看到测试的妹子走过来,心里就只想说一句话:你是猴子请来的逗比吗?本来想节省时间,结果最后花在找BUG和修复BUG的这些时间加起来已经比开发这个模块所花的时间还要多了,最后更要命的是,坑爹的加班就在所难免了!如果一开始将bug遏制在萌芽状态,我们至于这么苦逼吗?SO,单元测试很有必要!
二、单元测试法则
1、单元测试必须能够重复执行,就是能够非常频繁地执行
2、单元测试的执行速度不能太慢,要不然会影响开发进度的
3、单元测试不应该依赖于外部资源和真实的环境
4、单元测试不应该涉及到真实数据库的操作
5、要确保单元测试的可信度
6、单元测试通常以测试一个方法为单位
7、每一个程序猿都需要为自己写的代码编写单元测试代码
三、单元测试工具
我在这里仅仅推荐一个比较实用的测试工具NUnit,可单独使用,也可以通过TestDriven.NET(TestDriven.NET是以插件形式集成在Visual Studio IDE中的单元测试工具,完全兼容所有.NET Framework版本,并且集成了多种单元测试框架诸如NUnit,MbUnit,以及 MS Team System 等)将其加入到vs中。
NUnit作为xUnit家族中的.Net成员,是.NET的单元测试框架,xUnit是一套适合于多种语言的单元测试工具。它具有如下特征:
提供了API,使得我们可以创建一个带有“通过/失败”结果的重复单元。
包括了运行测试和表示结果所需的工具。
允许多个测试作为一个组在一个批处理中运行。
非常灵巧,操作简单,我们花费很少的时间即可学会并且不会给测试的程序添加额外的负担。
功能可以扩展,如果希望更多的功能,可以很容易的扩展它。
套用老罗的话就是一句话:它是当今.NET领域最牛逼的测试工具之一
在.NET下的单元测试工具其实非常多,这里不想多说,我们就使用微软自己提供的测试框架Unit Test Framework,已经集成在vs中了~
四、MOQ
单元测试的目标是一次只测试一个方法,是一种细粒度的测试,但是假如某个方法依赖于其他一些难以操控的外部东东,比如说网络连接、数据库连接等时,那么我们该怎么办呢?既然单元测试的法则说不让依赖这些个外部真实的东西,那还不简单,我山寨一个不就行了吗?此时当采用以假乱真的手法来完成单元测试。实际上我们这里采用的是Mock对象,也就是真实对象的替代品,并使用Moq框架来模拟Mock对象,它为我们提供了模拟真实对象行为的能力,然后交给被测试功能使用,以此判断被测试功能是否正确。
注意:Moq只能模拟接口或抽象类。
你可以通过Nuget来获取Moq并且引用到指定的项目,也可以在google上下载,不管怎样记得在测试项目中引用Moq.dll就行~
举个栗子:
public class Student { public string ID { get; set; } public string Name { get; set; } public int Age { get; set; } } IStudentRepository public interface IStudentRepository { Student GetStudentById(string id); } |
下面是方法GetStudentById的单元测试代码:
[TestMethod] public void GetStudentByIdTest() { //创建MOCK对象 var mock = new Mock<IStudentRepository>(); //设置MOCK调用行为 mock.Setup(p=>p.GetStudentById("1")).Returns(new Student()); //MOCK调用方法 mock.Object.GetStudentById("1"); Assert.AreNotSame(new Student(), mock.Object.GetStudentById("1")); } |