Visual Studio 2008单元测试(1)_开篇
   说到单元测试,引用《单元测试之道C#版》里面的一段话:
单元测试是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。例如,你可能把一个很大的值放入一个有序list  
中去,然后确认该值出现在list  的尾部。或者,你可能会从字符串中删除匹配某种模式的字符,然后确认字符串确实不再包含这些字符了。
执行单元测试,是为了证明某段代码的行为确实和开发者所期望的一致。
其实进行单元测试很简单,下面本人介绍Visual Studio 2008自带的单元测试功能:
第一步:首先建立一个C#类库项目,其中增加一个Contract类,此类有一个GetContractNameByGUID方法,具体代码如下:
| 
 using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
namespace Business 
{ 
    public class Contract 
    { 
        private string _ContractName; 
        public string ContractName 
        { 
            get 
            { 
                return _ContractName; 
            } 
            set 
            { 
                _ContractName = value; 
            } 
        } 
        public Contract() 
        { 
        } 
        public Contract(string contractName) 
        { 
            this._ContractName = contractName; 
        } 
        //通过合同GUID获取合同名称 
        public string GetContractNameByGUID (string 
strContractGUID) 
        { 
            if (strContractGUID.Length > 10) 
            { 
                return "10"; 
            } 
            else 
            { 
                return "8"; 
            } 
        } 
    } 
} 
 | 
第二步:创建单元测试代码
在Visual 2008里面创建单元测试代码其实很简单,在类名单击鼠标右键,点击“创建单元测试”菜单即可,如下图所示:


       然后弹出“创建单元测试”的对话框,可选择当前程序集中的类的函数创建单元测试项目,默认选择当前类,如下图所示: 

       点击“确定”,Viual 
2008会自动生成ContractTest类,包括GetContractNameByGUIDTest函数供测试GetContractNameByGUID,如下图所示:
| 
 ///  
        ///GetContractNameByGUID 的测试 
        /// 
        [TestMethod()] 
        public void GetContractNameByGUIDTest() 
        { 
            Contract target = new Contract(); // TODO: 
初始化为适当的值 
            string strContractGUID = 
string.Empty; // TODO: 初始化为适当的值 
            string expected = 
string.Empty; // TODO: 初始化为适当的值 
            string actual; 
            actual = 
target.GetContractNameByGUID(strContractGUID); 
            Assert.AreEqual(expected, 
actual); 
            Assert.Inconclusive("验证此测试方法的正确性。"); 
        } 
 | 
其中,strContractGUID为GetContractNameByGUID函数的输入参数,默认值为string.Empty,expected变更为预计输出值,默认值也为string.Empty,需要我们进行个性化设置。Assert.AreEqual为验证指定的值是否相等的函数,如果不相等则认为失败,就是通过此方法来测试函数的输入与我们的预计输出是否相等,Assert.Inconclusive代码为输出结果时显示的内容,我们不需要显示,只需要显示错误信息即可,因此需要删除掉此行代码。我们将自动生成的代码改造如下:
| 
 ///  
        ///GetContractNameByGUID 的测试 
        /// 
        [TestMethod()] 
        public void GetContractNameByGUIDTest() 
        { 
            Contract target = new Contract(); // TODO: 
初始化为适当的值 
  string strContractGUID = "  
111111111   "; // TODO: 初始化为适当的值 
            string expected = "8"; // TODO: 
初始化为适当的值 
            string actual; 
            actual = 
target.GetContractNameByGUID(strContractGUID); 
            Assert.AreEqual(expected, actual); 
         } 
 | 
       第三步:执行测试代码
       在Visual 2008可以很方便执行测试代码,可点击“运行上下文中的测试”按钮进行测试,如下图: 

       执行完后,可在“测试结果”窗口查看我们的单元测试结果,如下图所示:


       从结果可知,测试结果不能过,可通过查看错误信息帮助我们找出错误原因,原来" 111111111 
 "字符串前后都存在空格,字符串的长度大于10,我们判断长度时应该去除掉前后的空格,将代码改造如下:
| 
 //通过合同GUID获取合同名称 
        public string GetContractNameByGUID (string 
strContractGUID) 
        { 
            if (strContractGUID.Trim().Length > 10) 
            { 
                return "10"; 
            } 
            else 
            { 
                return "8"; 
            } 
        } 
 | 
       重新执行测试代码,结果如下: 

       测试通过,代码没有问题。
       本篇简单介绍了Visual2008最简单的单元测试功能,下期将介绍如何利用Visual2008进行Web页面的测试。
推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架