MSTest эквивалент для параметризованных тестов NUnit? - PullRequest
39 голосов
/ 03 марта 2010

NUnit поддерживает функцию, где вы можете указать набор входных данных для модульного теста, который будет запускаться несколько раз.

[RowTest]
[Row(1001,1,2,3)]
[Row(1,1001,2,3)]
[Row(1,2,1001,3)]
public void SumTests(int x, int y, int z, int expected)
{
   ...
}

Каков наилучший способ выполнить то же самое с помощью MSTest? Я не могу найти подобный набор атрибутов.

Ответы [ 6 ]

19 голосов
/ 19 января 2018

Для тех, кто использует MSTest2, DataRow + DataTestMethod может сделать именно это:

[DataRow(Enum.Item1, "Name1", 123)]
[DataRow(Enum.Item2, "Name2", 123)]
[DataRow(Enum.Item3, "Name3", 456)]
[DataTestMethod]
public void FooTest(EnumType item, string name, string number)
{
    var response = ExecuteYourCode(item, name, number);

    Assert.AreEqual(item, response.item);
}

Подробнее об этом здесь

19 голосов
/ 03 марта 2010

Поможет ли ?

На этой неделе я добавил несколько юнит-тестов в проект, который управляется TFS, поэтому я решил использовать «основной» блок рамки тестирования доступны с VS2008, и, к сожалению, это не так поддержка RowTests. Но у него есть похожий функция под названием Data-Driven Unit Test. При таком подходе это немного больше усложнить реализацию «простого» Сценарий RowTest, но он также позволяет реализовать более сложные.

9 голосов
/ 21 февраля 2012

Вы можете получить эту возможность, написав небольшое расширение mstest, как показано здесь.

http://blogs.msdn.com/b/vstsqualitytools/archive/2009/09/04/extending-the-visual-studio-unit-test-type-part-2.aspx

1 голос
/ 13 декабря 2013

На самом деле, параметризованный модульный тест (PUT) является естественным обобщением модульного теста. А в Microsoft Research есть проект под названием Pex, который автоматически генерирует PUT для вашего тестируемого класса (CUT). Pex - это инструмент для автоматического ввода тестовых данных . Вместо того, чтобы самостоятельно готовить тестовые данные, инструмент Pex найдет интересующие входные данные для параметров CUT и сгенерирует соответствующие тестовые примеры. Пожалуйста, отметьте здесь .

0 голосов
/ 05 сентября 2013

Мой ответ похож на @ oscar-e-fraxedas-tormo.
Вы можете создать подкласс из одного из сгенерированных классов, которые имеют от 1 до 100 методов тестирования внутри и предоставить всю логику тестирования в производном классе. В приведенном ниже примере:

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

Класс Ha_ha_ha_Test будет содержать 42 сгенерированных строк (методов). Для каждой из этой строки будет вызван пользовательский метод GetNextDataRow для предоставления необходимых тестовых данных.

Подробнее:

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

0 голосов
/ 26 февраля 2013

Вы можете создать базовый класс с методом теста и параметрами в качестве виртуальных свойств. Когда вы наследуете от этого класса, вам нужно только переопределить свойства желаемыми значениями. Пожалуйста, смотрите образец кода:

public class Operation
{
    public static int Add(int x, int y)
    {
        return x + y;
    }
}

[TestClass]
public class AddTests : WorkItemTest
{
    protected virtual int First{get { return 0; }}
    protected virtual int Second{get { return 0; }}

    [TestInitialize]
    public virtual void Init()
    {
        //Init code
    }

    [TestCleanup]
    public virtual void Clean()
    {
        //Clean code
    }

    [TestMethod]
    [Description("x+y = y+x")]
    public virtual void Test_operation_commutativity()
    {
        Assert.AreEqual(Operation.Add(Second, First), Operation.Add(First, Second));
    }
}

[TestClass]
public class AddPositiveTest : AddTests
{
    protected override int First { get { return 1; } }
    protected override int Second { get { return 2; } }
}

[TestClass]
public class AddNegativeTest : AddTests
{
    protected override int First { get { return -1; } }
    protected override int Second { get { return -2; } }
}
...