Как выполнить RowTest с MSTest?

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

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

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


person dr. evil    schedule 07.12.2008    source источник
comment
code.google.com/p/datest/wiki/DaTest   -  person Todd Menier    schedule 09.04.2010
comment
К сожалению, DaTest работает только с VS2008.   -  person    schedule 27.05.2011
comment
Возможный дубликат Как запустить тестовый метод с несколько параметров в MSTest?   -  person Rob    schedule 03.05.2016
comment
Сегодня вы можете использовать атрибут атрибут DataRow   -  person Jacco Dieleman    schedule 12.04.2019


Ответы (6)


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

Я везде искал элегантное решение и в итоге написал его сам. Мы используем его в более чем 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 итерации, как в обычном источнике данных :)

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);
        }
    }
}
person Thwaitesy    schedule 23.10.2013
comment
Большое спасибо, @Thwaitesy! Вы сэкономили мне много времени. - person tsul; 20.09.2017

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

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

person allen    schedule 14.12.2012
comment
почему он ограничен приложениями из магазина Windows? Будет ли он в ближайшее время доступен для обычных тестовых проектов? - person DevDave; 27.03.2013
comment
В xUnit это было так давно. Это такой распространенный сценарий, почему это должно быть включено только для приложений Магазина Windows? Это не имеет никакого смысла. - person CodeMonkeyKing; 15.08.2013
comment
@DevDave, хотя я не знаю о планах vnext, для устаревших проектов mstest доступен адаптер, обеспечивающий аналогичную функциональность. Подробности см. В этом блоге: blogs.msdn.com/b/vstsqualitytools/archive/2009/09/04/ - person allen; 19.08.2013
comment
@CodeMonkeyKing по разным причинам команда не смогла сделать эту функциональность доступной для всех тестовых проектов. Все, что я могу сказать, это то, что я согласен, как конечный пользователь, это не очень хорошо. - person allen; 19.08.2013
comment
@allen понял. Работа внутри компании, создающей MSTest, открывает больше возможностей, чем снаружи. Интересно, что я бы рекомендовал использовать xUnit.net вместо MSTest. - person CodeMonkeyKing; 20.08.2013
comment
Теперь он доступен для всех платформ, а не только для приложений Магазина Windows. - person Franklin Yu; 08.12.2017
comment
Я отредактировал ответ на указание, что в более поздних версиях ограничение было ослаблено. Я не знаю, какая версия добавила поддержку для каких целей, поэтому, если кто-то еще знает, помогите улучшить этот ответ. - person chwarr; 01.02.2019

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

person Gary.Ray    schedule 10.01.2015

Подобно DaTest (не обновляется с 2008 года) решение с использованием PostSharp описано в блоге http://blog.drorhelper.com/2011/09/enables-parameterized-tests-in-mstest.html

person Michael Freidgeim    schedule 06.10.2012

Я решил эту проблему, сгенерировав код тестового класса с разным количеством сгенерированных тестовых методов. Вам просто нужно загрузить 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

person Dmytro Zharii    schedule 04.09.2013

person    schedule
comment
Это метод, который я использовал, и он также позволяет вам дать каждой строке отдельное и, надеюсь, описательное имя. - person Mel; 14.09.2011