数据驱动的单元测试的疑难解答
更新: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 的单独论坛中搜索答案或将问题发布到这些论坛中。