Можно ли параметризовать тест nunit
Я хотел бы написать вызываемую функцию, которая принимает два объекта и сравнивает 30+ свойств этих объектов с утверждениями. Проблема заключается в том, что это нужно сделать примерно для 20 существующих модульных тестов и большинства будущих тестов, и каждый раз из 30 советов каждый раз время и пространство потребляют.
В настоящее время у меня есть функция не unit test, которая сравнивает объекты и возвращает строку с сообщением "pass" или сообщение об ошибке, и используйте assert для подтверждения этого в каждом unit test. Однако, это довольно грязно, и я чувствую, что я иду против правильных методов тестирования единицы.
Есть ли способ сделать функцию, вызываемую из внутренних модульных тестов, которая использует утверждения для проверки условий?
Ответы
Ответ 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);
Это позволяет вам писать определенные виды тестов, которые будут применяться к классам, которые еще не были написаны.