Есть ли у MSTest эквивалент TestCase от NUnit? - PullRequest
97 голосов
/ 18 июня 2009

Я считаю, что функция 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);  
     }  
 }  

Ответы [ 5 ]

44 голосов
/ 25 февраля 2016

Microsoft недавно анонсировала "MSTest V2" (см. блог-статья ). Это позволяет вам последовательно (рабочий стол, UWP, ...) использовать DataRow -атрибут!

 [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 Edition , то это может быть решение для вас:

Существует расширение *1023* VsTestAdapter VSIX для возможности запуска тестов NUnit через Test Explorer. К сожалению, пользователи VS Express не могут установить расширения ... Но, к счастью, VsTestAdapter поставляется с простым NuGet-пакетом тоже!

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


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

Обратите внимание, что он не работает с VS Express

34 голосов
/ 23 октября 2013

Я знаю, что это поздний ответ, но, надеюсь, он поможет другим.

Я искал повсюду элегантное решение и в итоге написал его сам. Мы используем его в более чем 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 итерации, как в обычном источнике данных:)

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);
        }
    }
}
13 голосов
/ 11 января 2015

Я знаю, что это еще один поздний ответ, но в моей команде, которая привязана к использованию среды MS Test, мы разработали методику, основанную только на анонимных типах для хранения массива тестовых данных и 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); 
        }); 
    }
}

При использовании этого метода полезно использовать форматированное сообщение, включающее входные данные в Assert, чтобы помочь вам определить, какая строка приводит к сбою теста.

Я написал блог об этом решении с более подробной информацией и подробностями на AgileCoder.net .

6 голосов
/ 20 ноября 2017

Khlr дал хорошие подробные объяснения, и, очевидно, этот подход начал работать в VS2015 Express for 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, Версия = 10.0.0.0 и 'Microsoft.VisualStudio.TestPlatform.TestFramework, версия = 14.0.0.0

Итак, удалите Microsoft.VisualStudio.QualityTools.UnitTestFramework из ссылок проекта.

Вы можете редактировать исходный ответ и удалить его.

0 голосов
/ 08 марта 2016

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-файла.

...