使用VisualStudio中的单元测试功能,可以很方便的创建单元测试项目、编写单元测试代码以及执行单元测试。而如何在VisualStudio中使用单元测试功能,就是本文和后面几篇想要说的了。

   1.创建测试项目
   在创建测试项目之前,我们还需要有一份待测试的代码,下面的是我准备的一小段代码。

namespace BigMan.UnitTest
{
    public class Program
    {
        public static int Add(int a, int b)
        {
            return a + b;
        }
        public static int Div(int a, int b)
        {
            return a / b;
        }
        static void Main(string[] args)
        {
        }
    }
}

   创建测试项目有两种方法,一种是在代码窗口中右键点击鼠标,选择【创建单元测试】。

使用VisualStudio进行单元测试_单元测试

   点击之后,会弹出下面的【创建单元测试】的对话框,选中要进行单元测试的方法,再选择对应的输出项目,如果解决方案中已经存在测试项目,则在【输出项目】的下拉框里会默认选中这个项目,没有则需要选择新建测试项目。点击【确定】就可以完成测试项目的创建了。

使用VisualStudio进行单元测试_单元测试_02


   需要说明的是,在Visual tudio 2010中,代码窗口的右键菜单里是默认有【创建单元测试】这项的,但在Visual Studio 2012里却消失了,需要大家手动把它调出来,具体方法可以参考http://www.jb51.net/softjc/83751.html

   还有一种方法是在解决方案资源管理器里,通过右键新增测试项目 ,和新增其他项目是一样的,最后选择项目的时候选择单元测试项目就可以了。只是这样建好项目后,针对各个方法的测试代码就全都需要手动去写了,当然也可以按照上面的方法去让Visual Studio自动生成,只要在【创建单元测试】的窗口中选择刚刚新建的测试项目作为【输出项目】就行了。

   2.维护测试代码


using BigMan.UnitTest;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
namespace UnitTestProject1
{
                                                                                                                                                                                                                                                                                                         
                                                                                                                                                                                                                                                                                                         
    /// <summary>
    ///这是 ProgramTest 的测试类,旨在
    ///包含所有 ProgramTest 单元测试
    ///</summary>
    [TestClass()]
    public class ProgramTest
    {
        private TestContext testContextInstance;
        /// <summary>
        ///获取或设置测试上下文,上下文提供
        ///有关当前测试运行及其功能的信息。
        ///</summary>
        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }
        #region 附加测试特性
        #endregion
        /// <summary>
        ///Div 的测试
        ///</summary>
        [TestMethod()]
        public void DivTest()
        {
            int a = 1; // TODO: 初始化为适当的值
            int b = 1; // TODO: 初始化为适当的值
            int expected = 1; // TODO: 初始化为适当的值
            int actual;
            actual = Program.Div(a, b);
            Assert.AreEqual(expected, actual);
            //Assert.Inconclusive("验证此测试方法的正确性。");
        }
        /// <summary>
        ///Add 的测试
        ///</summary>
        [TestMethod()]
        public void AddTest()
        {
            int a = 1; // TODO: 初始化为适当的值
            int b = 1; // TODO: 初始化为适当的值
            int expected = 2; // TODO: 初始化为适当的值
            int actual;
            actual = Program.Add(a, b);
            Assert.AreEqual(expected, actual);
            //Assert.Inconclusive("验证此测试方法的正确性。");
        }
    }
}

   简单介绍一下测试代码,首先是使用了TestClass特性来标识这个类中包含测试方法。然后是TestContext属性,这个属性用于在测试中提供上下文信息,实际使用过程中会有多种用途,在后面我会在用到时在详细介绍,本文的测试过程中并没有用到这个属性。【附加测试特性】中的代码因为暂时用不到而且会显得代码太过冗长,所以被我删掉了,里面的内容我们也会在后面陆续的接触到。最下面的两个方法则是针对我们代码中的Add()和Div()产生的两个测试方法。与测试类一样,测试方法也有个特性来标识--【TestMethod()】。

   以方法AddTest()为例,来看一下测试方法的基本结构。第一步,对a, b, expected声明并进行了初始化,它们分别对应了Add(int,int)方法的两个参数以及期望的返回值;声明actual,并调用Add方法将实际结果赋值给它。经过这两步,数据就准备完成了,最后是对测试结果进行判断,称之为(Assert)断言。本例中使用了Assert.AreEqual(),初次之外,Assert还有一系列的断言方法,如AreNotEqual,IsNull,IsNotNull,IsInstanceOfType等等,不在此一一列举了,大家可以在Visual Studio中通过代码的智能提示学习一下,或者干脆看一下MSDN的文档。最后一行的Assert.Inconclusive("验证此测试方法的正确性。");可以注释掉,否则会在运行测试时会跳过这个测试方法,并提示 "验证此测试方法的正确性"。我们修改一下测试方法中的参数a和b,以及期望结果的值,然后运行测试方法。

3.运行测试并查看测试结果

   运行测试的方法也有多种,既可以通过代码窗口中鼠标右键的菜单中选择【运行测试】,也可以通过菜单栏中的【测试】-【运行】-【所有测试】来运行测试,Visual Studio 2010 中还可以直接点击工具栏上的按钮来执行,但是在Viual Studio 2012中默认好像也消失了,应该还是需要手动来设置。

使用VisualStudio进行单元测试_Visual Studio_03

   最后测试的结果会如图所示,显示的信息包括执行的测试,运行时间,未通过的测试还会给出相应的失败信息,以供跟踪解决问题。修改代码,保存后再点击全部运行,或者选择只运行失败的测试,来测试修改的结果,直到测试全部通过。


   到此为止,一个最基本的,而且不够完善的单元测试就算完成了,下一篇将继续来完善对这两个方法的测试。