Использование нескольких фактов или одной теории - PullRequest
0 голосов
/ 29 сентября 2018

Я сейчас пишу несколько юнит-тестов в xUnit.До сих пор я использовал MSTest для UT, поэтому каждый тестовый пример представлял собой отдельный тест в файле.С xUnit я могу использовать параметризованные тесты.Что я не уверен в их использовании, что является более распространенным или я должен использовать больше.

Мой метод, который я тестирую, прост - он принимает десятичное число и преобразует его в строку с определенными атрибутами.У теста всегда один и тот же код, он отличается только входом и выходом.Пример ниже является упрощенной версией, но я думаю, что она все еще выражает точку.

[Fact]
public void valueIsZero()
{
    var formattedValue = Formatter.Format(0m);

    Assert.Equal("0", formattedValue);
}

[Fact]
public void valueIsOne()
{
    var formattedValue = Formatter.Format(1m);

    Assert.Equal("1", formattedValue);
}

Это способ, которым я бы писал тесты в MSTest, но в xUnit я могу написать эти тесты с теорией, подобной этой:

public static IEnumerable<object[]> Data =>
    new List<object[]>
    {
        new object[] { 0m, "0" },
        new object[] { 1m, "1" }
    };

[Theory]
[MemberData(nameof(Data))]
public void multipleValue(decimal value, string expectedResult)
{
    var formattedValue = Formatter.Format(value, true, false, true);

    Assert.Equal(expectedResult, formattedValue);
}

Есть ли какие-либо преимущества или недостатки при первом или втором подходе?Или какой подход более распространен?

1 Ответ

0 голосов
/ 29 сентября 2018

Тестовый код должен рассматриваться как производственный код.Таким образом, общие принципы, такие как SOLID, DRY, ... также применимы.Конструкция Theory в xUnit помогает избежать повторения тестового кода.Это облегчает обслуживание в будущем (только одно место для изменения логики).Подумайте, изменится ли логика вашей программы из-за изменившихся требований.Затем вы настраиваете логику программы и тесты.Менять один Theory -тест нужно меньше, чем несколько Fact -тестов.

Для вашего примера я предлагаю использовать InlineData следующим образом:

[Theory]
[InlineData("0", "0")]
[InlineData("1", "1")]
public void multipleValue(string value, string expectedResult)
{
    var formattedValue = Formatter.Format(Convert.ToDecimal(value), true, false, true);

    Assert.Equal(expectedResult, formattedValue);
}

Это приводит кхорошее отображение в Testrunner VisualStudio, потому что анализатор распознает каждый InlineData как отдельный модульный тест и отображает их как группу.

...