de-vraag
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 bitbonk
bitbonk
Вопрос

Могут ли быть усовершенствованы эти модульные тесты стиля серии, чтобы следовать хорошей практике проектирования TDD?

Можно ли улучшить следующий подход, чтобы следовать хорошим методам проектирования TDD (именованию, использованию тестов строк, разработке классов) в любой платформе .NET TDD/BDD?

Кроме того, есть ли лучший способ в любой из фреймворков иметь rowtests, где у меня может быть индивидуальное ожидание для каждой строки, как я это делаю в этом примере (NUnit)?

Здесь тестируется система Constraint , которая может иметь несколько диапазонов допустимых целых чисел. Тест тестирует метод NarrowDown , который может сделать допустимые диапазоны меньше на основе другого ограничения.

[TestFixture]
internal class ConstraintTests
{
    [Test]
    public void NarrowDown_Works()
    {
        RowTest_NarrowDown(
            new Range[] { new Range(0, 10), new Range(20, 30), new Range(40, 50) },
            new Range[] { new Range(1, 9), new Range(21, 29), new Range(41, 49) },
            new Range[] { new Range(1, 9), new Range(21, 29), new Range(41, 49) });

        RowTest_NarrowDown(
            new Range[] { new Range(0, 10), new Range(20, 30), new Range(40, 50), new Range(60, 70) },
            new Range[] { new Range(1, 9), new Range(21, 29), new Range(41, 49) },
            new Range[] { new Range(1, 9), new Range(21, 29), new Range(41, 49) });

        RowTest_NarrowDown(
            new Range[] { new Range(0, 10), new Range(20, 30), new Range(40, 50) },
            new Range[] { new Range(1, 9), new Range(21, 29), new Range(41, 49), new Range(60, 70) });
    }

    private static void RowTest_NarrowDown(IEnumerable sut, IEnumerable context)
    {
        Constraint constraint = new Constraint(sut);
        Constraint result = constraint.NarrowDown(new Constraint(context));
        Assert.That(result, Is.Null);
    }

    private static void RowTest_NarrowDown(IEnumerable sut, IEnumerable context, IEnumerable expected)
    {
        Constraint constraint = new Constraint(sut);
        Constraint result = constraint.NarrowDown(new Constraint(context));
        Assert.That(result, Is.Not.Null);
        Assert.That(result.Bounds, Is.EquivalentTo(expected));
    }
}
1 2011-10-27T20:06:53+00:00 2
Anthony Mastrean
Anthony Mastrean
Редактировал вопрос 16-го ноября 2011 в 6:06
Программирование
bdd
tdd
nunit
xunit
mspec
Garrett Hall
27-го октября 2011 в 8:53
2011-10-27T20:53:55+00:00
Дополнительно
Источник
Редактировать
#56792241

Во-первых, вы можете улучшить имя вашего модульного теста NarrowDown_Works , очень неопределенно, и я не могу сказать, что должен делать этот класс.

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

Ваше построение тестовых данных довольно сложно, подумайте об использовании сокетов , например NHamcrest для уменьшения объема данных утверждения, которые вам нужны, вместо использования Is.EquivalentTo .

Вы могли бы также использовать конструктор-конструктор или фабричные конструкторы для упростить инициализацию для класса Constraint , а не передавать в массиве Ranges .

2
0
Thomas Weller
30-го октября 2011 в 5:54
2011-10-30T17:54:02+00:00
Дополнительно
Источник
Редактировать
#56792242

Вы должны использовать подход, основанный на данных, с фабриками данных (в NUnit-talk, они называются тестовыми источниками ). Это делает ваши тесты намного легче читать, понимать, модифицировать и поддерживать (или, в более общем плане, намного чище):

[TestFixture]
internal class ConstraintTests
{
    static object[] TwoRanges = 
    {
        new object[]
            {
                new[] { new Range(0, 10), new Range(20, 30), new Range(40, 50) },
                new[] { new Range(1, 9), new Range(21, 29), new Range(41, 49), new Range(60, 70) }
            }
    };

    static object[] ThreeRanges = 
    {
        new object[]
            {
                new[] { new Range(0, 10), new Range(20, 30), new Range(40, 50) },
                new[] { new Range(1, 9), new Range(21, 29), new Range(41, 49) },
                new[] { new Range(1, 9), new Range(21, 29), new Range(41, 49) }
            },
        new object[]
            {
                new[] { new Range(0, 10), new Range(20, 30), new Range(40, 50), new Range(60, 70) },
                new[] { new Range(1, 9), new Range(21, 29), new Range(41, 49) },
                new[] { new Range(1, 9), new Range(21, 29), new Range(41, 49) }
            }
    };

    [Test, TestCaseSource("TwoRanges")]
    public void NarrowDown_WhenCalledWithTwoRanges_GivesTheExpectedResult(IEnumerable sut, IEnumerable context)
    {
        Constraint constraint = new Constraint(sut);
        Constraint result = constraint.NarrowDown(new Constraint(context));
        Assert.That(result, Is.Null);
    }

    [Test, TestCaseSource("ThreeRanges")]
    public void NarrowDown_WhenCalledWithThreeRanges_GivesTheExpectedResult(IEnumerable sut, IEnumerable context, IEnumerable expected)
    {
        Constraint constraint = new Constraint(sut);
        Constraint result = constraint.NarrowDown(new Constraint(context));
        Assert.That(result, Is.Not.Null);
        Assert.That(result.Bounds, Is.EquivalentTo(expected));
    }
}

Посмотрите, насколько проще теперь ваши методы тестирования? Кроме того, это приведет к тому, что каждый набор данных из исходного источника тестового случая будет запущен в отдельном тесте, поэтому все это не будет терпеть неудачу только потому, что один набор данных вызывает сбой. Помните: тест должен содержать только один .

НТН!

0
0
Похожие сообщества 1
TDD/BDD (unit, boundary, test-first, refactoring)
TDD/BDD (unit, boundary, test-first, refactoring)
134 пользователей
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Roxana Elizabeth CASTILLO Avalos
Зарегистрирован 1 день назад
2
Hideo Nakagawa
Зарегистрирован 2 дня назад
3
Sergiy Tytarenko
Зарегистрирован 4 дня назад
4
shoxrux azadov
Зарегистрирован 6 дней назад
5
Koreets Koreytsev
Зарегистрирован 1 неделю назад
© de-vraag 2022
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией