最后,单元测试使用如下代码示例中的数据。注意SQL脚本必须部署到测试运行目录,然后才能由命令脚本执行。
[TestClass]
public class UnitTests
{
private TestContext tc;
public TestContext TestContext
{
get { return tc; }
set { tc = value; }
}
[TestMethod]
[DataSource(
@"Provider=SQLOLEDB;Data Source=.\sqlexpress;
Integrated Security=SSPI;Initial Catalog=TestData",
"CalcTestData")]
[DeploymentItem("create.sql")]
[DeploymentItem("destroy.sql")]
public void DataDrivenAddTest()
{
int x = (int)TestContext.DataRow[0];
int y = (int)TestContext.DataRow[1];
int expected = (int)TestContext.DataRow[2];
int actual = MyUtils.Calc.Add(x, y);
bool shouldpass = (bool)TestContext.DataRow[3];
if (shouldpass)
Assert.AreEqual<int>(expected, actual);
else
Assert.AreNotEqual<int>(expected, actual);
}
}
public class UnitTests
{
private TestContext tc;
public TestContext TestContext
{
get { return tc; }
set { tc = value; }
}
[TestMethod]
[DataSource(
@"Provider=SQLOLEDB;Data Source=.\sqlexpress;
Integrated Security=SSPI;Initial Catalog=TestData",
"CalcTestData")]
[DeploymentItem("create.sql")]
[DeploymentItem("destroy.sql")]
public void DataDrivenAddTest()
{
int x = (int)TestContext.DataRow[0];
int y = (int)TestContext.DataRow[1];
int expected = (int)TestContext.DataRow[2];
int actual = MyUtils.Calc.Add(x, y);
bool shouldpass = (bool)TestContext.DataRow[3];
if (shouldpass)
Assert.AreEqual<int>(expected, actual);
else
Assert.AreNotEqual<int>(expected, actual);
}
}
DataSource属性设定关于连接字符串的信息,字符串指定包含数据驱动测试数据的测试数据库和表。这些数据对于TestContext对象的DataRow属性可用。在测试集合执行时,TestContext包含所有测试框架维护的有用信息。因为测试类提供TestContext类型的公共属性TestContext,所以测试框架提供当前TestContext对象的引用。每次调用测试都会读取CalcTestData表中的一行,TestContext类的DataRow属性表示每次调用的当前行。图11显示了测试的输出结果。

图11 数据驱动测试输出