Есть ли у MSTest эквивалент TestCase от NUnit?

Я нахожуTestCase Функция в NUnit довольно полезна как быстрый способ задания параметров теста без необходимости отдельного метода для каждого теста. Есть ли что-нибудь подобное в MSTest?

<code> [TestFixture]  
 public class StringFormatUtilsTest  
 {  
     [TestCase("tttt", "")]  
     [TestCase("", "")]  
     [TestCase("t3a4b5", "345")]  
     [TestCase("3&amp;amp;5*", "35")]  
     [TestCase("123", "123")]  
     public void StripNonNumeric(string before, string expected)  
     {  
         string actual = FormatUtils.StripNonNumeric(before);  
         Assert.AreEqual(expected, actual);  
     }  
 }  
</code>
 Babak02 мар. 2018 г., 14:09
ПытатьсяDataRow(), видеть:blogs.msdn.microsoft.com/devops/2016/06/17/...
 Mike de Klerk01 сент. 2015 г., 14:39
Почему вы не используете NUnit?
 Stacked20 янв. 2018 г., 12:48
Вообще говоря, NUnit имеет больше возможностей, чем MSTest, если вы используете MSTest просто для того, чтобы иметь возможность запускать свои тесты с помощью VS Test Explorer, то вы можете сделать то же самое с NUnit, установив расширение NUnit Test Adapter через NuGet.
 Michael Freidgeim06 окт. 2012 г., 03:48
 Robert Harvey♦30 сент. 2015 г., 17:47
@MikedeKlerk: Nunit работает невероятно медленно, если вы используете Entity Framework ... Он, очевидно, отражается на всех ваших сгенерированных классах каждый раз, когда вы запускаете тест.

Ответы на вопрос(5)

который позволит вам использовать его для таблицы базы данных, 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-файла.

Я искал повсюду элегантное решение и в итоге сам написал. Мы используем его в более чем 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);
        }
    }
}
 Lonefish11 авг. 2016 г., 09:17
Будет ли это работать с несколькими параметрами для каждого случая?
 chiccodoro07 мая 2014 г., 13:17
Это довольно опрятно.
 Marc L.22 февр. 2017 г., 19:24
Поскольку в базовой библиотеке произошли изменения, это не работает сMsTest "v2", Это значение по умолчанию для VS15 (VS 2017).
 Thwaitesy23 февр. 2017 г., 22:49
Да, если вы используете MSTest V2, есть новый поставщик тестовых случаев, который похож на NUnit. Таким образом, нет необходимости для этой работы
 Reed09 нояб. 2017 г., 22:37
Это не работает в VS 2015, файл конфигурации приложения не заполняется динамически, поэтому источники данных не найдены.

и, очевидно, этот подход начал работать в VS2015 Express для настольных компьютеров. Я пытался оставить комментарий, но отсутствие репутации не позволило мне сделать это.

Позвольте мне скопировать решение здесь:

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

Чтобы использовать его, просто установите пакеты NuGetMSTest.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 из ссылок проекта.

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

что это еще один поздний ответ, но в моей команде, использующей инфраструктуру 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.

 Trey Mack20 июл. 2018 г., 13:22
Достаточно хорошо. +1
 BartoszKP14 авг. 2016 г., 01:03
Это создает контрольные примеры, которые могут влиять друг на друга.
 Gary.Ray15 авг. 2016 г., 17:17
@BartoszKP Только если у тестируемой системы есть побочные эффекты, в этом случае это, вероятно, не оптимальный метод.
 ytoledano16 апр. 2016 г., 16:33
Самая большая проблема в этом состоит в том, что если какой-либо случай выходит из строя из массива значений - весь тест завершается неудачей и больше тестов не проверяется.
 BartoszKP15 авг. 2016 г., 22:20
@ Gary.Ray Также, когда система не имеет побочных эффектоввсе же, Также, когда тест не проходит, и другой разработчик пытается это исправить, и тратит часы, пытаясь выяснить, имеет ли значение зависимость или нет. Это просто то, чего не стоит делать, точка.

и вы просто используете его для возможности запуска тестов через Test Explorerпотому что у вас есть только выпуск Visual Studio Express, тогда это может быть решением для вас:

Там есть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

Обновить:

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

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

Опять же, тестовый тест Visual Studio Express, к сожалению, не распознает эти тесты. Но, по крайней мере, «полные» версии VS теперь поддерживают эту функцию!

Чтобы использовать его, просто установите пакеты NuGetMSTest.TestFramework а такжеMSTest.TestAdapter (оба предварительных релиза на данный момент).

 Marc L.22 февр. 2017 г., 19:48
MSTest "v2" теперь является платформой по умолчанию при использовании VS 2017. Теперь, когда это будет поддерживаться OOTB в последней версии, эта информация, вероятно, должна идти к началу ответа.

Ваш ответ на вопрос