数据驱动的单元测试的疑难解答

更新:2007 年 11 月

在运行数据驱动的单元测试时,您可能会遇到连接、身份验证、部署问题或其他问题。使用以下各节中的信息可以解决这些问题。

测试无法连接到数据源

请确保用来运行测试的用户帐户能够访问该数据源。为此,您必须知道使用的是哪个用户帐户来运行测试。例如,当您远程运行测试时,测试将在代理的用户帐户下运行。

ASP.NET 问题

运行在 IIS Web 服务器上的 ASP.NET 测试是在“aspnet”帐户下运行的。因此,请确保 ASP.NET 用户能够访问数据源。

而且,如果您使用“Excel ODBC Dsn”,还必须创建“系统 Dsn”。“系统 Dsn”对于所有的用户都是可用的。要创建 DSN,请使用 ODBC 数据源管理器。为此,请单击“开始”,依次打开“控制面板”、“管理工具”和“数据源”。

部署数据源文件

如果您使用数据源文件(如 Microsoft Excel 工作表或 .CSV 文件),请确保它在测试运行时可用。执行此操作的一种方法是,使用测试运行配置对话框将数据源文件作为一个部署项添加进来,或者将数据源文件作为每个测试的部署项添加进来。而且,还应指定该文件的相对路径。有关测试运行配置的更多信息,请参见配置测试执行

身份验证问题

应尽可能使用 Windows 身份验证。

连接字符串

尽管使用“数据连接”对话框可以很方便地连接到 Microsoft SQL Server 和 Oracle,但是,当必须建立到文件数据源的连接时,使用该对话框就不那么方便了。对于这些数据源,您可以指定一个连接字符串,然后从“属性”窗口中的下拉列表框中选择一个数据表名称。

下表举例说明了大多数数据提供程序的提供程序名称和连接字符串。

数据源

提供程序名称

连接字符串

MS SQL Server(.NET 提供程序)

System.Data.SqlClient

Data Source=SqlServerName;InitialCatalog=MyDatabaseName;Integrated Security=True;Connect Timeout=30;User Instance=True

MS SQL Express Server(.NET 提供程序)

System.Data.SqlClient

Data Source=.\SQLEXPRESS;AttachDbFilename=C:\ \Test.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True

MS SQL Server(OLEDB MDAC 提供程序)

System.Data.OleDb

Provider=SQLOLEDB;Data Source= SqlServerName;Integrated Security=SSPI;Initial Catalog=MyDatabaseName

MS SQL Server(OLEDB 本机客户端提供程序)

System.Data.OleDb

Provider=SQLNCLI;Data Source= MySqlServerComputerName;Integrated Security=SSPI;Initial Catalog= MyDatabaseName

MS SQL (ODBC)

System.Data.Odbc

Driver={SQL Server};Server=SqlServerName;Database=DatabaseName;Trusted_Connection=yes

Driver={SQL Server};Server=SqlServerName;Database=DatabaseName;Uid=UserName;Pwd=<password>

Oracle(.NET 提供程序)

System.Data.OracleClient

Data Source=OracleServerName;Persist Security Info=True;User ID=scott;Password=<password>;Unicode=True

Oracle(OLEDB Oracle 提供程序)

System.Data.OleDb

Provider=OraOLEDB.Oracle;Data Source=OracleServerName;Persist Security Info=True;OSAuthent=1

Provider=OraOLEDB.Oracle;Data Source=OracleServerName;Persist Security Info=True;User ID=scott;Password=<password>

Oracle(OLEDB Microsoft 提供程序)

System.Data.OleDb

Provider=MSDAORA;Data Source= OracleServerName;Persist Security Info=True; User ID=scott;Password=<password>

Oracle (ODBC)

System.Data.Odbc

Driver={Microsoft ODBC for Oracle};Server=OracleServerName;Uid=scott;Pwd=<password>

Excel (OLEDB)

System.Data.OleDb

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\ Test.xls;Persist Security Info=False;Extended Properties="Excel 8.0"

Excel(ODBC MS Excel 驱动程序)

System.Data.Odbc

Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq=C:\\Test.xls;DefaultDir=C:\

提示   对于 Sheet1 表,使用 Sheet1$ 作为数据表名称。

Excel (ODBC Dsn)

System.Data.Odbc

Dsn=Excel Files;dbq=C:\Test.xls;defaultdir=C:\;driverid=790;maxbuffersize=2048;pagetimeout=5

提示   当在 ASP.NET 下运行测试时,应考虑用“系统 DSN”代替“用户 DSN”。

CSV/文本文件 (OLEDB)

System.Data.OleDb

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\;Extended Properties="text;HDR=Yes;FMT=Delimited”

提示   对于 test.csv 文件,应使用 test#csv 作为表名。

注意   HDR=Yes 表示第一行中包含列名,而非实际数据。

CSV/文本文件 (ODBC)

System.Data.Obdc

Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=c:\;Extensions=asc,csv,tab,txt

通过 Dsn 实现的 ODBC

System.Data.Obdc

Dsn=MyDsn;Uid=UserName;Pwd=<password>

FILEDSN=C:\MyDsn.dsn;Uid=UserName;Pwd=<password>

指定与编译代码分开的数据源

可以使用 App.config 文件来为测试指定数据源。这样您就可以在不重新编译测试程序集的情况下更改数据源的属性,如服务器、表名等等。从命令行运行测试时,请确保 App.config 文件与测试程序集在同一个目录中。

示例:

[TestMethod][DataSource("MyDataSource")]

[DeploymentItem("MyDataSource.csv")]public void MyTest() {}

App.config 文件的内容:

<configSections><section name="microsoft.visualstudio.qualitytools" type="Microsoft.VisualStudio.QualityTools.UnitTesting.Framework.TestConfigurationSection, Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/></configSections><microsoft.visualstudio.qualitytools><dataSources><add name="MyDataSource" connectionString="MyConnectionString" dataTableName="ChildSearchCriteria" dataAccessMethod="Sequential" /></dataSources></microsoft.visualstudio.qualitytools>

说明:

Run unit tests in application domain 属性决定各个单元测试程序集是否将在单独的应用程序域中运行。该属性的默认设置为 True。如果您进行的单元测试不要求单独的应用程序域或 app.config 文件正常工作,则将该属性的值设置为 False 可能会使这些单元测试运行得更快。

在 TestInitialize 中初始化数据库之后,所做的更改不出现

在运行数据驱动的测试时,单元测试适配器会连接到您的数据表并生成数据行列表。然后对于每一行都执行 TestInitialize、TestMethod 和 TestCleanup 方法。如果您在 TestInitialize 中更改数据行,则这些更改将不会显示在单元测试适配器中。因此,如果您要更改数据驱动测试的数据表,请在 ClassInitialize 或 AssemblyInitialize 方法中进行。

单元测试通过,但是不包含内部结果

此结果说明数据表中不包含任何行。

其他问题

如果您的问题未在此处列出,则可以尝试在支持论坛以及 Visual Studio Team Edition for Developers 与 Visual Studio Team System Test Edition 的单独论坛中搜索答案或将问题发布到这些论坛中。

请参见

任务

如何:配置数据驱动的单元测试

概念

编写数据驱动的单元测试的代码