Подтвердить что ты не робот

MSTest Эквивалент для NUnit параметризованных тестов?

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

[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? Я не могу найти аналогичный набор атрибутов.

4b9b3361

Ответ 1

Была ли эта помощь?

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

Ответ 2

Для тех, кто использует 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);
}

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

Ответ 4

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

Ответ 5

Мой ответ аналогичен @oscar-e-fraxedas-tormo one.
Вы можете подклассы из одного из сгенерированных классов, которые содержат от 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

Ответ 6

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

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