2010-08-28 4 views
15

Очевидно, I don't understand unit testing. Это прекрасно, учитывая, что я никогда раньше этого не делал. Я начинаю новый проект и хочу с самого начала испечь модульное тестирование, поэтому я хочу учиться.Что должно и не должно быть охвачено модульными испытаниями?

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

Так,

  • Какие виды функций выгоды от модульного тестирования?
  • Какие функции не должны тестироваться на модуле?

ответ

1

Согласно TDD (Test Driven Development) методологии следует проверить каждую общественную функцию, и каждый путь выполнения в этой функции.

+0

, но такие вещи, как контроллеры и маршрутизаторы (т. Е. Передние контроллеры), являются общедоступными, и я не вижу, как модульные тесты могут их покрывать. Это проблема, о которой я задал в вопросе, который я связал, и смысл в этом вопросе. Должно ли это быть изменено на что-то вроде «каждой публичной функции, которая возвращает значение», или есть способ сделать модульное тестирование обложкой этих экземпляров? – AgentConundrum

+0

Контроллеры и маршрутизаторы также должны быть протестированы. Это не теория, это делается на практике ежедневно. Некоторые структуры, т. Е. Rails, упрощают работу, чем другие. Примеры тестов для контроллеров: http://guides.rubyonrails.org/testing.html#functional-tests-for-your-controllers Примеры тестов для маршрутов: http://guides.rubyonrails.org/testing.html#testing- Маршруты – qertoip

0

Единичное тестирование - это инструмент, и есть много подходов к его использованию. Вот мой подход:

Я пишу свои модульные тесты против подписей служб и DAO и не столько против DTO, либо типов сущностей. Большинство типов значений будут косвенно проверены. методы equals и hashCode в DTO и типы сущностей должны быть проверены.

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

+0

Извините, я немного потерял ваши термины («Подписи DAO», «DTOs»). Не могли бы вы это немного разъяснить? – AgentConundrum

+0

* DAO = http://en.wikipedia.org/wiki/Data_access_object (услуги для абстракции настойчивости) * DTO = http://en.wikipedia.org/wiki/Data_transfer_object (объекты ценности) –

2

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

  1. Вы уже на в первую очередь, за рулем разработки тестов. Тесты на установку модульной установки в существующие приложения сложны и редко обеспечивают реальную выгоду (вместо этого они часто дают ложное представление о покрытии кода). Правильный TDD всегда является предусмотрительным, никогда не запоздалым.
  2. Я бы не стал тестировать частные функции. Различные инструменты покрытия кода могут сказать, что он оставлен непроверенным, но если он личный, то его функциональность должна быть проверена путем тестирования общедоступных методов. Частные методы являются внутренними, а не частью API, ничто за пределами класса (даже тесты) не должно знать или заботиться о них, так как они могут легко измениться, если реализация этого класса будет изменена.
  3. Фокус на открытый API вашего кода. Напишите тесты против ваших интерфейсов, а не против ваших классов. Сами классы впоследствии реализованы и протестированы против тестов.
  4. Наконец, и очень важно изучить, что вы делаете и каковы его преимущества. Тестирование блок-единиц не является коричневым и обслуживающим процессом. Один из них не достигает хорошего тестового покрытия, просто называя тесты, но понимая TDD и как его реализовать. Это займет практику. Одно из предложений, которое я хотел бы дать, - это сделать правильный проект TDD, а также попытаться выполнить ретро-тестирование в существующий проект. Мы можем сказать друг другу весь день, что первый лучше, чем последний, но, делая оба, вы можете отличить различия и лучше понять , почему это лучше. Это приведет вас не только к написанию тестов, но и к тому, чтобы быть более опытным специалистом TDD и тем, что он действительно приносит в таблицу. Любой может писать тесты, но слишком часто они просто теряют время, если они действительно не понимают, что происходит.
+0

@David: Вы снова ! Я могу сказать, что я многому научу от вас. Две вещи: 1) Я уже понимаю # 1/# 4, просто прочитав много об этом и неясный опыт с подобными понятиями - это та же самая причина, почему QA отделы необходимы - разработчик слишком много знает о коде и будет модифицировать тест, чтобы передать код. 2) Возвращаясь к вопросу о mvc, на который вы также ответили, как вы примирите «единичные тесты публичных методов» с такими вещами, как контроллеры и маршрутизаторы/фронт-контроллеры? Эти объекты имеют общедоступные интерфейсы, но я не вижу, как вы можете поместить на них модульное тестирование. – AgentConundrum

+0

@AgentConundrum: Я снова? :) Одним из больших преимуществ контроллеров в MVC над кодом в WebForms является то, что они могут быть легко протестированы. Взгляните сюда: http://www.lostechies.com/blogs/chrismissal/archive/2010/02/05/unit-testing-simple-asp-net-mvc-controllers.aspx и http://msdn.microsoft .com/en-us/magazine/dd942838.aspx и http://www.asp.net/mvc/tutorials/creating-unit-tests-for-asp-net-mvc-applications-vb «Контекст» приложение можно издеваться, поэтому вам просто нужно проверить, что действия возвращают правильные представления. Макеты зависимостей проверяют, что они были правильно вызваны. – David

+0

(Извините, если я предполагаю, что .NET здесь, это просто мой опыт. Концепции могут быть универсально применены, хотя независимо от используемых инструментов.) – David

Смежные вопросы