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

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? Не могу найти подобного набора атрибутов.


person blaster    schedule 02.03.2010    source источник
comment
возможный дубликат Как выполнить RowTest с MSTest?   -  person Gishu    schedule 22.06.2010
comment
Ха - похоже, ты тоже Ошерова читаешь :)   -  person Adam Rackis    schedule 07.01.2011
comment
Для всех, кто пришел сюда из Google (10 лет спустя ...), пропустите принятый ответ и сразу перейдите к: stackoverflow.com/a/ 48347447/398630   -  person BrainSlugs83    schedule 26.02.2021


Ответы (6)


Будет ли это помочь?

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

person Jorge Ferreira    schedule 02.03.2010
comment
В MSTest эта функция реализована на самом деле. Ответ Родригеса актуален. - person sotn; 07.12.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);
}

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

person Israel Rodriguez    schedule 19.01.2018
comment
Это актуальный и наиболее подходящий ответ на этот вопрос. - person sotn; 07.12.2018
comment
@sotn - да? - Хотелось бы, чтобы мы могли проголосовать за отмену принятого ответа (особенно на такие давно мертвые вопросы, как этот). - Просто чтобы исправить некоторую устаревшую информацию ... - person BrainSlugs83; 26.02.2021

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

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

person Aseem Bansal    schedule 21.02.2012

Мой ответ аналогичен ответу @ 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

person Dmytro Zharii    schedule 05.09.2013

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

person smwikipedia    schedule 13.12.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; } }
}
person Oscar Fraxedas    schedule 25.02.2013