在软件开发过程中,系统构架是有很多模块构成,而每个模块都有许多函数组成,当我们的系统发生错误时候,我们必须定位在发生的错误的模块,然后精确到某个模块中的某个函数中,而这个周期就是非常浪费时间和生产效率的,我们的大部分时间浪费在寻找此Bug上,若果系统越复杂,那么我们定位错误的成本原来越高。所以在每个函数集成模块中,所以我们需要严格地单元测试来验证。在MVC模块中开发系统自动集成进去,在vs2010中我们可以为我们的函数自动生成单元测试,无论是public或者private的,我们通过鼠标右键都能自动生成单元测试函数,这个类定义在Microsoft.VisualStudio.TestTools.UnitTesting这个命名空间中。
首先我们先创建一个被测试的类库工程,然后添加被测试代码:
using System;
namespace ConsoleApplicationUnitTest
{
public class UnitTest
{
public double CalculateTotalPrice(double quantity)
{
double totalPrice;
double unitPrice;
unitPrice = 16.0;
totalPrice = unitPrice * quantity;
return totalPrice;
}
public void GetTotalPrice()
{
int qtV = 5;
double totolPrice = CalculateTotalPrice(qtV);
Console.WriteLine("总价:" + totolPrice);
}
}
}
然后我们需要单元测试的函数上鼠标右键,就会出现单元测试函数选项:
点击该选项后,然后就会弹出如下窗口,该窗口会显示该工程和类中的所有的函数,我们可以选择我们要进行的单元测试的函数:
在这个面板中我们可以设置项目的名称:
我们选择CalculateTotalPrice和GetTotalPrice两个函数,点击确定,然后我们需要我们输入测试工程的名称,点击确定,然后我们的单元测试的工程就自动创建好了,当然,这个自动创建的过程并不是完成的,而是为我们的单元测试搭建了一个框架而已。
我们看一下生成的测试代码:
#region 附加测试特性
//
//编写测试时,还可使用以下特性:
//
//使用 ClassInitialize 在运行类中的第一个测试前先运行代码
//[ClassInitialize()]
//public static void MyClassInitialize(TestContext testContext)
//{
//}
//
//使用 ClassCleanup 在运行完类中的所有测试后再运行代码
//[ClassCleanup()]
//public static void MyClassCleanup()
//{
//}
//
//使用 TestInitialize 在运行每个测试前先运行代码
//[TestInitialize()]
//public void MyTestInitialize()
//{
//}
//
//使用 TestCleanup 在运行完每个测试后运行代码
//[TestCleanup()]
//public void MyTestCleanup()
//{
//}
//
#endregion
/// <summary>
///CalculateTotalPrice 的测试
///</summary>
[TestMethod()]
public void CalculateTotalPriceTest()
{
UnitTest target = new UnitTest(); // TODO: 初始化为适当的值
double quantity = 0F; // TODO: 初始化为适当的值
double expected = 0F; // TODO: 初始化为适当的值
double actual;
actual = target.CalculateTotalPrice(quantity);
Assert.AreEqual(expected, actual);
Assert.Inconclusive("验证此测试方法的正确性。");
}
/// <summary>
///UnitTest 构造函数 的测试
///</summary>
[TestMethod()]
public void UnitTestConstructorTest()
{
UnitTest target = new UnitTest();
Assert.Inconclusive("TODO: 实现用来验证目标的代码");
}
此处还可以注意到自动生成的代码有一些被注释的方法,这些方法我们可以选择使用
1、[ClassInitialize()]标记的方法可在运行类中的第一个测试前运行代码。
2、[ClassCleanUp()]标记的方法可在运行完类中的所有测试后运行代码。
3、[TestInitialize()]标记的方法可在运行每个测试前运行代码。
4、[TestCleanUp()]标记的方法可在运行完每个测试后运行代码。
在测试项目中,微软为我们提供了关键的类Assert语句,用Assert语句用来比较返回值和期望值,然后返回pass或者fail的结果。如果在一个测试方法多个Assert的话,那么这个测试方法要通过测试必须让所有的Assert方法通过,不然,其中有一个fail,那么一个case就会fail.如果我们的单元测试没有任何的Assert语句,那么它的结果始终是pass的。
Assert类有许多进行比较的方法,此外此外StringAsserts,CollectionAssert类也可用于单元测试中,具体我们可以参照MSDN
我们添加几个参数,然后运行下看看结果:
当然跟多的应用方法需要我们自己测试运行。