使用 Visual Studio 2005 Team System 进行单元测试并生成用于 Unit Test Framework 的源代码 (实例) (轉載)

这是笔者在学习的过程中,曾经做的一个使用VSTS 2005 结合数据库库,做的一个Unit Test(单元测试)的Demo,为配合《使用 Visual Studio 2005 Team System 进行单元测试并生成用于 Unit Test Framework 的源代码 详解》理解和应用,整理出来,也为了加强自己的理解,为初学者提供一些资料。

 

1. 新建一个空白解决方案,命名为"单元测试- 01"吧。

 

2.在该解决方案下创建一个类库,作为此次单元测试的测试对象;我们就创建一个数学类(用于实现运算的简单类)。命名为" Jack.MathLib".

(1). 在该类中创建一个类文件, 命名为" Math.cs ";

(2). 实现一个加法运算的方法,编写如下代码:

 

Code
namespace Jack.MathLib
{
    
public class Math                      // 数学计算类
    {
        
public int Add(int x, int y)       // 加法运算,对两个整数进行加法操作
        {
            
return x + y;
        }
    }
}

 

3. 现在为了测试该数序计算类中的方法,我们在该解决方案中添加一个测试项目,命名" Jack.MathLibTest ",创建方法如下:

 

 

命名后,点击" 确定 "Vs 将为你添加必要的文件和说明:如:

1AuthoringTests.txt (Visual Studio Team System:创作和运行测试的概述 );

2)同时还为该项目引用了" Microsoft.VisualStudio.QualityTools.UnitTestFramework "程序集,

 

4.右击该测试项目,添加一个单元测试,如下所示,该过程其实类似于《使用 Visual Studio 2005 Team System 进行单元测试并生成用于 Unit Test Framework 的源代码 详解》中,在某个类名上 右击选择"创建单元测试"是差不多的。

(1) 添加一个单元测试:

 

 

2)根据向导,进行如下设置即可:

 

 

3)点击确定:VSTS将为你添加一个单元测试类文件, 代码如下:

 

  a). VSTS 同时将Jack.MathLib程序集添加到该项目的引用列表中:

  b). VSTS 同时也根据你要进行测试的类,提供了适当的代码:

 

// 以下代码由 Microsoft Visual Studio 2005 生成。
// 
测试所有者应该检查每个测试的有效性。
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Text;
using System.Collections.Generic;
using Jack.MathLib;
namespace Jack.MathLibTest
{
    
/// <summary>
    
///这是 Jack.MathLib.Math 的测试类,旨在
    
///包含所有 Jack.MathLib.Math 单元测试
    
///</summary>
    [TestClass()]
    
public class MathTest
    {
        
private TestContext testContextInstance;

        
/// <summary>
        
///获取或设置测试上下文,上下文提供
        
///有关当前测试运行及其功能的信息。
        
///</summary>
        public TestContext TestContext
        {
            
get
            {
                
return testContextInstance;
            }
            
set
            {
                testContextInstance = value;
            }
        }
        
#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>
        
///Add (int, int) 的测试
        
///</summary>
        [TestMethod()]
        
public void AddTest()
        {
            Math target = 
new Math();

            
int x = 0// TODO: 初始化为适当的值

            
int y = 0// TODO: 初始化为适当的值

            
int expected = 0;
            
int actual;

            actual = target.Add(x, y);

            Assert.AreEqual(expected, actual, 
"Jack.MathLib.Math.Add 未返回所需的值。");
            Assert.Inconclusive(
"验证此测试方法的正确性。");
        }

    }
}

 

5. 这里我采用数据库,为测试提供适当数据。

1)在测试项目中添加一个Config文件,命名为 “App.config”,添加如下代码:

 

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    
<configSections>
        
<section name="microsoft.visualstudio.testtools" type="Microsoft.VisualStudio.TestTools.UnitTesting.TestConfigurationSection, Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
    
</configSections>
    
<connectionStrings>
        
<add name="MyJetConn" connectionString="Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\testdatasource.mdb; Persist Security Info=False;" providerName="System.Data.OleDb" />
        
<add name="MyExcelConn" connectionString="Dsn=Excel Files;dbq=data.xlsx;defaultdir=.; driverid=790;maxbuffersize=2048;pagetimeout=5" providerName="System.Data.Odbc" />
    
</connectionStrings>
    
<microsoft.visualstudio.testtools>
        
<dataSources>
            
<add name="MyJetDataSource" connectionString="MyJetConn" dataTableName="MyTable" dataAccessMethod="Sequential"/>
            
<add name="MyExcelDataSource" connectionString="MyExcelConn" dataTableName="Sheet1$" dataAccessMethod="Sequential"/>
        
</dataSources>
    
</microsoft.visualstudio.testtools>
</configuration>

 这里提供了两种测试数据源如“Sql server” “Access”;我们以Access为例。

2)创建一个Access文件(data.xlsx, App.config文件中的数据源路径保持一致),并添加适当数据:

 

 

3)修改该测试类(“MathTest.cs”)的代码:

 

Code
// 以下代码由 Microsoft Visual Studio 2005 生成。
// 
测试所有者应该检查每个测试的有效性。
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Text;
using System.Collections.Generic;
using Jack.MathLib;
namespace Jack.MathLibTest
{
    
/// <summary>
    
///这是 Jack.MathLib.Math 的测试类,旨在
    
///包含所有 Jack.MathLib.Math 单元测试
    
///</summary>
    [TestClass()]
    
public class MathTest
    {
        
private TestContext testContextInstance;

        
/// <summary>
        
///获取或设置测试上下文,上下文提供
        
///有关当前测试运行及其功能的信息。
        
///</summary>
        public TestContext TestContext
        {
            
get
            {
                
return testContextInstance;
            }
            
set
            {
                testContextInstance = value;
            }
        }
        
#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>
        
/////Add (int, int) 的测试
        
/////</summary>
        //[TestMethod()]
        //public void AddTest()
        //{
        //    Math target = new Math();

        //    int x = 0; // TODO: 
初始化为适当的值

        //    int y = 0; // TODO: 
初始化为适当的值

        //    int expected = 0;
        //    int actual;

        //    actual = target.Add(x, y);

        //    Assert.AreEqual(expected, actual, "Jack.MathLib.Math.Add 
未返回所需的值。");
        //    Assert.Inconclusive("
验证此测试方法的正确性。");
        //}

        
/// <summary>
        
///Add (int, int) 的测试
        
///</summary>
        [TestMethod()]
        [DataSource(
"MyJetDataSource")]
        
public void AddTest()
        {
            Jack.MathLib.Math target = 
new Jack.MathLib.Math();

            
int x = int.Parse(testContextInstance.DataRow["arg1"].ToString());
            
int y = int.Parse(testContextInstance.DataRow["arg2"].ToString());
            
int rest = int.Parse(testContextInstance.DataRow["rest"].ToString());

            
int expected = rest;
            
int actural = target.Add(x, y);
            Assert.AreEqual(expected, actural, 
"预期值和实际值相等。");
        }

    }
}

 

 需要注意的就是:

         [DataSource("MyJetDataSource")] 的使用。

(4) 设置测试项目为"启动项目",点击" 启动选定的测试项目(不调试)"

 

 

VSTS下面,可以看到他的测试进程
posted on 2008-10-10 10:24  youngtsinghua  阅读(166)  评论(0编辑  收藏  举报