Лучший способ разделить мои тесты xUnit для тестирования метода расширения - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь правильно структурировать свои юнит-тесты, и я не уверен, что лучше всего разделить мои тестыЯ использую C # и xUnit.

Для целей этого вопроса я тестирую этот простой код метода расширения:

public static bool IsNullOrEmpty(this string str)
{
    return string.IsNullOrEmpty(str);
}

У меня есть несколько вариантов тестирования, и я не знаю, что правильно.Я мог бы написать Факт или Теорию.

Теория Должен ли я использовать Теорию?Один тест для положительного и один для отрицательного?

[Theory, IsUnit]
[InlineData(null)]
[InlineData("")]
public void Test_IsNullOrEmpty_Positive(string value)
{
     Assert.True(value.IsNullOrEmpty());
}

[Theory, IsUnit]
[InlineData("TEST")]
[InlineData(" ")]    
public void Test_IsNullOrEmpty_Negative(string value)
{ 
     Assert.False(value.IsNullOrEmpty());
}

Факт Должен ли я использовать Факт?Положительное и отрицательное в одном:

[Fact, IsUnit]
public void Test_IsNullOrEmpty()
{
    // Positive testing.
    string myString = null;
    Assert.True(myString.IsNullOrEmpty());

    myString = "";
    Assert.True(myString.IsNullOrEmpty());

    // Negative testing.
    myString = " ";
    Assert.False(myString.IsNullOrEmpty());

    myString = "TEST";
    Assert.False(myString.IsNullOrEmpty());
}

ИЛИ если я проведу отдельные тесты:

[Fact, IsUnit]
public void Test_IsNullOrEmpty_Null()
{
    string myString = null;
    Assert.True(myString.IsNullOrEmpty());
}

[Fact, IsUnit]
public void Test_IsNullOrEmpty_Empty()
{
    var myString = "";
    Assert.True(myString.IsNullOrEmpty());
}

[Fact, IsUnit]
public void Test_IsNullOrEmpty_Space()
{
    var myString = " ";
    Assert.False(myString.IsNullOrEmpty());
}

[Fact, IsUnit]
public void Test_IsNullOrEmpty_Word()
{
    var myString = "TEST";
    Assert.False(myString.IsNullOrEmpty());
}

Я не настолько опытен в написании тестов и хочу следовать передовым методам, поэтому я хочу толькочтобы узнать, что из вышеперечисленного является наилучшей практикой в ​​контексте C # и xUnit (надеюсь, здесь есть правила, и этот вопрос не основан на мнениях: -)).

Заранее спасибо за любые указатели !!

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

На самом деле, это зависит от того, что именно вы тестируете.Если это метод расширения, как вы описали, использование одного теста для всех утверждений, я думаю, должно быть достаточно.Модульные тесты должны быть быстрыми и удобочитаемыми, особенно для общих служебных вещей, таких как расширения.Если вам нужны тесты бизнес-логики, средства авторизации и проверки сервисов с неправильными входными данными или некоторыми исключениями - отрицательные тесты должны быть похожи на отдельные для каждого сценария.ИМХО:)

[Fact]
public void StringExtension_IsNullOrEmpty_CommonBehaviour()
{
    Assert.True(((string)null).IsNullOrEmpty());
    Assert.True(string.Empty.IsNullOrEmpty());
    Assert.True("   ".IsNullOrEmpty());
    Assert.False("MyTestString".IsNullOrEmpty());
}

Кстати, я бы не стал писать тесты для такого рода расширений в проекте решения.Создайте отдельный проект со всеми вашими сервисными функциями (с тестовым покрытием), создайте общий закрытый пакет и включите этот проект в свое бизнес-решение.Тогда вы можете положиться на это как на стороннюю библиотеку.

0 голосов
/ 17 октября 2018

Я думаю, что одиночный тест более полезен, потому что с усложнением устранение неполадок становится проще, если в каждом тесте есть свой собственный тест.Кроме того, когда вы разрабатываете в команде, легче понять тест, если он разбит на отдельные сценарии.

...