演练:使用配置文件定义数据源
本演练描述如何使用 app.config 文件中为单元测试定义的数据源。 您将学习如何创建一个定义数据源的 app.config 文件,此数据源可以由 DataSourceAttribute 类使用。 本演练所涉及的任务包括:
创建一个 app.config 文件。
定义一个自定义配置节。
定义连接字符串。
定义数据源。
使用 DataSourceAttribute 类访问数据源。
系统必备
若要完成此演练,您需要:
Visual Studio 高级专业版或 Visual Studio 旗舰版
Microsoft Access 或 Microsoft Excel,以便为至少一种测试方法提供数据。
包含一个测试项目的 Visual Studio 2012 解决方案。
创建 App.config 文件
向项目添加一个 app.config 文件
如果您的测试项目中已经有一个 app.config 文件,请转到定义一个自定义配置节。
右击**“解决方案资源管理器”中的测试项目,指向“添加”,再单击“新建项”**。
将打开**“添加新项”**窗口。
选择**“应用程序配置文件”模板,然后单击“添加”**。
定义一个自定义配置节
检查 app.config 文件。 它至少包含 XML 声明和一个根元素。
向 app.config 文件添加自定义配置节
app.config 的根元素应为 configuration 元素。 在 configuration 元素之内创建一个 configSections 元素。 configSections 应该是此 app.config 文件的第一个元素。
在 configSections 元素内,创建一个 section 元素。
在 section 元素中,添加一个名为 name 的特性并为其赋予一个等于 microsoft.visualstudio.testtools 的值。 添加另一个名为 type 的特性,为其赋予一个等于 Microsoft.VisualStudio.TestTools.UnitTesting.TestConfigurationSection, Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 的值。
section 元素看起来应该类似于:
<section name="microsoft.visualstudio.testtools" type="Microsoft.VisualStudio.TestTools.UnitTesting.TestConfigurationSection, Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
备注
程序集名称必须与您使用的 Microsoft Visual Studio .NET Framework 内部版本相匹配。如果使用的是 Visual Studio .NET Framework 3.5,请将版本设置为 9.0.0.0。如果使用的是 Visual Studio .NET Framework 2.0,请将版本设置为 8.0.0.0。
定义连接字符串
连接字符串定义用于访问数据源的特定于提供程序的信息。 配置文件中定义的连接字符串在整个程序范围内提供了可重用的数据提供程序信息。 在本节中,您将创建两个连接字符串,“自定义配置”节中定义的数据源会使用这两个连接字符串。
定义连接字符串
在 configSections 元素后面创建一个 connectionStrings 元素。
在 connectionStrings 元素内,创建两个 add 元素。
在第一个 add 元素中,为到 Microsoft Access 数据库的连接创建以下特性和值:
特性 |
值 |
---|---|
name |
"MyJetConn" |
connectionString |
"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\testdatasource.accdb; Persist Security Info=False;" |
providerName |
"System.Data.OleDb" |
在第二个 add 元素中,为到 Microsoft Excel 电子表格的连接创建以下特性和值:
name |
"MyExcelConn" |
connectionString |
"Dsn=Excel Files;dbq=data.xlsx;defaultdir=.; driverid=790;maxbuffersize=2048;pagetimeout=5" |
providerName |
"System.Data.Odbc" |
connectionStrings 元素看起来应该类似于:
<connectionStrings>
<add name="MyJetConn" connectionString="Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\testdatasource.accdb; 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>
定义数据源
数据源节包含四个特性,测试引擎使用它们从数据源检索数据。
name 定义一个标识,DataSourceAttribute 将使用此标识指定应使用哪一个数据源。
connectionString 标识在前面的“定义连接字符串”一节中创建的连接字符串。
dataTableName 定义用来保存要在测试中使用的数据的表格或表。
dataAccessMethod 定义用来访问数据源中的数据值的方法。
在本节中,您将定义在单元测试中使用的两个数据源。
定义数据源
在 connectionStrings 元素后面创建一个 microsoft.visualstudio.testtools 元素。 此节在“定义自定义配置”一节中创建。
在 microsoft.visualstudio.testtools 元素内,创建一个 dataSources 元素。
在 dataSources 元素内,创建两个 add 元素。
在第一个 add 元素中,为 Microsoft Access 数据源创建以下特性和值:
特性 |
值 |
---|---|
name |
"MyJetDataSource" |
connectionString |
"MyJetConn" |
dataTableName |
"MyDataTable" |
dataAccessMethod |
"Sequential" |
在第二个 add 元素中,为 Microsoft Excel 数据源创建以下特性和值:
Name |
"MyExcelDataSource" |
connectionString |
"MyExcelConn" |
dataTableName |
"Sheet1$" |
dataAccessMethod |
"Sequential" |
microsoft.visualstudio.testtools 元素看起来应该类似于:
<microsoft.visualstudio.testtools>
<dataSources>
<add name="MyJetDataSource" connectionString="MyJetConn" dataTableName="MyDataTable" dataAccessMethod="Sequential"/>
<add name="MyExcelDataSource" connectionString="MyExcelConn" dataTableName="Sheet1$" dataAccessMethod="Sequential"/>
</dataSources>
</microsoft.visualstudio.testtools>
最终的 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.accdb; 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="MyDataTable" dataAccessMethod="Sequential"/>
<add name="MyExcelDataSource" connectionString="MyExcelConn" dataTableName="Sheet1$" dataAccessMethod="Sequential"/>
</dataSources>
</microsoft.visualstudio.testtools>
</configuration>
使用 app.config 中定义的数据源创建单元测试
现在,已经定义了一个 app.config 文件,下面将使用该 app.config 文件中定义的数据源中的数据创建一个单元测试。 在本节中,我们将:
创建在 app.config 文件中找到的数据源。
在用来比较每个数据源中的值的两个测试方法中使用该数据源。
创建 Microsoft Access 数据源
创建一个名为 testdatasource.accdb 的 Microsoft Access 数据库。
在 testdatasource.accdb 中创建一个表,并将其命名为 MyDataTable。
使用 Number 数据类型,在 MyDataTable 中创建两个名称分别为 Arg1 和 Arg2 的字段。
分别使用以下的 Arg1 和 Arg2 值,为 MyDataTable 添加五个项:(10,50)、(3,2)、(6,0)、(0,8) 和 (12312,1000)。
保存并关闭数据库。
更改连接字符串,使其指向数据库所在的位置。 更改 Data Source 的值,以反映数据库的位置。
创建 Microsoft Excel 数据源
创建一个名为 data.xlsx 的 Microsoft Excel 电子表格。
在 data.xlsx 中创建一个名为 Sheet1 的表(如果尚不存在此表)。
在 Sheet1 中创建两个列标题,并将它们分别命名为 Val1 和 Val2。
分别使用以下的 Val1 和 Val2 值,为 Sheet1 添加五个项:(1,1)、(2,2)、(3,3)、(4,4) 和 (5,0)。
保存并关闭电子表格。
更改连接字符串,使其指向电子表格所在的位置。 更改 dbq 的值,以反映电子表格的位置。
使用 app.config 数据源创建一个单元测试
向测试项目添加一个单元测试。
有关更多信息,请参见针对现有代码创建并运行单元测试。
使用以下代码替换单元测试中自动生成的内容:
using System; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace TestProject1 { [TestClass] public class UnitTest1 { private TestContext context; public TestContext TestContext { get { return context; } set { context = value; } } [TestMethod()] [DeploymentItem("MyTestProject\\testdatasource.accdb")] [DataSource("MyJetDataSource")] public void MyTestMethod() { int a = Int32.Parse(context.DataRow["Arg1"].ToString()); int b = Int32.Parse(context.DataRow["Arg2"].ToString()); Assert.AreNotEqual(a, b, "A value was equal."); } [TestMethod()] [DeploymentItem("MyTestProject\\data.xlsx")] [DataSource("MyExcelDataSource")] public void MyTestMethod2() { Assert.AreEqual(context.DataRow["Val1"], context.DataRow["Val2"]); } } }
检查 DataSource 特性。 注意 app.config 文件中的设置名称。
生成解决方案并运行 MyTestMethod 和 MyTestMethod2 测试。
重要
部署数据源这样的项目,以便测试能够在部署目录中访问它们。