Автоматизированное модульное тестирование - почему? что? который? - PullRequest
34 голосов
/ 22 августа 2009

Я разработчик на C # winforms с опытом работы около года. Единственное модульное тестирование, которое я делал до сих пор, было ручным. Я думаю о следующем на некоторое время:

  • Зачем нам нужен автоматизированный блок тестирование? Насколько это эффективно?
  • Если я хочу начать делать автоматизированный модульное тестирование. С чего мне начать от? (слышал о нунит)
  • Нужно ли что-то иметь в виду? при разработке моих классов облегчить автоматизированное модульное тестирование?
  • Есть ли в C # встроенная поддержка автоматизированное модульное тестирование?
  • Можем ли мы также протестировать графический интерфейс модульное тестирование или это просто бизнес логика?
  • Слышал про насмешливые рамки. Они также для модульного тестирования?

Ответы [ 6 ]

70 голосов
/ 22 августа 2009

Зачем нам нужно автоматическое модульное тестирование? Насколько это эффективно?

Автоматическое модульное тестирование очень ценно в первую очередь потому, что оно автоматизировано (обычно мы считаем его «модульным тестом» только тогда, когда является автоматизируемым). По мере увеличения размера приложения ручное тестирование всего приложения может занять часы или даже недели. Даже тестирование лишь небольшой части приложения занимает много времени и подвержено ошибкам. Если вы не страдаете аутизмом, вы не сможете сосредоточиться на выполнении каждого ручного теста на 100% правильно, если вам придется делать это снова и снова десятки раз.

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

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

Если я хочу начать автоматизированное модульное тестирование. С чего мне начать? (слышал о монахинях)

Прежде всего, вам необходимо изучить основы юнит-тестирования. Книга Роя Ошерова Искусство модульного тестирования - хорошее введение.

Когда дело доходит до фреймворков, NUnit существует уже давно, но у него есть некоторые присущие ему проблемы.

Если у вас уже есть Visual Studio Professional или Team System, есть встроенная среда модульного тестирования, обычно известная как MSTest. Большинству людей не нравится эта структура, но лично я нахожу ее вполне адекватной. Интеграция с IDE работает хорошо, но API мог бы быть и лучше.

Если вы ищете бесплатную платформу для модульного тестирования с открытым исходным кодом, я бы порекомендовал xUnit.net , которая является гораздо более современной платформой.

Нужно ли мне что-то иметь в виду при разработке своих классов, чтобы облегчить автоматизированное модульное тестирование?

Да, каждый класс должен использоваться отдельно. Это может быть очень трудно сделать с помощью предварительной разработки или если вы пытаетесь перестроить модульные тесты на существующий код, но это должно произойти более или менее естественно, если вы примете разработку через тестирование (TDD).

Имеет ли C # встроенную поддержку для автоматического модульного тестирования?

Нет, C # - это просто язык, но, как я упоминал выше, в некоторых версиях Visual Studio есть MSTest.

Можем ли мы также протестировать графический интерфейс с автоматическим модульным тестированием или это просто бизнес-логика?

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

Однако существует много шаблонов проектирования, которые могут помочь вам извлечь всю логику графического интерфейса в тестируемые классы: Modev-View-Controller, Model-View-Presenter, Application Controller, Model-View-ViewModel и т. Д.

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

Слышали про насмешливые рамки. Они также для модульного тестирования?

Динамические макеты библиотеки только для модульного тестирования.

Некоторые хорошие и популярные из них

8 голосов
/ 22 августа 2009
  • Зачем нам нужен автоматизированный блок тестирование? Насколько это эффективно?

Чтобы выделить части программы и показать, что они «правильные». Они являются контрактом, если вы хотите, чтобы код запускался. Имея это под рукой, они могут быстро и часто сообщать вам, правильно ли работает код.

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

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

  • Если я хочу начать делать автоматизированный модульное тестирование. С чего мне начать от? (слышал о нунит)

Nunit это хорошо, MbUnit это хорошо. Для начала прочитайте и выполните упражнения в чтениях. Веб-сайты и блоги по модульному тестированию, разработке через тестирование (TDD) и рефакторингу. У Object Mentor есть хорошая серия по TDD. Затем в какой-то момент выберите код, который у вас есть, и попробуйте.

Книги, которые я предлагаю - Разработка на основе тестирования на примере, Разработка на основе тестирования, Практическое руководство, Искусство модульного тестирования, Рефакторинг (Мартин Фаулер), Рефакторинг рабочей книги, Рефакторинг на шаблоны, Чистый код, и я уверен, что есть и другие .

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

  • Нужно ли что-нибудь иметь в виду при разработке моих классов облегчить автоматизированное модульное тестирование?

Многие из упомянутых мной книг будут обсуждать это. Ответ и да и нет. Часто лучше спроектированный класс с меньшим количеством зависимостей легче тестировать. Это просто хороший дизайн, но он облегчает тестирование. Есть небольшая дискуссия о том, стоит ли менять код, чтобы сделать его более тестируемым. Я склоняюсь к вам следует. На данный момент для меня мой код в прошлом не включал в себя много идей «хорошего дизайна», поэтому для меня начало этого путешествия по TDD повышает мою осведомленность и уровень хорошего дизайна в моем коде, что отчасти связано с желанием сделать TDD.

  • Есть ли в C # встроенная поддержка автоматизированное модульное тестирование?

Если у вас VS 2008 Pro, да, или система Team, но, естественно, я полагаю, что нет.

  • Можем ли мы также протестировать графический интерфейс модульное тестирование или это просто бизнес логика?

Да, есть несколько инструментов. Ватин это тот, который приходит на ум.

  • Слышали про насмешливые рамки. Они также для модульного тестирования?

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

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

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

6 голосов
/ 22 августа 2009

Пункт 1) Это дает вам непрерывный обзор того, что работает, а что нет. Как только вы измените простую функцию, у вас будет результат, если это изменение что-либо нарушит. Более того, вы можете позже провести рефакторинг всего приложения, и, пока все ваши тесты станут зелеными, все работает отлично. Просто этот момент очень важен. Или вы когда-нибудь делали проект, который никогда не подвергался рефакторингу?

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

Пункт 3) Ну, есть наверняка люди, которые могут часами говорить вам, что делать, а что нет. Поскольку мой фоновый тестовый опыт ограничен использованием его для встроенных устройств, у нас есть и другие трудности.

Пункт 4) C # - это язык программирования, а не среда тестирования. .Net имеет по крайней мере один атрибут, который может помочь во время модульных тестов, то есть InternalsVisibleTo-атрибут, чтобы сделать ваши внутренние классы и методы общедоступными для одного специального типа.

Пункт 5) Если у вас хорошо разработанное приложение, вам не нужно тестировать графический интерфейс. Подумайте об этом: ваш графический интерфейс не имеет кода. Каждая кнопка, которую пользователь может нажать, отображается на контроллере. Каждый ввод, который может предоставить пользователь, передается контроллеру. Так что вы должны проверить в своем графическом интерфейсе? Все, что вам нужно сделать, это протестировать ваш контроллер и работать хорошо. И с этой MVVM / MVC / WhatElseArchitecture у вас есть, с одной стороны, хорошо разработанное приложение, а с другой - приложение, которое легко протестировать.

5 голосов
/ 22 августа 2009
  • Зачем нам нужен автоматизированный блок тестирование? Насколько это эффективно?

Очень.

  • Если я хочу начать делать автоматизированный модульное тестирование. С чего мне начать от? (слышал о нунит) Начните с nunit - это очень просто

  • Нужно ли что-то иметь в виду? при разработке моих классов облегчить автоматизированное модульное тестирование? Если вы хорошо разбираетесь в модульном тестировании, тогда вам захочется.

  • Есть ли в C # встроенная поддержка автоматизированное модульное тестирование? Нет - но Visual Studio делает - но я не рекомендую использовать его

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

  • Слышали про насмешливые рамки. Они также для модульного тестирования? Да.

Прочтите Роя Ошерова Искусство юнит-тестирования.

2 голосов
/ 17 июля 2014
Why do we need to have automated unit testing? How effective is it?
  • Вы не. Вам решать, хотите вы этого или нет. Это будет так же эффективно, как вы делаете это. Вы должны идти на автоматизацию, только если вы собираетесь повторить цикл тестирования для фрагмента кода более 3 раз !!! Если я хочу начать делать автоматизированное модульное тестирование. С чего мне начать? (слышал о нунит)

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

  • Вы можете, но не должны. GUI лучше тестировать вручную. Глаза поймают больше ошибок в интерфейсе, чем машина. Слышал про насмешливые рамки. Они также для модульного тестирования?

  • Да, большинство фреймворков, таких как TestNG, Junit и т. Д., Предназначены для модульного тестирования.

2 голосов
/ 22 августа 2009

Причина автоматизированного модульного тестирования проста: потому что, по мере роста вашего кода, ручное тестирование будет занимать все больше и больше времени, а значит, у вас все меньше и меньше шансов сделать это.

Автоматизируя тесты, вы делаете их удобными для запуска, поэтому они будут запускаться.

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