Можно ли параметризовать тест на единицу - PullRequest
28 голосов
/ 27 января 2011

Я хотел бы написать вызываемую функцию, которая принимает два объекта и сравнивает 30+ свойств этих объектов с утверждениями.Проблема заключается в том, что это нужно сделать для примерно 20 существующих модульных тестов и большинства будущих тестов, и выписывание 30+ утверждений каждый раз занимает много времени и пространства.

В настоящее время у меня есть функция не модульного тестирования, котораясравнивает объекты и возвращает строку с «pass» или сообщением об ошибке и использует assert для проверки этого в каждом модульном тесте.Однако, это довольно грязно, и я чувствую, что иду против правильных методов модульного тестирования.

Есть ли способ создать функцию, которая вызывается из внутренних модульных тестов, использующих утверждения для проверки условий?

Ответы [ 6 ]

43 голосов
/ 27 января 2011

Если вы используете NUnit 2.5.5 или выше, это возможно с помощью атрибута TestCase.

Обычные модульные тесты будут украшены [Test], но мы можем заменить это следующим образом:

[TestCase("0", 1)]
[TestCase("1", 1)]
[TestCase("2", 1)]
public void UnitTestName(string input, int expected)
{
    //Arrange

    //Act

    //Assert
}

Этот тип вещей будет способом сделать это - очевидно, принимать разные параметры.

Посмотрите на это за помощью: http://nunit.org/?p=testCase&r=2.5

29 голосов
/ 27 января 2011

Чтобы ответить на заключительную часть, вы, конечно, можете иметь Утверждения внутри другой функции.Утверждает работу, вызывая исключения, которые запускает тестирующий, и интерпретирует их как сбой, поэтому тест вроде как будет работать нормально:

public void CheckAsserts(string value)
{
    Assert.IsNotNull(value);
}

[TestCase("yes!")]
public void MyTest(string value)
{
    CheckAsserts(value);
}
3 голосов
/ 27 января 2011

Да, модульные тесты такие же, как и любой другой код.

В частности, проверьте NUnit.TestCaseAttribute.

1 голос
/ 27 января 2011

Вы можете использовать атрибут TestCase:

[TestCase("hostname1parameter")]
[TestCase("hostname2parameter")]
public void Example_TestHostName(string hostname)
{
    ...
}
0 голосов
/ 02 ноября 2013

Вы также можете воспользоваться интроспекцией C #. Это позволяет получить имена полей без указания их в коде. Затем вы можете вызвать их по имени.

System.Attribute [] attrs = System.Attribute.GetCustomAttributes (t);

Это позволяет вам писать определенные виды тестов, которые будут применяться к классам, которые вы еще даже не написали.

0 голосов
/ 27 января 2011

Вам понадобится атрибут TestCase:

[TestCase("string1",...)
public void test_UnitTest(string Parameter)
{
    ...
    Assert.AreEqual(Parameter, result)
}

Обратите внимание, что это работает только с примитивными типами данных, такими как строки и целые числа - вы не можете создать экземпляр своего собственного класса и использовать его в качестве параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...