2010-03-29 9 views
20

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

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

+0

Действительно ли это TDD или просто модульное тестирование? – quamrana

ответ

23

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

Требования пользователя -> Function Design -> Unit Tests -> Код

Помнит, тесты прийти до Кодекса в TDD.

+0

И хорошая иллюстрация здесь: http://blog.typemock.com/2008/12/starting-test-driven-development-using.html – karlipoppins

+0

-1: Если вы выполняете строгую тестовую разработку, код создается в цикле * Тест * (в единственном числе) -> Код -> Рефактор -> Другой * Тест *, не все тесты перед кодом. – quamrana

0

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

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

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

1

Модульные тесты должны дать вам уверенность в том, что код, который вы пишете, делает то, что вы хотите. Поэтому вы должны написать столько тестов, сколько необходимо, чтобы дать вам эту уверенность.

0

Модульные тесты будут:

  • даст вам уверенность, чтобы сделать изменения рефакторинга, зная, что вы ничего не нарушая.
  • действуют как своего рода «живая документация» вашего кода, позволяя другим точно знать, как код будет вести себя в различных обстоятельствах.
  • при строгом TDD, как описано в @Justin, передав все модульные тесты, написанные до того, как вы начали писать код, сообщим вам, когда вы «закончили» кодирование. По моему опыту это также приводит к значительно упрощенному и понятному (более понятному) коду.

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

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

5

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

Если вы считаете, что это слишком много, спросите себя: «Если я не тестирую этот код, как я знаю, что он работает?»

+0

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

+0

@ darron, поэтому вы основываете тесты на функциональном дизайне. Тесты говорят вам, что он соответствует требованиям. –

+0

@Jack: успешный тест говорит вам, что код выполняет то, что ожидает тест, и не гарантирует, что фактические требования будут выполнены. Одна из самых распространенных проблем, с которыми я сталкиваюсь при проверке ошибок в нашем программном обеспечении, заключается в том, что разработчик неправильно понял требования, написал неправильные тесты, затем неверный код и, следовательно, создавал впечатление, что все в порядке, поскольку тесты не терпят неудачу. – jarnbjo

0

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

1

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

Прочтите блог Miško Hevery, прочитайте несколько книг (мне понравился Test Driven от Lasse Koskela), используйте некоторые инструменты для покрытия кода, такие как Clover, а затем напишите несколько тестов.

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

2

Мой ведущий наставник/развитие просит меня написать новый блок испытательный корпус для нового письменного контроля потока

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

Рекомендую прочитать статью The Art of Agile Development: Test-Driven Development. Вы можете использовать TDD, используя this tutorial.

Я думаю, что ваш наставник, используя фразу «всякий раз, когда это имеет смысл», может нанести вред, особенно людям, новым для TDD, потому что невозможно принять правильное решение об этом до тех пор, пока у вас не будет многолетнего опыта, после достижения Ri-level. Однажды, когда Kent Beck decided to not write a test, он был надлежащим образом прокомментирован Рон Джеффрис: «Я доверяю вам, и примерно трем другим людям, чтобы сделать короткие короткие игровые решения».

Вы всегда должны сначала написать тест. Все, что может сломаться, требует теста. Только те вещи, которые никогда не могут сломаться, из-за того, что кто-то меняет код, не нуждаются в тестах. Например, декларативный код редко ломается: статический HTML-макет кода на веб-странице, как правило, не стоит тестировать автоматически (вы должны проверить его вручную, чтобы убедиться, что он выглядит правильно), но что-то динамическое стоит проверить.

0

Вы должны всегда писать тест, если ваш существующий testuite недостаточен. Лучший признак того, что ваших тестов недостаточно, - это ошибки. Поэтому хорошей практикой является написать единичный тест для каждой ошибки, с которой вы сталкиваетесь. С тестовым развитием вы должны начать с некоторого теста, определите функциональность класса. инструменты тестирования-покрытия дают вам некоторые подсказки, которые могут потребовать дополнительных частей.

0

Право/тщательный ответ на этот вопрос должен быть длинным, поскольку это является ключевым вопросом для каждого процесса тестирования, но я отвечу со следующими простыми правилами (?):

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

  2. Если вы хотите знать, более чем на 5 секунд, если что-то важно достаточно, чтобы проверить или нет, то примем, что это :-)

  3. Если случайно тестируется этот случай очень сложно/дорого жалуются это вашему менеджеру/техническому руководству и пропустить запись теста.

0

Personaly Я использую модульные тесты, когда у меня есть большие массивы данных, и я не хочу, чтобы скопировать/вставить много System.out.println, и проверить их один на один. С модульными тестами вы теряете 1 час, чтобы записать их, и сэкономить много из них. Для тривиальных вещей я предпочитаю использовать println tecnic или проверять переменные отладки.

1

Я тоже стал недавним конвертером в TDD, и я нахожу его чрезвычайно полезным. Идея такова, что, как только у вас есть спецификация, вы начинаете писать модульные тесты. После того, как ваши тесты были написаны, большая часть вашего кода может исходить из этих тестов. То, что остается в ваших тестах, является основой ваших утверждений, и тогда у вас есть очень хороший повторяемый шаблон для теста на запись, реализация кода, подтверждение через утверждения, продолжение. Хорошая вещь!

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