J’essaie de faire des tests unitaires avec Excel comme source de données. Je reçois l’exception suivante. Comment pouvons-nous corriger cela?
L’adaptateur de test unitaire n’a pas réussi à se connecter à la source de données ni à lire les données. Pour plus d’informations sur le dépannage de cette erreur, voir “Dépannage des tests d’unité pilotée par 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(expectedResult, actualResult, "The addition result is incorrect."); }
Lectures:
Unit Testing Error – L’adaptateur de test d’unité n’a pas réussi à se connecter à la source de données ni à lire les données.
Problème de tests unitaires pilotés par les données
Comment créer un script de démarrage et de nettoyage pour le projet de test Visual Studio?
Comment l’équipe MSTEST / Visual Studio 2008 teste-t-elle l’ordre d’exécution des méthodes de test?
Visual Studio 2010 Ultimate – Plan de génération de données définissant un type de données incorrect pour la colonne
Comment devrais-je tester par unité une classe CRUD simple?
Résolu moi-même d’une manière différente. Les autres réponses sont les bienvenues.
Voir: Procédure pas à pas: 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(expectedResult, actualResult, "The addition result is incorrect."); }
App.Config
Pour VS 2010, la version de TestTools utilisée est Version = 10.0.0.0.
J’ai effacé une même tâche aujourd’hui. Et après quelques maux de tête, j’ai pu résoudre 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 testproject, vous devez définir la propriété Copier dans le répertoire de sortie du fichier sur Copy always
ou Copy if newer
. Et ajoutez l’atsortingbut 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 }
Bien que cela ne soit pas à 100% lié à la question et peut-être un peu sortingvial, j’aimerais append mes deux sous sur ce sujet général (c’était la question la plus pertinente que j’ai pu trouver à poster).
Dans le projet sur lequel je travaille actuellement, je me suis rendu compte de la nécessité de réaliser des tests unitaires simples basés sur des données (par exemple, avec peut-être 20 lignes environ pour un test donné). Ma liste de souhaits pour un “framework” basé sur les données était:
Malgré le souhait n ° 4, j’ai examiné des bibliothèques externes telles que xUnit et NUnit. Ils semblaient résoudre le souhait n ° 3, mais n’avaient pas fait du bon travail en ce qui concerne les souhaits n ° 1 et n ° 2.
Frustré par le manque de solution simple, j’ai décidé de mettre en place moi-même un assistant extrêmement basique basé sur les données:
public static void DataDrivenTest(Action> testAction, List> 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> { // Rows of arguments a,b,c respectively new List
Bien que cela réponde à tous mes souhaits, il présente des inconvénients:
Quoi qu’il en soit, cela a résolu mon problème de base de manière simple. J’espère que cela aidera quelqu’un à la recherche d’une solution simple comme moi. Après tout, si vous constatez que vous avez besoin d’une tonne de lignes de test pour tester une méthode, il peut être utile d’envisager un refactor pour décomposer la fonction testée en composants plus petits (pour l’utiliser ensuite avec des simulacres / faux, une dependency injection, etc.). ).