Подтвердить что ты не робот

Можно ли параметризовать тест nunit

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

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

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

4b9b3361

Ответ 1

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

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

[TestCase("yes!")]
public void MyTest(string value)
{
    CheckAsserts(value);
}

Ответ 2

Если вы используете 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

Ответ 3

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

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

Ответ 4

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

[TestCase("hostname1parameter")]
[TestCase("hostname2parameter")]
public void Example_TestHostName(string hostname)
{
    ...
}

Ответ 5

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

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

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

Ответ 6

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

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

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