• VS2010中的测试(2)——单元测试


        在软件开发过程中,系统构架是有很多模块构成,而每个模块都有许多函数组成,当我们的系统发生错误时候,我们必须定位在发生的错误的模块,然后精确到某个模块中的某个函数中,而这个周期就是非常浪费时间和生产效率的,我们的大部分时间浪费在寻找此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

    我们添加几个参数,然后运行下看看结果:

    当然跟多的应用方法需要我们自己测试运行。

  • 相关阅读:
    你不可不知的50个互联网知识
    C算法学习笔记(2)-二叉查找树
    laravel 项目本地版本为5.5,线上mysql 为5.7.21版本,执行严格模式
    mysql中bigint、int、mediumint、smallint与tinyint的取值范围
    Laravel 登录后清空COOKIE 方法
    PHP进阶与redis锁限制并发访问功能示例
    微信开放平台开发——网页微信扫码登录(OAuth2.0)
    一起谈.NET技术,Nhibernate入门与demo 狼人:
    一起谈.NET技术,Siverlight与WCF通信之双工netTcp实现视频对话 狼人:
    一起谈.NET技术,详细述说ADO超时相关问题介绍 狼人:
  • 原文地址:https://www.cnblogs.com/zhijianliutang/p/2288423.html
Copyright © 2020-2023  润新知