2008-12-07 15 views
41

Wiem, że MSTest nie obsługuje RowTest i podobnych testów.Jak RowTest z MSTest?

Co robią użytkownicy o MSTests? Jak to możliwe, aby żyć bez wsparcia RowTest?

Widziałem, DataDriven funkcji testowych, ale brzmi jak zbyt dużo narzutów, czy istnieje jakakolwiek łata lub narzędzie innej firmy, które pozwalają mi zrobić podobnych testów w MSTest?

+1

Niestety, DaTest wydaje się działać tylko z VS2008. –

+1

http://code.google.com/p/datest/wiki/DaTest –

+0

Możliwy duplikat [Jak uruchomić metodę testową z wieloma parametrami w MSTest?] (Http://stackoverflow.com/questions/9021881/how -to-run-a-test-method-with-multiple-parameters-in-mstest) – Rob

Odpowiedz

35
[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 
} 
+2

Jest to metoda, której użyłem, a także pozwala ci nadać każdemu "wierszowi" oddzielną i miejmy nadzieję opisową nazwę. – Mel

4

Dodaliśmy wsparcie dla DataRow w VS2012 Update1. See this blog for a breif introduction

Edytuj: Chcesz podkreślić, że ta funkcja jest obecnie ograniczona do aplikacji sklepu Windows.

+7

dlaczego jest on ograniczony do aplikacji sklepu Windows? Czy będzie dostępny w regularnych testach w najbliższym czasie? – DevDave

+1

xUnit ma to od tak dawna. Jest to taki typowy scenariusz, dlaczego to powinno być włączone tylko w aplikacjach Windows Store? To nie ma sensu. – CodeMonkeyKing

+0

@DevDave, podczas gdy ja nie wiem o planach vnext jest dostępny adapter dla starszych projektów mstest, który zapewnia podobną funkcjonalność. Zobacz ten blog, aby poznać szczegóły: http://blogs.msdn.com/b/vstsqualitytools/archive/2009/09/04/extending-the-visual-studio-unit-test-type-part-2.aspx – allen

0

Rozwiązałem ten problem, generując kod klasy testowej z różną liczbą wygenerowanych metod testowych. Trzeba tylko pobrać 2 pliki i uwzględnić je w projekcie.
Następnie podklasy klasy z wymaganą liczbę wierszy w kodzie testowym i wdrożyć 2 streszczenie metody:

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

Więcej szczegółów:

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

7

wiem, że to późna odpowiedź ale Mam nadzieję, że pomoże to innym.

Szukałem wszędzie eleganckiego rozwiązania i napisałem je sam. Używamy go w ponad 20 projektach z tysiącami testów jednostkowych i setkami tysięcy iteracji. Nigdy nie opuścił ani razu.

https://github.com/Thwaitesy/MSTestHacks

1) zainstalować pakiet NuGet.

2) sieje swoją klasę testową z TestBase

public class UnitTest1 : TestBase 
{ } 

3) utworzyć właściwość, pole lub metoda, która zwraca 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) Dodaj MSTest DataSource atrybut do metody testowej, wskazując na nazwę IEnumerable powyżej. To musi być w pełni kwalifikowane.

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

    Assert.IsNotNull(number); 
} 

Wynik końcowy: 3 iteracje po prostu jak normalny DataSource :)

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); 
     } 
    } 
} 
+0

Wielkie dzięki, @Thwaitesy! Oszczędziłeś mi dużo czasu. – tsul

1

Na mojej drużynie, która została zablokowana za pomocą ramy MS testu, opracowaliśmy technikę, która opiera się tylko na Anonim Typy do przechowywania tablicy danych testowych i LINQ do przechodzenia i testowania każdego wiersza. Nie wymaga żadnych dodatkowych zajęć ani ram i jest raczej łatwy do odczytania i zrozumienia. Jest także znacznie łatwiejsze do wdrożenia niż testy oparte na danych z wykorzystaniem plików zewnętrznych lub połączonej bazy danych.

Załóżmy, że masz metodę rozszerzenia takiego:

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

można użyć i tablicą typów anonimowych połączonych do LINQ napisać testy tak:

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

Podczas korzystania W tej technice pomocne jest sformatowanie komunikatu zawierającego dane wejściowe w Asercie, aby pomóc w zidentyfikowaniu, który wiersz powoduje niepowodzenie testu.

Blogowałem o tym rozwiązaniu z większą ilością tła i szczegółów pod numerem AgileCoder.net.

Powiązane problemy