Модульное тестирование Visual Studio C# — запускать модульный тест с различными/множественными инициализациями тестов, запускать один и тот же модульный тест несколько раз?

Что я хочу сделать, так это:

  1. Создайте кучу модульных тестов.
  2. Создавайте различные перестановки/комбинации инициализации макетов, входных переменных и т. д.
  3. Запустите каждый заданный модульный тест с набором таких инициализаций на основе некоторых параметров.

Как я могу сделать что-то подобное?

Есть ли уже какая-либо структура для обработки этого (т.е. запускать данный тест несколько раз при изменении инициализации)? Можете ли вы предложить какой-либо дизайн или идеи, с помощью которых я мог бы что-то сделать, чтобы сделать это?

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

Ниже показан пример того, что мне нужно.

[Test Initialize]
Setup( <-possible parameter-> )

[Test Method]
TestA()

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

Дополнительные пояснения

Предположим, для теста потребуются переменные A, B, C. Каждая из них является очень сложным объектом, в результате чего может быть сформировано большое количество комбинаций. Поэтому я надеюсь, что каким-то образом я мог бы создать тестовую инициализацию, которая могла бы перебирать список таких комбинаций, чтобы она инициализировала их, запускала TESTA, возвращалась к следующей инициализации в списке, снова запускала TESTA и так далее, пока список заканчивается. Затем он выбирает другой список для TESTB и снова повторяет этот процесс.

По крайней мере, я надеюсь на какую-то способность запускать данную функцию TEST n раз. Остальное, я знаю, я могу построить, как только это станет возможным.


person Brijesh Bharadwaj    schedule 21.11.2012    source источник
comment
Доступно множество фреймворков... пожалуйста, поищите, прежде чем задавать вопрос   -  person emartel    schedule 21.11.2012
comment
Вы понимаете, о чем я спрашиваю? Я знаю, что существует множество фреймворков, я использую два или три из них, мне нужно, чтобы заданный модульный тест многократно запускался, пока функция инициализации меняется.   -  person Brijesh Bharadwaj    schedule 21.11.2012


Ответы (2)


В nUnit вы можете использовать атрибут [TestCase] ​​для простых типов:

[Test]
[TestCase("a", "b")]
[TestCase("c", "b")]
[TestCase("a", "d")]
public void TestMethod(string param1, string param2){
   // run your test with those parameters
}

Или вы можете использовать метод TestCaseSource для сложных типов:

[Test]
[TestCaseSource("GetTestCases")]
public void TestMethod(MyObject1 param1, MyObject2 param2){
   // run your test with those parameters
}

private IEnumerable GetTestCases(){
   yield return new TestCaseData( new MyObject1("first test args"), 
                                  new MyObject2("first test args"))
                        .SetName("SomeMeaningfulNameForThisTestCase" );
   yield return new TestCaseData( new MyObject1("2nd test args"), 
                                  new MyObject2("2nd test args"))
                        .SetName("SomeMeaningfulNameForThisTestCase2" );

}

Вы можете сделать что-то подобное в MS-Test, используя DataSource: http://codeclimber.net.nz/archive/2008/01/18/How-to-simulate-RowTest-with-MS-Test.aspx

person Mike Parkhill    schedule 21.11.2012
comment
Теперь это выглядит очень многообещающе, я попробую :) - person Brijesh Bharadwaj; 22.11.2012

Возможно, вы сможете сделать это без каких-либо надстроек, специфичных для фреймворка, создав абстрактный базовый класс, содержащий все ваши тестовые функции, а затем унаследовав этот базовый класс с несколькими классами, каждый со своей собственной функцией настройки.

public abstract class MyTests
{
    [Test]
    public void TestOne()
    {
        ...
    }

    [Test]
    public void TestTwo()
    {
        ...
    }
}
[TestFixture]
public class FirstSetup : MyTests
{
    [Setup]
    public void Setup()
    {
        ...
    }
}

[TestFixture]
public class SecondSetup : MyTests
{
    [Setup]
    public void Setup()
    {
        ...
    }
}

Я делал это на других языках, но не уверен, как с этим справятся различные фреймворки C#.

person Mark Hildreth    schedule 21.11.2012
comment
Хм, количество комбинаций в тестовой инициализации помешало бы мне использовать этот подход, они могут буквально быть экспоненциальными, или я надеюсь, что они будут выбирать из списка возможных инициализаций. Я - person Brijesh Bharadwaj; 21.11.2012
comment
С другой стороны, мне пришлось провести одни и те же тесты для 3 разных настроек (3 разных сериализатора), и это было именно то, что мне было нужно. Спасибо! - person Fabian Nicollier; 12.12.2014