5 votes

VS Team Test : Test unitaire .Net avec Excel comme source de données : Échec de l'adaptateur

J'essaie de faire des tests unitaires avec Excel comme source de données. J'obtiens l'exception suivante. Comment la corriger ?

L'adaptateur de test unitaire n'a pas réussi à se connecter à la source de données ou à lire les données. données. Pour plus d'informations sur le dépannage de cette erreur, voir "Dépannage des tests unitaires basés sur les données".


  [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.");

  }

Lectures :

  1. Unit Testing Error - L'adaptateur de test unitaire n'a pas réussi à se connecter à la source de données ou à lire les données.

  2. Problème des tests unitaires basés sur les données

  3. Comment créer un script de démarrage et de nettoyage pour un projet de test Visual Studio ?

  4. Comment MSTEST/Visual Studio 2008 Team Test décide-t-il de l'ordre d'exécution des méthodes de test ?

  5. Visual Studio 2010 Ultimate - Plan de génération de données définissant un type de données incorrect pour une colonne

  6. Comment tester unitairement une simple classe CRUD ?

5voto

Lebedev Alexei Points 121

J'ai fait une même tâche aujourd'hui. Et après quelques maux de tête, j'ai réussi à résoudre le problème sans 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

}

Si vous utilisez des fichiers Excel comme ressources dans votre projet de test, vous devez définir la propriété Copier dans le répertoire de sortie du fichier comme suit Copy always o Copy if newer . Et ajoutez le DeploymentItem à votre test :

[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

}

4voto

Lijo Points 4002

Je l'ai résolu moi-même d'une manière différente. D'autres réponses sont les bienvenues.

Référez-vous : Walkthrough : Utilisation d'un fichier de configuration pour définir une source de données 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>

Pour VS 2010, la version de TestTools utilisée est Version=10.0.0.0

3voto

sammy34 Points 707

Bien que ce ne soit pas entièrement lié à la question et que ce soit peut-être un peu trivial, j'aimerais apporter mon grain de sel à ce sujet général (c'était la question la plus pertinente que j'ai pu trouver pour y poster).

Dans le cadre du projet sur lequel je travaille actuellement, j'ai ressenti le besoin de réaliser des tests unitaires simples basés sur des données (par exemple, avec une vingtaine de lignes pour un test donné). Ma liste de souhaits pour un "framework" orienté données était la suivante :

  1. Intégration facile et agréable dans l'explorateur de tests de Visual Studio.
  2. Possibilité de continuer à utiliser les raccourcis clavier existants pour exécuter/déboguer la méthode de test dans laquelle se trouve le curseur.
  3. Pas de fichiers ou de bases de données externes à gérer (c'est-à-dire pas de "DataSources").
  4. Support "natif" dans C# et Visual Studio, c'est-à-dire qu'aucun paquetage supplémentaire n'est nécessaire.

Malgré le souhait n°4, je me suis penché sur les bibliothèques externes comme xUnit et NUnit. Elles semblaient résoudre le souhait n°3, mais ne faisaient pas un bon travail pour les souhaits n°1 et n°2.

Frustré par l'absence d'une solution simple, j'ai décidé de mettre en œuvre moi-même une aide très basique basée sur les données :

    public static void DataDrivenTest(Action<List<object>> testAction, List<List<object>> dataRows)
    {
        foreach (var dataRow in dataRows)
            testAction(dataRow);
    }

Je l'utilise comme ça :

    [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}
                });
    }

Bien qu'il réponde à tous mes souhaits ci-dessus, il présente des inconvénients :

  1. Le moulage est nécessaire dans la définition de l'action de test (cela pourrait probablement être corrigé avec une magie d'argument générique).
  2. La mise à jour de l'ordre des arguments dans les lignes de données signifie que les accesseurs de la méthode d'action doivent également être mis à jour.
  3. Il est clair que cette aide n'est pas appropriée pour les grands tests basés sur des données (par exemple, cette aide serait désordonnée pour plus de, disons, 20 lignes de test).
  4. Il manque clairement de "sophistication", c'est-à-dire que je suis sûr que des bibliothèques comme xUnit ont des fonctionnalités bizarres qu'il ne possède pas.
  5. Il exécute toutes les lignes comme un seul test unitaire (c'est-à-dire qu'il n'y a pas de test unitaire et de rapport séparés pour chaque ligne de données).

Quoi qu'il en soit, il a résolu mon problème de base de manière simple. J'espère que cela aidera quelqu'un qui cherche une solution simple comme moi. Après tout, si vous trouvez que vous avez besoin d'une tonne de lignes de test pour tester une méthode, cela peut valoir la peine d'envisager une refactorisation pour décomposer la fonction testée en composants plus petits (et ensuite l'utiliser en conjonction avec les mocks/fakes, l'injection de dépendance, etc).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X