Comment RowTest avec MSTest?

je sais que MSTest ne prend pas en charge RowTest et tests similaires.

Ce n' MSTests utilisateurs? Comment est-il possible de vivre sans RowTest support?

j'ai vu DataDriven de test de fonctionnalités mais les sons comme trop de frais généraux, est-il un 3ème partie de patch ou d'un outil qui me permet de faire RowTest essais similaires dans <!--5?

42
demandé sur AdrianHHH 2008-12-07 15:38:55

6 réponses

[TestMethod]
Test1Row1
{
    Test1(1,4,5);
}

[TestMethod]
Test1Row2
{
    Test1(1,7,8);
}

private Test1(int i, int j, int k)
{
   //all code and assertions in here
}
36
répondu Tormod 2009-07-30 08:48:41

je sais que c'est une réponse tardive mais j'espère que ça aide les autres.

j'ai cherché partout une solution élégante et fini par écrire un 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. N'a jamais manqué un battement.

https://github.com/Thwaitesy/MSTestHacks

1) Installer NuGet package.

2) Hériter votre classe test de TestBase

public class UnitTest1 : TestBase
{ }

3) Créer une Propriété, un Champ ou une Méthode, qui renvoie IEnumerable

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) ajouter l'attribut MSTest DataSource à votre méthode de test, en pointant vers le nom IEnumerable ci-dessus. Ce doit être pleinement qualifié.

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

    Assert.IsNotNull(number);
}

Résultat Final: 3 itérations comme la source de données normale :)

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

namespace Namespace
{
    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 };
            }
        }

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

            Assert.IsNotNull(number);
        }
    }
}
7
répondu Thwaitesy 2013-10-23 08:43:46

nous avons ajouté un support pour DataRow dans VS2012 Update1. Voir ce blog pour obtenir de brèves introduction

modifier: vous voulez souligner que cette fonctionnalité est actuellement limitée aux applications Windows store.

5
répondu allen 2012-12-15 08:50:39

dans mon équipe qui utilise le cadre de test MS, nous avons développé une technique qui s'appuie uniquement sur des Types anonymes pour contenir un tableau de données de test, et LINQ pour boucler et tester chaque ligne. Il ne nécessite pas de classes ou de cadres supplémentaires, et tend à être assez facile à lire et à comprendre. Il est également beaucoup plus facile à mettre en œuvre que les tests basés sur les données en utilisant des fichiers externes ou une base de données connectée.

Par exemple, disons que vous avez une méthode d'extension comme ceci:

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 et le tableau des Types anonymes combinés à LINQ pour écrire des tests comme ceci:

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

en utilisant cette technique, il est utile d'utiliser un message formaté qui inclut les données d'entrée dans L'Assert pour vous aider à identifier quelle ligne provoque l'échec du test.

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

1
répondu Gary.Ray 2015-07-01 03:47:01

similaire à DaTest (non mis à jour depuis 2008) solution utilisant PostSharp est décrite dans le blog http://blog.drorhelper.com/2011/09/enabling-parameterized-tests-in-mstest.html

0
répondu Michael Freidgeim 2012-10-06 01:02:56

j'ai résolu ce problème en générant un code de classe de test avec un nombre différent de méthodes de test générées. Il vous suffit de télécharger 2 fichiers et de les inclure dans votre projet.

Ensuite, sous-classe une classe avec le nombre requis de lignes dans votre code de test et mettre en œuvre 2 méthodes de résumé:

[TestClass]
public class Ha_ha_ha_Test: MsTestRows.Rows.TestRows_42<string>
{
    public override void TestMethod(string dataRow, int rowNumber)
    {
        Console.WriteLine(dataRow);
        Assert.IsFalse(dataRow.Contains("3"));
    }

    public override string GetNextDataRow(int rowNumber)
    {
        return "data" + rowNumber;
    }
}

Plus de détails:

https://github.com/dzhariy/mstest-rows

0
répondu Dmytro Zharii 2013-09-04 23:49:45