Первый тест TDD без утверждений / ожидаемых исключений. Стоит ли оно того? - PullRequest
12 голосов
/ 01 августа 2010

Допустим, я начинаю делать игру с TDD.Это хороший первый тест?

[TestMethod]
public void Can_Start_And_End_Game()
{
    Tetris tetris = new Tetris();
    tetris.Start();
    tetris.End();
}

Это в основном вынуждает меня определить 3 вещи: класс Tetris и его методы Start() и End(), но, кроме того, он довольно бесполезен.Возможно, это сразу же заинтересует, так как с их помощью я могу определить этот класс и эти методы, но позже это, вероятно, не будет служить какой-либо цели.Его единственная цель - показать, что должна быть возможность начать игру и завершить ее, не получая исключения в середине.

Что вы думаете об этом?

Ответы [ 6 ]

19 голосов
/ 01 августа 2010

Это в основном заставляет меня определять 3 вещи: класс Tetris и его методы Start () и End (),

True.

но, кроме того, это довольно бесполезно.

Ложные.

позже это, вероятно, не будет служить какой-либо цели

Ложь, тоже.

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

И это ОГРОМНО. Эпическая. Монументальная.

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

Это испытание EPIC.

7 голосов
/ 01 августа 2010

Вы действительно не ведете разработку класса Tetris с помощью этого теста - вы решили, каким должен быть его API, что хорошо, но почему бы не написать тест, который проверяет что-то, что он должен делать на самом деле?

Тесты должны информировать API, а не наоборот (imho).

3 голосов
/ 01 августа 2010

Я не большой поклонник этого теста.Да, он помог определить интерфейс, но он не очень силен для определения (и тестирования) поведения.

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

В идеале каждый метод тестирования должен выполнять одно поведение.

1 голос
/ 03 августа 2010

Как сказал С. Лотт, этот тест охватывает тонну земли. Это настолько «стоит» того, что стоит разбить на хотя бы 3 теста и добавить соответствующие утверждения к каждому:

[TestMethod]
public void Test_Contructor()
{
    Tetris tetris = new Tetris();
    // make assertions
}

[TestMethod]
public void Test_Start()
{
    // setup
    Tetris tetris = new Tetris();

    // exercise
    tetris.Start();

    // make assertions
}

[TestMethod]
public void Test_End()
{
    // setup
    Tetris tetris = new Tetris();
    tetris.Start();

    // exercise
    tetris.End();

    // make assertions
}
1 голос
/ 01 августа 2010

Да, тест подтверждает, что в конструкторе, методе Start() и Stop() не возникает исключений.

Я вижу небольшое значение в дополнительном блоке try / catch в тесте дляловить исключения.Инструмент, выполняющий тест, поймает и сообщит о них.Используя принцип TSTTCPW, тест можно обойтись без блока try / catch.

Вы можете сделать тест немного более осмысленным, добавив утверждения в конце, например, подтвердив значение свойств объекта tetris.

Обратите внимание на разницу между написанием модульного теста и использованием TDD.Ценность исходит из понимания этой разницы.

1 голос
/ 01 августа 2010

Я думаю, что цель теста можно прояснить, перехватывая любые исключения и явно проваливая тест, если он будет успешным:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...