使用VisualStudio进行单元测试之二

时间:2024-10-18 14:03:50

借着工作忙的借口,偷了两天懒,今天继续单元测试之旅。前面说了如何进行一个最简单的单元测试,这次呢就跟大家一起来熟悉一下,在visual studio中如何进行数据驱动的单元测试。

开始之前先来明确一下,什么是数据驱动的单元测试,借用一下msdn里的文字,就是通过使用Microsoft单元测试框架用于托管代码,可以设置单元测试方法来检索数据源中要在测试方法中使用的值。连续运行方法时更加方便的使用一个方法来测试不同的输入数据源中的每一行。

下面正式开始!

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

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

2.既然是数据驱动,那还需要来准备用于测试的数据。

数据源的类型没有明确要求,应该只要是.NET支持的数据源类型,就都是可以的。这次演示所采用的数据源类型是Access,具体内容如下图,有一张表AddMethod用来保存Add方法的测试数据,表中的列则分别对应着Add方法的两个参数以及返回值。

使用VisualStudio进行单元测试之二

3.数据有了,下一步就是将数据源配置到测试程序里

数据源的绑定,是通过一个DataSourceAttribute的特性来实现的,具体的使用方法也很简单,在测试方法的方法名上,使用这个DataSource,并传入连接字符串,以及数据表名就可以了。

 [TestMethod()]
[DataSource(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\bigman\Documents\TestData.accdb","AddMethod")]
public void AddTest()
{
...
}

这个特性的构造器还有一个只是用一个参数的重载DataSourceAttribute(String),参数对应的是配置文件中的键值,也就是将连接字符串以及表名保存在app.config中。

4.编写测试代码

        /// <summary>
///Add 的测试
///</summary>
[TestMethod()]
[DataSource(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\bigman\Documents\TestData.accdb","AddMethod")]
public void AddTest()
{
// Access the data
int x = Convert.ToInt32(TestContext.DataRow["FirstNumber"]);
int y = Convert.ToInt32(TestContext.DataRow["SecondNumber"]);
int expected = Convert.ToInt32(TestContext.DataRow["Sum"]);
int actual = Program.Add(x, y);
Assert.AreEqual(expected, actual,
"x:<{0}> y:<{1}>",
new object[] { x, y });
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

在上面的代码中,可以看到起了关键作用的一个属性,也就是前面我们提到过的TestContext,DataRow的类型为System.Data.DataRow,“FirstName”则是对应数据源中的列名。只要熟悉了TestContext的这种用法,代码还是一如既往的简单。

5.运行测试

使用VisualStudio进行单元测试之二

看一下前面准备的测试数据,很显然有一组是错误的,0+2不等于0哈~~

插一嘴,刚开始我看这个错误提示怎么看怎么别扭,0+2怎么还应为0嘞?其实是因为测试嘛,我们是要假定我们给的测试数据都是正确的,我们给的是0,所以测试的期望值自然也就是0了。毕竟我们用单元测试是来测代码,不是测测试用例是不是对的。就这么点儿东西,我居然好几分钟没转过弯来~~

这次就到这儿了