VS团队测试:使用Excel作为数据源的.Net单元测试:适配器失败

时间:2012-05-21 11:33:22

标签: c# .net visual-studio-2010 unit-testing

我正在尝试使用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.");

  }

读数:

  1. Unit Testing Error - The unit test adapter failed to connect to the data source or to read the data

  2. Data driven unit tests problem

  3. How to create Startup and Cleanup script for Visual Studio Test Project?

  4. How Does MSTEST/Visual Studio 2008 Team Test Decide Test Method Execution Order?

  5. Visual Studio 2010 Ultimate - Data Generation Plan Setting Incorrect Data Type for Column

  6. How should I unit-test a simple CRUD-class?

3 个答案:

答案 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 alwaysCopy 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;是:

  1. 在Visual Studio测试资源管理器中轻松集成
  2. 能够继续使用我现有的键盘快捷键来运行/调试光标所在的测试方法
  3. 无需管理外部文件或数据库(即没有&#34; DataSources&#34;)
  4. &#34;本机&#34;支持C#和Visual Studio,即不需要额外的包
  5. 尽管希望#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}
                    });
        }
    

    虽然它符合我上面的所有愿望,但它有缺点:

    1. 在测试操作定义中需要进行强制转换(可能使用一些通用参数魔法修复)
    2. 更新数据行中参数的顺序意味着还必须更新操作方法中的访问者
    3. 显然不适合大型数据驱动的测试(例如,这个帮助程序会比20个测试行更加混乱)
    4. 显然缺乏&#34;复杂性&#34;,即我确信像xUnit这样的库有一些时髦的功能
    5. 它将所有行作为一个单元测试运行(即没有单独的单元测试和每个数据行的报告)
    6. 无论如何,它以一种简单的方式解决了我的基本问题。我希望能帮助那些寻找像我一样的简单解决方案的人。毕竟,如果您发现需要一吨测试行来测试方法,那么可能值得考虑一个重构器将测试中的函数分解为更小的组件(然后与模拟/伪造,依赖注入等一起使用) )。