Как RowTest с MSTest?

Я знаю, что MSTest не поддерживает RowTest и подобные тесты.

Что делают пользователи MSTests? Как можно жить без поддержки RowTest?

Я видел тестовые функции DataDriven но это звучит как чрезмерная DataDriven, есть ли какой-либо сторонний патч или инструмент, позволяющий мне RowTest подобные тесты RowTest в MSTest?

Ответ 1

[TestMethod]
Test1Row1
{
    Test1(1,4,5);
}

[TestMethod]
Test1Row2
{
    Test1(1,7,8);
}

private Test1(int i, int j, int k)
{
   //all code and assertions in here
}

Ответ 2

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

Я везде искал элегантное решение и в итоге сам написал его. Мы используем его в более чем 20 проектах с тысячами модульных тестов и сотнями тысяч итераций. Никогда не промахнулся.

https://github.com/Thwaitesy/MSTestHacks

1) Установите пакет NuGet.

2) Наследовать свой тестовый класс из TestBase

public class UnitTest1 : TestBase
{ }

3) Создайте свойство, поле или метод, который возвращает IEnumerable

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. Это необходимо для полной квалификации.

[DataSource("Namespace.UnitTest1.Stuff")]
public void TestMethod1()
{
    var number = this.TestContext.GetRuntimeDataSourceObject<int>();

    Assert.IsNotNull(number);
}

Результат завершения: 3 итерации, как и обычный DataSource:)

using Microsoft.VisualStudio.TestTools.UnitTesting;
using MSTestHacks;

namespace Namespace
{
    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 };
            }
        }

        [DataSource("Namespace.UnitTest1.Stuff")]
        public void TestMethod1()
        {
            var number = this.TestContext.GetRuntimeDataSourceObject<int>();

            Assert.IsNotNull(number);
        }
    }
}

Ответ 3

Мы добавили поддержку DataRow в VS2012 Update1. Смотрите этот блог для краткого введения

В VS2012 Update1 эта функция в настоящее время ограничена приложениями магазина Windows. В более поздних версиях это не ограничено.

Ответ 4

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

Я решил эту проблему, создав тестовый код класса с различным количеством сгенерированных тестовых методов. Вам просто нужно загрузить 2 файла и включить их в свой проект.
Затем подкласс класса с требуемым количеством строк в вашем тестовом коде и реализовать 2 абстрактных метода:

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

Подробнее:

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