我正在尝试使用Excel作为数据源进行单元测试。我收到以下异常。我们如何纠正它?
单元测试适配器无法连接到数据源或无法读取 数据。有关解决此错误的详细信息,请参阅 “对数据驱动的单元测试进行故障排除”
[TestMethod]
[Owner("Lijo ")]
[TestProperty("TestCategory", "Developer"),
DataSource("Microsoft.ACE.OLEDB.12.0",
"Data Source=C:/Sheets/DataSheet.xlsx;Extended Properties=Excel 12.0;",
"[Sheet1$]",
DataAccessMethod.Sequential)]
public void ChangePasswordTest()
{
int a = Convert.ToInt32(TestContext.DataRow[0]); //(int)Column.UserId
int b = Convert.ToInt32(TestContext.DataRow[1]);
int expectedResult = Convert.ToInt32(TestContext.DataRow[2]);
MyClass myObj = new MyClass(1, "P@ssw0rd");
int actualResult = myObj.GetAdditionResult(a, b);
Assert.AreEqual<int>(expectedResult, actualResult, "The addition result is incorrect.");
}
读数:
Unit Testing Error - The unit test adapter failed to connect to the data source or to read the data
How to create Startup and Cleanup script for Visual Studio Test Project?
How Does MSTEST/Visual Studio 2008 Team Test Decide Test Method Execution Order?
Visual Studio 2010 Ultimate - Data Generation Plan Setting Incorrect Data Type for Column
答案 0 :(得分:4)
以不同的方式解决了这个问题。其他答案是受欢迎的。
参考:演练:使用配置文件定义数据源http://msdn.microsoft.com/en-us/library/ms243192.aspx
[TestMethod]
[DeploymentItem("C:/Sheets/DataSheet.xlsx")]
[DataSource("MyExcelDataSource")]
public void ChangePasswordTest()
{
int a = Convert.ToInt32(TestContext.DataRow[0]); //(int)Column.UserId
int b = Convert.ToInt32(TestContext.DataRow[1]);
int expectedResult = Convert.ToInt32(TestContext.DataRow[2]);
MyClass myObj = new MyClass(1, "P@ssw0rd");
int actualResult = myObj.GetAdditionResult(a, b);
Assert.AreEqual<int>(expectedResult, actualResult, "The addition result is incorrect.");
}
<强> App.Config中强>
<configuration>
<configSections>
<section name="microsoft.visualstudio.testtools"
type="Microsoft.VisualStudio.TestTools.UnitTesting.TestConfigurationSection, Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</configSections>
<connectionStrings>
<add name="MyExcelConn"
connectionString="Dsn=Excel Files;dbq=C:/Sheets/DataSheet.xlsx;defaultdir=.; driverid=790;maxbuffersize=2048;pagetimeout=5" providerName="System.Data.Odbc" />
</connectionStrings>
<microsoft.visualstudio.testtools>
<dataSources>
<add name="MyExcelDataSource"
connectionString="MyExcelConn"
dataTableName="Sheet1$"
dataAccessMethod="Sequential"/>
</dataSources>
</microsoft.visualstudio.testtools>
</configuration>
对于VS 2010,使用的TestTools版本为Version = 10.0.0.0
答案 1 :(得分:4)
我今天褪去了同样的任务。在经历了一些令人头疼的事情后,我能够在没有app.config的情况下解决:
[TestMethod]
[DataSource("System.Data.OleDB",
@"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Sheets\DataSheet.xlsx; Extended Properties='Excel 12.0;HDR=yes';",
"Sheet1$",
DataAccessMethod.Sequential
)]
public void ChangePasswordTest()
{
//Arrange
//Act
//Assert
}
如果您在测试项目中使用Excel文件作为资源,则必须将文件的“复制到输出目录”属性设置为Copy always
或Copy if newer
。并将DeploymentItem
属性添加到您的测试中:
[TestMethod]
[DataSource("System.Data.OleDB",
@"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=.\DataSheet.xlsx; Extended Properties='Excel 12.0;HDR=yes';",
"Sheet1$",
DataAccessMethod.Sequential
)]
[DeploymentItem(".\DataSheet.xlsx")]
public void ChangePasswordTest()
{
//Arrange
//Act
//Assert
}
答案 2 :(得分:3)
虽然它与问题没有100%相关,也许有点微不足道,但我想在这个一般主题上投入两分钱(这是我发现的最相关的问题) )。
在我目前正在进行的项目中,我遇到了进行一些简单的数据驱动单元测试的需要(例如,对于给定的测试可能大约20行左右)。我的数据驱动&#34;框架的愿望清单&#34;是:
尽管希望#4,我还是研究了xUnit和NUnit之类的外部库。他们似乎解决了#3愿望,但在#1和#2愿望方面做得并不好。
由于缺乏简单的解决方案而感到沮丧,我决定自己实施一个非常基本的数据驱动助手:
public static void DataDrivenTest(Action<List<object>> testAction, List<List<object>> dataRows)
{
foreach (var dataRow in dataRows)
testAction(dataRow);
}
我这样用:
[TestMethod]
public void Unit_Can_Add_Two_Numbers()
{
UnitTestUtilities.DataDrivenTest(
dataRow =>
{
// Tests a+b=c
var a = (int)dataRow[0];
var b = (int)dataRow[1];
var c = (int)dataRow[2];
Assert.AreEqual(a + b, c);
},
new List<List<object>>
{
// Rows of arguments a,b,c respectively
new List<object>{1,2,3},
new List<object>{4,5,9}
});
}
虽然它符合我上面的所有愿望,但它有缺点:
无论如何,它以一种简单的方式解决了我的基本问题。我希望能帮助那些寻找像我一样的简单解决方案的人。毕竟,如果您发现需要一吨测试行来测试方法,那么可能值得考虑一个重构器将测试中的函数分解为更小的组件(然后与模拟/伪造,依赖注入等一起使用) )。