Чи має MSTest еквівалент TestUce NUnit?


107

Я вважаю, що ця TestCaseфункція в NUnit є досить корисною як швидкий спосіб визначення параметрів тесту, не потребуючи окремого методу для кожного тесту. Чи є щось подібне в 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);  
     }  
 }  


Чому ви не використовуєте NUnit?
Майк де Клерк

1
@MikedeKlerk: Nunit надзвичайно повільний, якщо ви використовуєте Entity Framework ... Це, мабуть, відображається над усіма створеними класами щоразу, коли ви запускаєте тест.
Роберт Харві

Взагалі кажучи, NUnit має більше функцій, ніж MSTest, якщо ви використовуєте MSTest просто для того, щоб запустити свої тести з VS Test Explorer, то ви можете зробити те ж саме з NUnit, встановивши розширення NUnit Test Adapter через NuGet
Stacked

1
Спробуйте DataRow(), дивіться: blogs.msdn.microsoft.com/devops/2016/06/17/…
Бабак

Відповіді:


62

Microsoft нещодавно оголосила "MSTest V2" (див. Блог-статтю ). Це дозволяє послідовно (настільний ПК, UWP, ...) використовувати DataRow-attribute!

 [TestClass]  
 public class StringFormatUtilsTest  
 {  
     [DataTestMethod]  
     [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);  
     }  
 } 

Знову ж таки, тестовий провідник Visual Studio Express, на жаль, не розпізнає ці тести. Але принаймні "повні" версії VS тепер підтримують цю функцію!

Для його використання просто встановіть пакети NuGet MSTest.TestFramework та MSTest.TestAdapter (обидва попередні випуски).

Старіша відповідь:

Якщо вам не доведеться дотримуватися MSTest, ви просто використовуєте його для запуску тестів через Test Explorer оскільки у вас є лише видання Visual Studio Express, то це може бути рішенням для вас:

Існує розширення VsTestAdapter VSIX для запуску тестів NUnit через Test Explorer. На жаль, користувачі VS Express не можуть встановлювати розширення ... Але, на щастя, VsTestAdapter також постачається з простим NuGet-Package !

Отже, якщо ви користувач VS Express, просто встановіть VsTestAdapter NuGet-Package і насолоджуйтесь запусканням тестів / тестів NUnit через Test Explorer!


На жаль, вищезгадане твердження не відповідає дійсності. Хоча встановити пакет за допомогою видання Express цілком можливо, він марний, оскільки він не може використовувати Test Explorer. Раніше була побічна примітка на старій версії TestAdapter, яку було видалено зі сторінки опису 2.0.0 :

Зауважте, що він не працює з VS Express


4
MSTest "v2" тепер є базовою базою для використання VS 2017. Тепер, коли це буде підтримуватися OOTB в останній версії, ця інформація, ймовірно, повинна йти до верху відповіді.
Марк Л.

34

Я знаю, що це пізня відповідь, але, сподіваємось, це допомагає іншим.

Я всюди шукав елегантне рішення і закінчив писати одне. Ми використовуємо його в більш ніж 20 проектах з тисячами одиничних тестів і сотнями тисяч ітерацій. Ніколи не пропускав жодного удару.

https://github.com/Thwaitesy/MSTestHacks

1) Встановіть пакет NuGet .

2) Успадкуйте свій тестовий клас від TestBase

public class UnitTest1 : TestBase
{ }

3) Створіть властивість, поле чи метод, який повертає 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) Додайте атрибут MSTest DataSource до свого тестового методу, вказуючи назад на ім'я IEnumerable вище. Для цього потрібно пройти повну кваліфікацію.

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

    Assert.IsNotNull(number);
}

Кінцевий результат: 3 ітерації, як і звичайний DataSource :)

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

Це також буде працювати з декількома параметрами для кожного випадку?
одинокий

Оскільки в базовій бібліотеці відбулася зміна, це не працює з MsTest "v2" . Це за замовчуванням для VS15 (VS 2017).
Марк Л.

3
Так, якщо ви використовуєте MSTest V2, є новий постачальник тестових випадків, подібний до NUnit. Тому немає необхідності в цій роботі навколо around
Thwaitesy

Схоже, це не працює у VS 2015, файл конфігурації додатків динамічно не заповнюється, і тому джерела даних не знайдені
Reed

13

Я знаю, що це ще одна пізня відповідь, але в моїй команді, яка замикається на використанні MS Test Framework, ми розробили техніку, яка покладається лише на анонімні типи, щоб утримувати масив тестових даних, а LINQ проходити цикл і перевіряти кожен рядок. Він не вимагає додаткових класів чи рамок, і, як правило, досить легко читати та розуміти. Це також набагато простіше здійснити, ніж керовані даними тести, використовуючи зовнішні файли або підключену базу даних.

Наприклад, скажіть, у вас є такий метод розширення:

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

Ви можете використовувати та масив анонімних типів, об’єднаних у LINQ, щоб написати такі тести:

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

Під час використання цієї методики корисно використовувати відформатоване повідомлення, яке включає вхідні дані у звіті, щоб допомогти вам визначити, який рядок викликає збій тесту.

Я обговорював це рішення з більш детальною інформацією та деталізацією на AgileCoder.net .


4
Найбільша проблема з цим полягає в тому, що якщо будь-який випадок не виходить з масиву значень - весь тест не вдається, і більше випадків не перевіряється.
ytoledano

Це створює тестові випадки, які можуть впливати один на одного.
BartoszKP

@BartoszKP Тільки якщо система, що перевіряється, має побічні ефекти, і в цьому випадку це, мабуть, не оптимальна методика.
Gary.Ray

@ Gary.Ray Крім того, коли система не має побічних ефектів , тим НЕ менш . Крім того, коли тест не проходить і інший розробник намагається це виправити, і витрачає години, намагаючись з’ясувати, має значення залежність чи ні. Це просто те, чого ти ніколи не повинен робити, період.
BartoszKP

Досить добре. +1
Трей Мак

7

Хлр дав хороші детальні пояснення, і, очевидно, цей підхід почав працювати в VS2015 Express для Desktop. Я намагався залишити коментар, але моя відсутність репутації не дозволила мені це зробити.

Дозвольте скопіювати рішення тут:

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

Для його використання просто встановіть пакети NuGet MSTest.TestFramework та MSTest.TestAdapter .

Одна проблема

Помилка CS0433 Тип "TestClassAttribute" існує в обох "Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version = 10.0.0.0 та" Microsoft.VisualStudio.TestPlatform.TestFramework, Version = 14.0.0.0

Отже, видаліть Microsoft.VisualStudio.QualityTools.UnitTestFramework із посилань на проект.

Ви дуже раді відредагувати оригінальну відповідь та видалити цю.


0

У MSTest є атрибут DataSource, який дозволить вам подавати в нього таблицю баз даних, csv, xml тощо. Я використовував його, і він добре працює. Я не знаю, як правильно поставити дані вище як атрибути, як у вашому запитанні, але дуже просто налаштувати зовнішні джерела даних і файли можуть бути включені до проекту. У мене він працював годину з моменту початку, і я не є експертом з автоматизованих тестів.

https://msdn.microsoft.com/en-us/library/ms182527.aspx?f=255&MSPPError=-2147217396 має повний підручник на основі введення в базу даних.

http://www.rhyous.com/2015/05/11/row-tests-or-paramerterized-tests-mstest-xml/ має підручник на основі введення XML-файлів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.