web-dev-qa-db-fra.com

Est-ce que MSTest a un équivalent au TestCase de NUnit?

Je trouve la fonctionnalité TestCase de NUnit très utile comme moyen rapide de spécifier des paramètres de test sans avoir besoin d’une méthode distincte pour chaque test. Y at-il quelque chose de similaire dans MSTest?

 [TestFixture]  
 public class StringFormatUtilsTest  
 {  
     [TestCase("tttt", "")]  
     [TestCase("", "")]  
     [TestCase("t3a4b5", "345")]  
     [TestCase("3&5*", "35")]  
     [TestCase("123", "123")]  
     public void StripNonNumeric(string before, string expected)  
     {  
         string actual = FormatUtils.StripNonNumeric(before);  
         Assert.AreEqual(expected, actual);  
     }  
 }  
88
tjjjohnson

Si vous ne devez pas rester avec MSTest et que vous l'utilisez simplement pour pouvoir exécuter les tests via Test Explorer car vous ne disposez que d'une édition Visual Studio Express, alors cela pourrait être une solution pour vous:

Il existe le extension VSIX de VsTestAdapter pour pouvoir exécuter des tests NUnit via Test Explorer. Malheureusement, les utilisateurs de VS Express ne peuvent pas installer d'extensions ... Mais heureusement, le VsTestAdapter est livré avec un paquet NuGet simple , aussi!

Donc, si vous êtes un utilisateur VS Express, installez simplement le VsTestAdapter NuGet-Package et profitez de l'exécution de vos tests/tests NUnit via Test Explorer!


Malheureusement, la déclaration susmentionnée n'est pas vraie. Bien qu'il soit parfaitement possible d'installer le paquet via une édition Express, c'est inutile, car il ne peut pas utiliser Test Explorer. Il y a déjà eu une note sur un ancienne version du TestAdapter, qui a été retiré de la page de description de la version 2.0.0 }:

Notez que cela ne fonctionne pas avec VS Express


Mettre à jour:

Microsoft a récemment annoncé "MSTest V2" (voir article de blog ). Cela vous permet d'utiliser (l'attribut DataRow-!) De manière cohérente (desktop, UWP, ...)!

 [TestClass]  
 public class StringFormatUtilsTest  
 {  
     [TestMethod]  
     [DataRow("tttt", "")]  
     [DataRow("", "")]  
     [DataRow("t3a4b5", "345")]  
     [DataRow("3&5*", "35")]  
     [DataRow("123", "123")]  
     public void StripNonNumeric(string before, string expected)  
     {  
         string actual = FormatUtils.StripNonNumeric(before);  
         Assert.AreEqual(expected, actual);  
     }  
 } 

Encore une fois, l'Explorateur de tests de Visual Studio Express ne reconnaît malheureusement pas ces tests. Mais au moins les versions "complètes" de VS prennent désormais en charge cette fonctionnalité!

Pour l'utiliser, il suffit d'installer les packages NuGet MSTest.TestFramework _ et MSTest.TestAdapter (les deux versions préliminaires sont maintenant disponibles).

36
khlr

Je sais que c'est une réponse tardive, mais j'espère que cela aidera les autres.

J'ai cherché partout une solution élégante et j'ai fini par en écrire une moi-même. Nous l'utilisons dans plus de 20 projets avec des milliers de tests unitaires et des centaines de milliers d'itérations. Jamais manqué un battement.

https://github.com/Thwaitesy/MSTestHacks

1) Installez le paquet NuGet .

2) Hériter de votre classe de test de TestBase

public class UnitTest1 : TestBase
{ }

3) Créer une propriété, un champ ou une méthode qui renvoie IEnumerable

[TestClass]
public class UnitTest1 : TestBase
{
    private IEnumerable<int> Stuff
    {
        get
        {
            //This could do anything, get a dynamic list from anywhere....
            return new List<int> { 1, 2, 3 };
        }
    }
}

4) Ajoutez l'attribut MSTest DataSource à votre méthode de test, en indiquant le nom IEnumerable ci-dessus. Cela doit être pleinement qualifié.

[TestMethod]
[DataSource("Namespace.UnitTest1.Stuff")]
public void TestMethod1()
{
    var number = this.TestContext.GetRuntimeDataSourceObject<int>();

    Assert.IsNotNull(number);
}

Résultat final: 3 itérations similaires à la source de données normale :)

using Microsoft.VisualStudio.TestTools.UnitTesting;
using MSTestHacks;

namespace Namespace
{
    [TestClass]
    public class UnitTest1 : TestBase
    {
        private IEnumerable<int> Stuff
        {
            get
            {
                //This could do anything, get a dynamic list from anywhere....
                return new List<int> { 1, 2, 3 };
            }
        }

        [TestMethod]
        [DataSource("Namespace.UnitTest1.Stuff")]
        public void TestMethod1()
        {
            var number = this.TestContext.GetRuntimeDataSourceObject<int>();

            Assert.IsNotNull(number);
        }
    }
}
33
Thwaitesy

Je sais que c'est une autre réponse tardive, mais dans mon équipe qui est contrainte à utiliser le framework MS Test, nous avons développé une technique qui repose uniquement sur les types anonymes pour contenir un tableau de données de test et sur LINQ pour effectuer une boucle et tester chaque ligne. Il ne nécessite pas de classes ou de cadres supplémentaires et a tendance à être assez facile à lire et à comprendre. Il est également beaucoup plus facile à mettre en œuvre que les tests pilotés par les données utilisant des fichiers externes ou une base de données connectée.

Par exemple, supposons que vous ayez une méthode d'extension comme celle-ci:

public static class Extensions
{
    /// <summary>
    /// Get the Qtr with optional offset to add or subtract quarters
    /// </summary>
    public static int GetQuarterNumber(this DateTime parmDate, int offset = 0)
    {
        return (int)Math.Ceiling(parmDate.AddMonths(offset * 3).Month / 3m);
    }
}

Vous pouvez utiliser un tableau de types anonymes associé à LINQ pour écrire un test comme celui-ci:

[TestMethod]
public void MonthReturnsProperQuarterWithOffset()
{
    // Arrange
    var values = new[] {
        new { inputDate = new DateTime(2013, 1, 1), offset = 1, expectedQuarter = 2},
        new { inputDate = new DateTime(2013, 1, 1), offset = -1, expectedQuarter = 4},
        new { inputDate = new DateTime(2013, 4, 1), offset = 1, expectedQuarter = 3},
        new { inputDate = new DateTime(2013, 4, 1), offset = -1, expectedQuarter = 1},
        new { inputDate = new DateTime(2013, 7, 1), offset = 1, expectedQuarter = 4},
        new { inputDate = new DateTime(2013, 7, 1), offset = -1, expectedQuarter = 2},
        new { inputDate = new DateTime(2013, 10, 1), offset = 1, expectedQuarter = 1},
        new { inputDate = new DateTime(2013, 10, 1), offset = -1, expectedQuarter = 3}
        // Could add as many rows as you want, or extract to a private method that
        // builds the array of data
    }; 
    values.ToList().ForEach(val => 
    { 
        // Act 
        int actualQuarter = val.inputDate.GetQuarterNumber(val.offset); 
        // Assert 
        Assert.AreEqual(val.expectedQuarter, actualQuarter, 
            "Failed for inputDate={0}, offset={1} and expectedQuarter={2}.", val.inputDate, val.offset, val.expectedQuarter); 
        }); 
    }
}

Lorsque vous utilisez cette technique, il est utile d'utiliser un message mis en forme qui inclut les données d'entrée dans Assert pour vous aider à identifier la ligne à l'origine de l'échec du test.

J'ai blogué à propos de cette solution avec plus de fond et de détails sur AgileCoder.net .

13
Gary.Ray

Khlr a donné de bonnes explications détaillées et, apparemment, cette approche a commencé à fonctionner dans VS2015 Express for Desktop ... J'ai essayé de laisser le commentaire, mais mon manque de réputation ne m'a pas permis de le faire.

Laissez-moi copier la solution ici:

[TestClass]  
 public class StringFormatUtilsTest  
 {  
     [TestMethod]  
     [DataRow("tttt", "")]  
     [DataRow("", "")]  
     [DataRow("t3a4b5", "345")]  
     [DataRow("3&amp;amp;5*", "35")]  
     [DataRow("123", "123")]  
     public void StripNonNumeric(string before, string expected)  
     {  
         string actual = FormatUtils.StripNonNumeric(before);  
         Assert.AreEqual(expected, actual);  
     }  
 } 

Pour l'utiliser, il suffit d'installer les packages NuGet MSTest.TestFramework et MSTest.TestAdapter .

Un problème est 

Erreur CS0433 Le type 'TestClassAttribute' existe dans les deux 'Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version = 10.0.0.0 et 'Microsoft.VisualStudio.TestPlatform.TestFramework, Version = 14.0.0.0

Supprimez donc Microsoft.VisualStudio.QualityTools.UnitTestFramework des références du projet.

Vous pouvez très bien modifier la réponse originale et la supprimer.

5
Art

MSTest a l'attribut DataSource, ce qui vous permettra de lui alimenter une table de base de données, csv, xml, etc. Je l'ai utilisé et cela fonctionne bien. Je ne connais pas de moyen de placer les données juste au-dessus d'attributs comme dans votre question, mais il est très facile de configurer les sources de données externes et les fichiers peuvent être inclus dans le projet. Je l'ai fait fonctionner une heure après le début et je ne suis pas un expert en tests automatisés.

https://msdn.Microsoft.com/en-us/library/ms182527.aspx?f=255&MSPPError=-2147217396 propose un didacticiel complet basé sur les entrées de la base de données.

http://www.rhyous.com/2015/05/11/row-tests-or-paramerterized-tests-mstest-xml/ propose un didacticiel basé sur la saisie d'un fichier XML.

0
CindyH