发新话题
打印

[转载]数据驱动的单元测试

[转载]数据驱动的单元测试

文章作者:蝈蝈俊.net
信息来源:蝈蝈俊.net's blog

我们还是通过应用场景来理解这种 VS 2005 的单元测试方法。

先说需求:
比如我们有一个验证邮件格式是否正确的公共方法,
类似下面代码,这里简单只用正则表达式
namespace ClassLibrary1{
   public class EmailValidateClass   {
      public static bool ValidateEmail(string mail)      {
        System.Text.RegularExpressions.Regex r =
           new System.Text.RegularExpressions.Regex(@"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*");
        System.Text.RegularExpressions.Match m = r.Match(mail);
        return m.Success;
      }
   }
}

我们现在要测试这个方法。
我们手头有一大批的邮件地址,这些邮件地址是应该可以通过验证的,
另外一大批邮件地址,这些是不可以通过的。

我们采用普通的方式的话,每增加一个可通过或者不可通过的,我们都需要修改测试代码。
或者我们把这些信息记录到一个文件,然后测试程序里面手工打开这个文件,依次读取测试。
其实 VS 2005 给我们想到了这点问题,专门给我们提供一种叫 数据驱动的单元测试 方法。
下面就来说如何使用 数据驱动的单元测试 来实现这个功能。

环境准备
假设我们有一个可以通过验证的邮件列表,我们把这个列表保存到一个 Excel 文件
注意:默认ADO读取 Excel 文件,第一行,他认为是列名。
我们在第一行第一列,给它设置一个列名  Val1
然后从第二行开始,每一列,都是要测试的数据,类似下面的方式:
Val1
ghj@gmail.com
aaa@cc.dd
bbs_w@dd.net
wwww@hotmail.com

然后就是我们的测试代码了,如下:

using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace TestProject1
{
   [TestClass()]
   public class EmailValidateClassTest
   {
      private TestContext testContextInstance;

      public TestContext TestContext
      {
        get
        {
           return testContextInstance;
        }
        set
        {
           testContextInstance = value;
        }
      }
      [TestMethod()]
      [DeploymentItem("EmailData\\EmailData.xls")]
      [DataSource("System.Data.Odbc",
        "Dsn=Excel Files;dbq=D:\\My2005Codes\\TestCode\\TestTest\\TestProject1\\EmailData\\EmailData.xls;defaultdir=.; driverid=790;maxbuffersize=2048;pagetimeout=5",
        "Sheet1$",
        DataAccessMethod.Sequential)]
      public void ValidateEmailTest2()
      {
        if (TestContext.DataRow["Val1"] == null) return;
        string mail = TestContext.DataRow[0].ToString();
        bool tmp = ClassLibrary1.EmailValidateClass.ValidateEmail(mail);
        Assert.IsTrue(tmp);
        TestContext.WriteLine(mail);
        
      }
}

我们只要在测试方法的属性中,指定了访问 Excel 的方式,以及位置,然后我们在测试方法中,只要简单的通过 TestContext.DataRow["Val1"] 就可以获得需要测试的每行数据了。

其他的代码跟正常测试一样,就跳过。

当然这些测试数据,也可以保存在其他数据库,或者文本文件中。
只需要定义数据源访问的方式,就可以了。


参考资料:
演练:使用 Visual Studio Team Test 进行单元测试
http://www.microsoft.com/china/m ... stsunittesting.mspx

Visual Studio Team System  数据驱动的单元测试
http://msdn2.microsoft.com/zh-cn/library/ms182519.aspx

Visual Studio Team System  演练:使用配置文件定义数据源  
http://msdn2.microsoft.com/zh-cn/library/ms243192.aspx
http://iittss.com/ kijs与牛人在一起不是有理由的让自己变懒,那是为了让视野更开阔

TOP

发新话题