2009-09-02 2 views
40

Я прочитал много сообщений, которые убедили меня, что я должен начать писать единичный тест, и я начал использовать инъекцию зависимостей (Unity) ради более легкой насмешки, но я все еще не совсем уверен, на каком этапе я должен начать писать блок тестирует и издевается, и как и где начать.Как начать модульное тестирование или TDD?

Будет ли предпочтительный способ писать модульные тесты перед методами, описанными в методологии TDD?

Есть ли какая-либо другая методология или способ для модульного тестирования?

+2

Попробуйте прочитать эту статью: http://blog.codeville.net/2009/08/24/writing-great-unit-tests-best-and-worst-practises/ – Kane

+1

Если вы на C#, то потратите деньги и получите копию Resharper. Он меняет весь опыт. –

ответ

31

Тест первого/тест после:

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

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

I.e. если вы пишете плохой тест раньше, вы можете получить зеленый свет, когда вы ожидаете красного (так что вы знаете, что тест плох). Если после этого вы напишите плохой тест, вы получите зеленый свет, когда вы ожидаете зеленого цвета (не подозревая о плохом тесте).

Книги

Прагматический модульного тестирования книга стоит посмотреть, как Рой Osherove «Искусство модульного тестирования». Прагматическая книга более узко ориентирована на различные типы тестовых входов, которые вы можете попытаться найти ошибки, тогда как TAOUT охватывает более широкое распространение таких тем, как двойные тесты, стратегии, ремонтопригодность и т. Д. Либо книга хороша; это зависит от того, что вы хотите от него.

Также есть link to a talk Roy Osherove did on unit testing. Это стоит посмотреть (так же, как и некоторые из видеозаписей, которые он записал, так как он указывает на различные проблемы и dos/don'ts вместе с причинами).

Как начать

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

Всегда спрашивайте себя: «Что я хочу попробовать и докажу с помощью этого теста?» перед тем, как вы его напишете, дайте ему достойное имя (обычно включающий вызываемый метод, сценарий и ожидаемый результат, например, в стеке: «Pop WhenStackIsEmpty ThrowsException»).

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

+3

Я пытался читать " искусство модульного тестирования », но в какой-то момент я понял, что я читаю о том, как написать код для модульных тестов. Но не о том, как понимать, какие тесты должны быть, как понимать, что тестировать и как тестировать (с точки зрения «дизайна», а не кода). Все впечатление от чтения было, когда я начал читать книгу из середины, например: «Давайте прыгать, вот издевательства». Ни одного слова, как я могу выбрать, что тестировать. Я был настолько потрясен этим, что отложил книгу в отчаянии. Теперь я чувствую, что мне нужно изучить TDD, но я знаю, что больше не буду открывать «TAOUT» –

5

У Стива Сандерса есть отличная запись о лучших методах TDD.

http://feeds.codeville.net/~r/SteveCodeville/~3/DWmOM3O0M2s/

Кроме того, есть большой набор обучающих программ для этого в MVC проект ASP.net, который обсуждает много TDD принципы (если вы не против обучения ASP.net MVC по пути) http://www.asp.net/learn/mvc-videos/ Look для серии «Storefront» в нижней части страницы.

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

В общем, попробуйте написать тест, чтобы проверить что-то you'r пытается в архив, а затем реализовать код сделай так, чтоб это работало.

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

Лично я использую Visual Studio Unit Tests. Я не хардкорный разработчик TDD, но то, что я хотел бы сделать это:

  1. Создайте новый проект и определить несколько основных классов, основанных на конструкции системы (таким образом я могу по крайней мере, получить некоторые intellisense)
  2. создать проект единичных тестов и начать писать модульные тесты, чтобы удовлетворить функциональность, которую я пытаюсь реализовать.
  3. Сделать их неудачу
  4. Заставьте их пройти (реализации)
  5. Refactor
  6. Repeat, попробуйте сделать тест более строгим или создавать больше тестов, пока я не чувствую его твердый.

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

+0

Спасибо @TJB, я хорошо знаком с ASP.NET MVC, я загрузил проект Oxite, который кажется немного сложным и использует зависимость от инъекций и модульное тестирование. Это хороший пример для обучения? –

+0

Не проверял источник оксита, но его просто то, что MVC поддается TDD, и что видео-серия «storefront» включает разработчика, проходящего через полный проект с перспективой TDD. Роб Конэри утверждает, что он в значительной степени научился действительно применять TDD, поэтому он опирается на лучшие практики, что практично и когда вы можете пойти на компромисс. Для меня я просто использую визуальные студийные тестовые проекты в качестве платформы. Я рекомендую статью Сандерсона, краткими и замечательными. – TJB

+0

Забавно, что вы должны упомянуть Роба. Оксит был/считается полным провалом в том, что касается приложений-образцов. Роб был привлечен к проекту, чтобы попытаться улучшить ситуацию. Я не думаю, что он выполнил его задачу, но прочитал его мысли для себя. http://blog.wekeroad.com/blog/some-thoughts-on-oxite/ –

14

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

Если вы заинтересованы в работе с TDD, то дядя Боб - хороший источник. Частичный this.

Подробнее о модульном тестировании

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

Испытания не требуют настройки.

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

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

1

Прочитано Pragmatic Unit Testing in C# with NUnit. Он имеет исчерпывающую информацию о начале написания тестов и структурировании кода, чтобы сделать его более удобным для тестирования.

+1

Я купил эту книгу, и я читал ее несколько раз, и все это звучит хорошо в теории, но когда дело доходит до на самом деле это делает: все примеры и предложения слишком тривиальны при попытке применить их к реальной базе кода. Это отличная книга, чтобы выяснить, что такое Unit Testing и все жанры, но это вряд ли полно. –

+0

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

+2

Я не читал книгу, поэтому я не знаю/как/тривиальны примеры в ней, но ключ к хорошему дизайну обычно заключается в превращении «реального» кода в тривиальный код. Это может потребовать разделения классов на гораздо меньшие единицы, чем вы привыкли. Хороший, проверяемый код часто заставляет задуматься: «Неужели это действительно так, ребенок может понять этот код!» потому что каждая единица сама по себе просто охватывает очень ограниченную цель и реализуется с помощью самых простых средств. – Cygon

7

Да, предпочтительным способ сделать TDD, чтобы написать тест первый (как следует из названия Test-Driven Development). Когда вы начинаете с TDD, может быть трудно узнать, с чего начать писать тесты, поэтому я предлагаю быть прагматичным в этом отношении. В конце концов, самая важная часть нашей работы - доставка рабочего кода, а не столько, как создавался код.

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

+13

На самом деле я бы рекомендовал не начинать сначала писать тесты для существующего кода, если вы хотите изучить TDD. Написание тестов для существующего кода (который не имеет тестов) часто намного сложнее (поскольку он не был написан с возможностью проверки), чем написание тестов для совершенно нового кода. Как только вы освоите TDD для нового кода, вы хорошо подготовлены к использованию старого кода без тестов. – Cellfish

+2

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

+0

Я изучаю TDD, и для этого я пытаюсь использовать его. Рефакторинг кода для поддержки тестирования модулей и их записи, когда я иду. Для новых функций проектов я сначала создаю тесты, а затем записываю логику. – Tanmoy

1

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

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

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

9

В C# и с визуальной студии я нахожу следующие процедуры очень полезны:

  1. Подумайте! Сделайте небольшой авангардный дизайн. Вы должны иметь четкое представление о том, какие классы вам нужны и как объекты должны относиться друг к другу. Сосредоточьтесь только на одном классе/объекте (класс/объект, который вы хотите реализовать) и одну связь. В противном случае вы получите слишком тяжелый дизайн. Я часто заканчиваю несколькими эскизами (всего несколько коробок и стрелок) на запасном листе бумаги.

  2. Создайте класс в производственном коде и назовите его соответствующим образом.

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

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

  5. Скомпилируйте и пусть тестовый бегун покажет вам красную полосу!

  6. Введите требуемое поведение в производственном коде, чтобы увидеть зеленую полосу.

  7. Перейти к следующему поведению.

Для этой процедуры две вещи очень важны:

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

Тест сначала или не первый тест?

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

Когда я модернизую тесты, необходимо выполнить громоздкое задание инициализации тестируемого объекта. Также утверждениями может быть много работы из-за запутанных зависимостей. Для этого вам нужно будет изменить производственный код и разбить зависимости. При правильной инъекции зависимостей это не должно быть проблемой.

+0

Превосходно ... очень полезно ... Спасибо. – Snesh

+0

Этот ответ можно сделать универсальным для всех языков с минимальными усилиями - просто сделайте небольшие замечания о визуальной студии/C# в местах, где это применимо – kiedysktos

0

Я предпочитаю подход KentBeck, который хорошо объясняется в книге «Испытательное развитие на примере» - Кент Бек.

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

Только практическая проблема с TDD - это «Рефакторинг» (нам также нужен тестовый код рефакторинга) занимает много времени.

5

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

Here is a tutorial application (в разделе «Учебник»), который показывает, какие тесты следует писать. В этом учебном пособии вы пишете код, чтобы передать предопределенные тестовые примеры, чтобы вы попали в ритм, а затем вы затем пишете свои собственные тесты. Файл README содержит инструкции. Он написан на Java, но вы можете легко адаптировать его к C#.

+0

Спасибо за проект tdd-tetris-tutorial, очень хорошо сделано :) –

3

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

Я бы порекомендовал TDD - Test Driven Development. Это гарантирует, что у вас есть хороший охват, но он также фокусирует ваше внимание на правильном месте и проблемах.

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

Подумайте, что вы тестируете. Теперь запустите тест. Почему бы это не скомпилировать? Потому что вам нужен класс. Создайте класс и запустите тест. Почему он не компилируется? Потому что у него нет метода А. Напишите метод один и снова запустите единичный тест. Почему тест терпит неудачу? Потому что метод А не реализован. Внесите методА и выполните тест. Почему это терпит неудачу? Потому что метод А не возвращает правильное ожидаемое значение ... и т. Д.

Вы продолжаете, как это делаете, при разработке, и затем, в конце концов, тест пройдет, и часть функциональности будет завершена.

4

Я бы взял на себя TDD, тест-первую разработку, до издевательства и зависимость. Разумеется, издевательства могут помочь вам лучше изолировать ваши подразделения - и, следовательно, сделать лучше unit тестирование - но, на мой взгляд, насмешливые и DI - это более продвинутые концепции, которые могут помешать ясности просто написать ваши тесты в первую очередь.

Mocks и DI, имеют свое место; они являются хорошими инструментами для вашего инструментария.Но они берут некоторую изощренность, более совершенное понимание, чем типичный тестирующий неофит. Однако писать ваши тесты в первую очередь так же просто, как кажется. Так что легче взять на себя, и это само по себе (без макетов и DI). Вы получите более ранние, более легкие победы, написав сначала тесты без надзора, чем пытаться начать с mocks, и TDD, и DI все сразу.

Начать сначала тестирование; когда вам это очень удобно, и когда ваш код говорит вам, что вам нужны издевки, , то возьмите насмешки.

0

Я думаю, что книга Дэйва Астелля по-прежнему является одним из лучших представлений. Это для Java, но вы должны уметь переводить.

2

Распространение на ответ Стива Фримена: книга Дейва Астеля называется «Испытательная разработка - практическое руководство». Если вид приложения, который вы пишете, является графическим приложением, тогда это должно быть полезно. Я читал книгу Кента Беккса, но я не мог понять, как начать проект с TDD. Astel's book test - запускает полное нетривиальное графическое приложение от начала до конца, используя истории. Это очень помогло мне начать с TDD, он показал мне, где и как начать.

2

Разработка, основанная на испытаниях, может ввести в заблуждение для новичков, много книг, которые я прочитал, когда я изучаю TDD, научит вас писать тесты единиц для класса калькулятора, но, похоже, очень мало помогает создавать приложения реального мира , которые являются более ориентированными на данные, если осмелюсь сказать. Для меня прорыв был тогда, когда я понял, что такое Behavior Driven Development или BDD, и как начать проводить тестирование извне. Теперь я могу просто посоветовать вам сосредоточиться на поведении вашего приложения и написать модульные тесты для его проверки. Существует много дискуссий между TDD и BDD, но я думаю, что хорошо написанные автоматизированные тесты на каждом уровне добавляют ценность и для их написания нам нужно сосредоточиться на поведении.

Хади Харири имеет отличный пост здесь http://hadihariri.com/2012/04/11/what-bdd-has-taught-me/

Я также написал несколько статей на эту тему, что я чувствую, будет способствовать пониманию всех понятий, связанных с TDD здесь

http://codecooked.com/introduction-to-unit-testing-and-test-driven-development/

http://codecooked.com/different-types-of-tests-and-which-ones-to-use/

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