Как сделать методы модульного тестирования короче

#c# #unit-testing #nunit

Вопрос:

У меня есть несколько модульных тестов. Подобный этому:

 [TestFixture]
public class Tests
{
    [SetUp]
    public void Setup()
    {
    }
}
    
 

Но похоже, что это почти тот же код. Можно ли написать это короче?

Я использую платформу тестирования NUnit.

И это код:

 public class Parcel
{
    
 //Some code
    
}
 

Теперь это работает

Ответ №1:

Вы можете использовать TestCase вместо атрибута Test для запуска одного и того же тестового кода с разными данными, например

 [TestCase(0.02m, "Name: parcel - Postal code 2582Cd - Weight 0,02 - Value 0,0 - Department Mail")]
[TestCase(2m, "Name: parcel - Postal code 2582Cd - Weight 2 - Value 0,0 - Department Regular")]
public void ParcelsWithSpecificWeightShouldBeSpecificToString(decimal weight, string expected)
{
    var parcel = new Parcel { Name="parcel", PostalCode = "2582Cd", Weight = weigth, Value = 0.0m };
    Assert.AreEqual(expected, parcel.ToString());
}
 

Но на самом деле вы тестируете Department свойство, поэтому я бы рекомендовал не тестировать parcel.ToString() , а parcel.Department :

 [TestCase(0.02m, "Mail")]
[TestCase(2m, "Regular")]
public void ParcelsWithSpecificWeightShouldBeSpecificDepartment(decimal weight, string expected)
{
    var parcel = new Parcel { Name="parcel", PostalCode = "2582Cd", Weight = weigth, Value = 0.0m };
    Assert.AreEqual(expected, parcel.Department);
}
 

Комментарии:

1. Да, но также и ценность. И в одном тестовом примере это смешанная версия: так что вес и ценность.

Ответ №2:

Если вы пытаетесь уменьшить количество строк в своих методах тестирования, вы можете выполнить инициализацию посылки в Setup() как parcel1, parcel2….parcelN.

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