Подтвердить что ты не робот

Больше ошибок в модульных тестах, чем в производственном коде

Я только что начал новый проект, и теперь, когда ASP.NET MVC разрабатывается чрезвычайно сложным образом, я решил, что настало время начать с модульного тестирования. Большая часть моего кода свежая, и я пишу тесты, прежде чем писать фактический производственный код.

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

Мой типичный рабочий процесс заканчивается примерно следующим образом:

  • Записать заглушку
  • Записать тест
  • Убедитесь, что тест не выполнен.
  • Заполните заглушку
  • Тест все еще не работает, поэтому потратьте время на ожидаемый и фактический вывод.
  • Ошибка оказывается в тесте, а не в самом коде. Исправьте тест.

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

Конечно, есть моменты, когда мой производственный код является фактической причиной неудачного теста, но он просто очень редко встречается.

Нет никаких оснований полностью исключать единичные тесты; бывают случаи, когда я просто не доверяю своему коду вообще. С другой стороны, я начинаю чувствовать, что это не все, что ценно, особенно в первую очередь в области тестирования.

Кто-нибудь еще чувствует это?

4b9b3361

Ответ 1

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

  • Если вы еще этого не сделали, попробуйте разбить модульные тесты на одно утверждение за каждый тест. Возможно, вам придется сделать много утверждений на единицу кода, что ваше тестирование, если методы массивные (это может означать, что ваши методы также должны быть разбиты). Но это уменьшит ваши модульные тесты и сделает их менее подвержен длительному обслуживанию. Theres хороший образец для реализации на практике Arrange, Ass Assert (AAA)
  • Убедитесь, что ваши модульные тесты полностью изолированы, то есть нет взаимодействий или вызовов вне вашего кода, то есть баз данных, веб-служб и т.д.
  • Используйте доступные фреймворки, чтобы упростить тестирование вашего подразделения и выполнить большую часть работы для вас, например Nbuilder, чтобы взломать списки объектов и Moq для измельчения объектов, необходимых для тестирования.
  • Если вы этого еще не сделали, используйте test fixtures, поэтому вам не нужно устанавливать все для каждого теста.

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

В блоге Richard Dingwall содержится немало статей о лучших методах модульного тестирования и TDD, многие из которых касаются модульного тестирования с MVC.

Ответ 2

Во-первых, TDD требует времени для адаптации.

Мы, как команда, начали с TDD год назад. Сначала мы начали с первого написания кода (класс/один модуль), а затем для написания тестов, охватывающих этот код.

Затем мы перешли к написанию тестов параллельно с кодом (напишите метод/группу методов, а затем запишите тестовые примеры, покрывающие эти методы). В течение этого периода мы использовали инструменты покрытия для проверки нашего охвата.

Теперь, после этого в течение года, команда хорошо разбирается в тестовом подходе. @Scozzard упомянул о действительных моментах использования AAA/mocking frameworks.

Ответ 3

Если ваши тесты сравнивают фактические результаты с письменными ожидаемыми значениями (которые иногда вводятся неправильно), вы можете получить немного пробега только путем рефакторинга ваших тестов. Вместо проверки того, что метод X возвращает экземпляр, идентичный экземпляру теста, убедитесь, что экземпляр, возвращаемый методом, имеет то же важное свойство, что и тестовый экземпляр.