注:本文示例环境
VS2017
XUnit 2.2.0 单元测试框架
xunit.runner.visualstudio 2.2.0 测试运行工具
Moq 4.7.10 模拟框架
什么是单元测试?
确保软件应用程序按作者的期望执行操作,其中最好的一种方法是拥有自动化测试套件。 可以对软件应用程序进行各种不同的测试,包括集成测试、Web 测试、负载测试等。 测试各个软件组件或方法的单元测试是最低级测试。
所谓单元测试(unit testing),就是开发者编写的一小段代码,用于对软件中的最小单元进行检查和验证,其一般验证对象是一个函数或者一个类。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。
为什么要使用单元测试?
- 大大节约了测试和修改的时间,有效且便于测试各种情况。
- 能快速定位bug(每一个测试用例都是具有针对性)。
- 能使开发人员重新审视需求和功能的设计(难以单元测试的代码,就需要重新设计)。
- 强迫开发者以调用者而不是实现者的角度来设计代码,利于代码之间的解耦。
- 自动化的单元测试能保证回归测试的有效执行。
- 使代码可以放心修改和重构。
- 测试用例,可作为开发文档使用(测试即文档)。
- 测试用例永久保存,支持随时测试。
对于我个人来说,主要是防止自己犯低级错误的,同时也方便修改(BUG修复)而不引入新的问题。可以放心大胆的重构。简言之,这个简单有效的技术就是为了令代码变得更加完美。
既然单元测试有这些好处,为什么我们不去用呢?
可以归纳为以下几个理由。
-
对单元测试存在的误解,如:单元测试属于测试工作,应该由测试人员来完成,所以单元测试不属于开发人员的职责范围。
答:虽然单元测试虽然叫做"测试",但实际属于开发范畴,应该由开发人员来做,而开发人员也能从中受益。
-
没有真正意识到单元测试的收益,认为写单元测试太费时,不值得。
答:在开发时越早发现bug,就能节省更多的时间,降低更多的风险。单元测试先期要编写测试用例,是需要多耗费些时间,但是后面的调试、自测,都可以通过单元测试处理,不用手工一遍又一遍处理。实际上总时间被减少了。
-
项目经理或技术主管没有要求写单元测试,所以不用写。
答:写单元测试应该成为开发人员的一种本能,开发本身就应该包含单元测试。
-
不知道有单元测试这回事,不知道如何用。经过这篇文档的说明,就基本知道如何处理单元测试。
框架选型
常用单元测试框架:MSTest (Visual Studio官方)、XUnit 和 NUnit。
- MS Test为微软产品,集成在Visual Studio 2008+工具中。
- NUnit为.Net开源测试框架(采用C#开发),广泛用于.Net平台的单元测试和回归测试中,官方网址(www.nunit.org)。
- XUnit.Net为NUnit的改进版。
(以下主要讲解MSTest 和NUnit的使用,XUnit操作和NUnit操作基本类似)
基础实践
开始创建你的第一个的单元测试项目吧
1) 我们先来用 VS2017 中自带的测试模块(MSTest)来写一个简单的单元测试吧。
-
新建一个Solution,并添加项目UnitTestDemo(用于编写被测试的项目)
-
在该工程中添加UnitTestClass类,并书写一个静态的GetTriangle(string[] sideArr) 函数用来返回一个三角形的类型。
namespace UnitTest { public class UnitTestClass { /// <summary> /// 获取三角形类型. /// </summary> /// <param name="sideArr">三角形三边长度数组.</param> /// <returns>返回三角形类型名称.</returns> public static string GetTriangle(string[] sideArr) { string result = string.Empty; int a = int.Parse(sideArr[0]); int b = int.Parse(sideArr[1]); int c = int.Parse(sideArr[2]); if (a + b > c && a + c > b && b + c > a) { if (a == b && a == c) { result = "等边三角形"; } <