Come testare con MSTest?

So che MSTest non supporta RowTest e test simili.

Cosa fanno MSTests utenti di MSTests ? Com’è ansible vivere senza il supporto di RowTest ?

Ho visto le DataDriven test DataDriven ma suona come un sovraccarico, c’è qualche patch o strumento di terze parti che mi consente di eseguire test simili su RowTest in MSTest ?

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

So che questa è una risposta tardiva, ma spero che aiuti gli altri.

Ho cercato ovunque una soluzione elegante e ho finito per scriverne uno io stesso. Lo usiamo in oltre 20 progetti con migliaia di test unitari e centinaia di migliaia di iterazioni. Non ho mai perso un colpo.

https://github.com/Thwaitesy/MSTestHacks

1) Installa il pacchetto NuGet .

2) Eredita la tua class di test da TestBase

 public class UnitTest1 : TestBase { } 

3) Creare una proprietà, campo o metodo, che restituisce IEnumerable

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

4) Aggiungere l’attributo MSTest DataSource al metodo di test, puntando nuovamente al nome IEnumerable sopra. Questo deve essere pienamente qualificato.

 [DataSource("Namespace.UnitTest1.Stuff")] public void TestMethod1() { var number = this.TestContext.GetRuntimeDataSourceObject(); Assert.IsNotNull(number); } 

Risultato finale: 3 iterazioni come la normale DataSource 🙂

 using Microsoft.VisualStudio.TestTools.UnitTesting; using MSTestHacks; namespace Namespace { public class UnitTest1 : TestBase { private IEnumerable Stuff { get { //This could do anything, get a dynamic list from anywhere.... return new List { 1, 2, 3 }; } } [DataSource("Namespace.UnitTest1.Stuff")] public void TestMethod1() { var number = this.TestContext.GetRuntimeDataSourceObject(); Assert.IsNotNull(number); } } } 

Abbiamo aggiunto il supporto per DataRow in VS2012 Update1. Vedi questo blog per un’introduzione breif

Modifica: desidera evidenziare che questa funzione è attualmente limitata alle app dello store di Windows.

Sul mio team che è bloccato nell’uso del framework MS Test, abbiamo sviluppato una tecnica che si basa solo su tipi anonimi per contenere una serie di dati di test, e LINQ per scorrere e testare ogni riga. Non richiede classi o framework aggiuntivi e tende ad essere abbastanza facile da leggere e capire. È anche molto più facile da implementare rispetto ai test basati sui dati che utilizzano file esterni o un database collegato.

Ad esempio, supponi di avere un metodo di estensione come questo:

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

È ansible utilizzare e array di tipi anonimi combinati con LINQ per scrivere test come questo:

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

Quando si utilizza questa tecnica, è utile utilizzare un messaggio formattato che includa i dati di input nell’Assert per consentire all’utente di identificare quale riga provoca il fallimento del test.

Ho bloggato su questa soluzione con più background e dettagli su AgileCoder.net .

Simile a DaTest (non aggiornato dal 2008) la soluzione che utilizza PostSharp è descritta nel blog http://blog.drorhelper.com/2011/09/enabling-parameterized-tests-in-mstest.html

Ho risolto questo problema generando codice di class di test con un numero diverso di metodi di test generati. Devi solo scaricare 2 file e includerli nel tuo progetto.
Quindi sottoclassi una class con il numero richiesto di righe nel codice di prova e implementa 2 metodi astratti:

 [TestClass] public class Ha_ha_ha_Test: MsTestRows.Rows.TestRows_42 { 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; } } 

Più dettagli:

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