在软件开发过程中,系统构架是有很多模块构成,而每个模块都有许多函数组成,当我们的系统发生错误时候,我们必须定位在发生的错误的模块,然后精确到某个模块中的某个函数中,而这个周期就是非常浪费时间和生产效率的,我们的大部分时间浪费在寻找此Bug上,若果系统越复杂,那么我们定位错误的成本原来越高。所以在每个函数集成模块中,所以我们需要严格地单元测试来验证。在MVC模块中开发系统自动集成进去,在vs2010中我们可以为我们的函数自动生成单元测试,无论是public或者private的,我们通过鼠标右键都能自动生成单元测试函数,这个类定义在Microsoft.VisualStudio.TestTools.UnitTesting这个命名空间中。
首先我们先创建一个被测试的类库工程,然后添加被测试代码:
usingSystem; namespaceConsoleApplicationUnitTest { publicclassUnitTest { publicdoubleCalculateTotalPrice(doublequantity) { doubletotalPrice; doubleunitPrice; unitPrice=16.0; totalPrice=unitPrice*quantity; returntotalPrice; } publicvoidGetTotalPrice() { intqtV=5; doubletotolPrice=CalculateTotalPrice(qtV); Console.WriteLine("总价:"+totolPrice); } } } |
然后我们需要单元测试的函数上鼠标右键,就会出现单元测试函数选项:
点击该选项后,然后就会弹出如下窗口,该窗口会显示该工程和类中的所有的函数,我们可以选择我们要进行的单元测试的函数:
在这个面板中我们可以设置项目的名称:
我们选择CalculateTotalPrice和GetTotalPrice两个函数,点击确定,然后我们需要我们输入测试工程的名称,点击确定,然后我们的单元测试的工程就自动创建好了,当然,这个自动创建的过程并不是完成的,而是为我们的单元测试搭建了一个框架而已。
我们看一下生成的测试代码:
#region附加测试特性 // //编写测试时,还可使用以下特性: // //使用ClassInitialize在运行类中的第一个测试前先运行代码 //[ClassInitialize()] //publicstaticvoidMyClassInitialize(TestContexttestContext) //{ //} // //使用ClassCleanup在运行完类中的所有测试后再运行代码 //[ClassCleanup()] //publicstaticvoidMyClassCleanup() //{ //} // //使用TestInitialize在运行每个测试前先运行代码 //[TestInitialize()] //publicvoidMyTestInitialize() //{ //} // //使用TestCleanup在运行完每个测试后运行代码 //[TestCleanup()] //publicvoidMyTestCleanup() //{ //} // #endregion ///<summary> ///CalculateTotalPrice的测试 ///</summary> [TestMethod()] publicvoidCalculateTotalPriceTest() { UnitTesttarget=newUnitTest();//TODO:初始化为适当的值 doublequantity=0F;//TODO:初始化为适当的值 doubleexpected=0F;//TODO:初始化为适当的值 doubleactual; actual=target.CalculateTotalPrice(quantity); Assert.AreEqual(expected,actual); Assert.Inconclusive("验证此测试方法的正确性。"); } ///<summary> ///UnitTest构造函数的测试 ///</summary> [TestMethod()] publicvoidUnitTestConstructorTest() { UnitTesttarget=newUnitTest(); 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
我们添加几个参数,然后运行下看看结果:
当然跟多的应用方法需要我们自己测试运行。
上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。