Вопрос по visual-studio-2010, .net, c#, unit-testing – VS Team Test: модульное тестирование .Net с Excel в качестве источника данных: сбой адаптера

5

Я пытаюсь сделать модульное тестирование с Excel в качестве источника данных. Я получаю следующее исключение. Как мы это исправим?

The unit test adapter failed to connect to the data source or to read the data. For more information on troubleshooting this error, see "Troubleshooting Data-Driven Unit Tests"

  [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, "[email protected]");
     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

Data driven unit tests problem

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

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

Ваш Ответ

3   ответа
3

возможно, несколько тривиально, я хотел бы добавить свои два цента на эту общую тему (это был самый важный вопрос, который я мог найти для публикации).

В проекте, над которым я сейчас работаю, я столкнулся с необходимостью сделать несколько простых модульных тестов, управляемых данными (например, с примерно 20 строками или около того для данного теста). Мой список пожеланий для управляемой данными "инфраструктуры" было:

Nice and easy integration in the Visual Studio Test Explorer Ability to keep using my existing keyboard shortcut keys to run/debug the test method in which the cursor lies No external files or databases to have to manage (i.e. no "DataSources") "Native" support in C# and Visual Studio, i.e. no additional packages necessary

Несмотря на желание № 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}
                });
    }

Хотя он выполняет все мои пожелания выше, у него есть недостатки:

Casting is required inside the test action definition (could probably be fixed with some generic argument magic) Updating the order of the arguments in the data rows means that the accessors in the action method also have to be updated Clearly not appropriate for large data-driven tests (e.g. this helper would be messy for more than, say, 20 test rows) Clearly lacks "sophistication", i.e. I'm sure that libraries like xUnit have some funky features that this doesn't have It runs all rows as one unit test (i.e. no separate unit test and reporting for each data row)

Несмотря на это, это решило мою основную проблему простым способом. Я надеюсь, что это поможет кому-то найти простое решение, как я. В конце концов, если вы обнаружите, что вам нужна тонна тестовых строк для тестирования метода, возможно, стоит подумать о рефакторе, чтобы разбить тестируемую функцию на более мелкие компоненты (а затем использовать вместе с макетами / подделками, внедрением зависимостей и т. Д.). ).

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, "[email protected]");
     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

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

}
Работал на меня, спасибо. Поскольку я использую файлы Excel в качестве ресурса в моем тестовом проекте, мне пришлось установитьCopy to Output Directory свойство файла дляCopy always или жеCopy if newer.

Похожие вопросы