• 使用VisualStudio进行单元测试之一


    使用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)
            {
            }
        }
    }

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

    Image

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

    Image(1)

       需要说明的是,在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中默认好像也消失了,应该还是需要手动来设置。

    Image(2)

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

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

    http://bigman.pw
  • 相关阅读:
    块编程指南
    libxml2:Debug模式可以编译,Distribution下不可以?
    CIO应该考虑的九个外包神话和现实
    【Android游戏开发二十四】360°平滑游戏摇杆(触屏方向导航)
    自定义 UITableViewCell 的 accessory 样式
    提升UNIX安全性的Unix SSH示例配置
    java 跟.net webservice 互通问题
    外包合同中降低成本的战略性技巧
    get post
    Android SAX API: XmlResourceParser及其扩展应用
  • 原文地址:https://www.cnblogs.com/renzhiwei/p/live_writer.html
Copyright © 2020-2023  润新知