C#单元测试
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C#单元测试
1、前⾔
“不会写单元测试的程序员不是合格的程序员,不写单元测试的程序员不是优秀的⼯程师。
”
那么问题来了,什么是单元测试,如何做单元测试。
2、单元测试
2.1 单元测试的定义
按照维基百科上的说法,单元测试(Unit Testing)⼜称为模块测试, 是针对程序模块(软件设计的最⼩单位)来进⾏正确性检验的测试⼯作。
程序单元是应⽤的最⼩可测试部件。
在⾯向对象编程中,最⼩单元就是⽅法,包括基类、抽象类、或者派⽣类(⼦类)中的⽅法。
按照通俗的理解,⼀个单元测试判断某个特定场条件下某个特定⽅法的⾏为,如斐波那契数列算法,冒泡排序算法。
单元测试(unit testing),是指对软件中的最⼩可测试单元进⾏检查和验证。
对于单元测试中单元的含义,⼀般来说,要根据实际情况去判定其具体含义,如C语⾔中单元指⼀个函数,Java⾥单元指⼀个类,图形化的软件中可以指⼀个窗⼝或⼀个菜单等。
总的来说,单元就是⼈为规定的最⼩的被测功能模块。
单元测试是在软件开发过程中要进⾏的最低级别的测试活动,软件的独⽴单元将在与程序的其他部分相隔离的情况下进⾏测试。
—— 百度百科
2.2 单元测试的好处
它是⼀种验证⾏为。
程序中的每⼀项功能都是测试来验证它的正确性。
它是⼀种设计⾏为。
编写单元测试将使我们从调⽤者观察、思考。
特别是先写测试(test-first),迫使我们把程序设计成易于调⽤和可测试的,有利于程序的解耦和模块化。
它是⼀种编写⽂档的⾏为。
单元测试是⼀种⽆价的⽂档,它是展⽰函数或类如何使⽤的最佳⽂档。
这份⽂档是可编译、可运⾏的,并且它保持最新,永远与代码同步。
它具有回归性。
⾃动化的单元测试避免了代码出现回归,编写完成之后,可以随时随地的快速运⾏测试。
⾼效。
⾃动化的单元测试节省了开发上调试BUG的时间,绝⼤多数BUG可以通过单元测试测试出来,并且可以减少测试⼈员的测试时间。
有时候通过写单元测试能够更好的完善⾃⼰程序的逻辑,让程序变得更加美好。
2.3 单元测试的原则
可重复运⾏的
持续长期有效,并且返回⼀致的结果
在内存中运⾏,没有外部依赖组件(⽐如说真实的数据库,真实的⽂件存储等)
快速返回结果
⼀个测试⽅法只测试⼀个问题
3、.NET 中的测试框架
现在⽐较流⾏的测试框架包括微软的MS Test(VS Test)、NUnit、XUnit
3.1 MS Test
VS单元测试的主要类:Assert、StringAssert、CollectionAssert,具体可参照 MSDN介绍
有些时候我们需要对测试的⽅法⽤到的数据或配置进⾏初始化,有⼏个特殊的测试⽅法。
如果需要针对测试中的所有虚拟⽤户迭代仅执⾏⼀次初始化操作,请使⽤TestInitializeAttribute。
初始化⽅法的运⾏顺序如下:
1. ⽤AssemblyInitializeAttribute标记的⽅法。
2. ⽤ClassInitializeAttribute特性标记的⽅法。
3. ⽤TestInitializeAttribute特性标记的⽅法。
4. ⽤TestMethodAttribute特性标记的⽅法。
使⽤ VS Test 的时候,⾸先我们需要标记测试⽅法所在类TestClass,测试⽅法标记为TestMethod
3.2 NUnit
NUnit 测试框架使⽤⽅法与 MS Test 类似
有⼀些是 NUnit 中的,但是MS Test框架中是没有的:
Assert.IsNaN/Assert.IsEmpty/Assert.IsNotEmpty/Assert.Greater/Assert.GreaterOrEqual等
想要同时使⽤ VS Test 和 NUnit 的话可以使⽤宏来区分不同的测试框架,例如:
#if !NUNIT
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Category = Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute;
#else
using NUnit.Framework;
using TestClass = NUnit.Framework.TestFixtureAttribute;
using TestMethod = NUnit.Framework.TestAttribute;
using TestInitialize = NUnit.Framework.SetUpAttribute;
using TestCleanup = NUnit.Framework.TearDownAttribute;
using TestContext = System.Object;
using ClassCleanup = NUnit.Framework.TestFixtureTearDownAttribute;
using ClassInitialize = NUnit.Framework.TestFixtureSetUpAttribute;
#endif
从上⾯可以看得出来 nunit 很多东西和 vs test 是很类似的,声明测试类,测试⽅法,初始化⽅法等
3.3 XUnit
XUnit 是另⼀个测试框架,个⼈觉得 XUnit 测试更加简洁⼀些,初始化和释放资源不需要标记单独的⽅法,初始化直接放在构造⽅法⾥,资源释放实现IDisposable接⼝,在Dispose⽅法中进⾏测试的清理⼯作即可,相⽐ ms test(vs test)和 NUnit,我觉得 Xunit 更⽅便⼀些,并且对于Assert,xunit 更简洁,例如:在 ms test 中的Assert.IsNull(null);/Assert.IsTrue(1 == 1);在 xunit 中则是Assert.Null(null);/Assert.True(1 == 1);,虽然看上去差不多,但是写的多了就会觉得 xunit 更简洁⼀些。
xunit 不需要对测试⽅法所在类型标记TestClass,只需要在测试⽅法上标记Fact或者使⽤数据驱动的Theory
4、XUnit 的基本使⽤
使⽤ XUnit 来写测试⽅法可以使得测试代码更为简洁,更加简单,推荐使⽤ xunit 来测试⾃⼰的代码
测试⽰例:
public class ResultModelTest
{
[Fact]
public void SuccessTest()
{
var result = ResultModel.Success();
Assert.Null(result.ErrorMsg);
Assert.Equal(ResultStatus.Success, result.Status);
}
[Theory]
[InlineData(ResultStatus.Unauthorized)]
[InlineData(ResultStatus.NoPermission)]
[InlineData(ResultStatus.RequestError)]
[InlineData(ResultStatus.NotImplemented)]
[InlineData(ResultStatus.ResourceNotFound)]
[InlineData(ResultStatus.RequestTimeout)]
public void FailTest(ResultStatus resultStatus)
{
var result = ResultModel.Fail("test error", resultStatus);
Assert.Equal(resultStatus, result.Status);
}
}
最基本的测试,使⽤Fact标记测试⽅法,使⽤Assert来断⾔⾃⼰对结果的预期
可以使⽤Theory来⾃⼰指定⼀批数据来进⾏测试,来实现测试数据驱动测试,简单的数据可以通过InlineData直接指定,也可以使⽤MemberData来指定⼀个⽅法来返回⽤于测试的数据,也可以⾃定义⼀个继承于DataAttribute的Data Provider
5、其他
在我们开发过程中测试是⾮常重要的⼀部分,⾼质量项⽬的⼀个重要指标就是测试覆盖率,⼀个⾼质量的开源项⽬⼀定是有⽐较完善的测试项⽬的,所以对于测试⾮常有必要了解⼀下,并将它集成到⾃⼰的项⽬中持续保证项⽬的⾼质量,同时完善的测试对于项⽬重构也是⾮常有好处的,能够很⼤程度上检测是否有发⽣⼀些破坏性的变更。
6、参考
MSDN - Microsoft.VisualStudio.TestTools.UnitTesting
单元测试之道
VS2012 Unit Test 个⼈学习汇总(含⽬录)
单元测试的优点
对⽐MS Test与NUnit Test框架。