Предыдущий ролик Следующий ролик  

Видео урок: Introduction to unit testing

Основы ASP.NET MVC 5

Благодаря принципу разделения ответственностей и организации логики контроллера в индивидуальные действия, паттерн MVC идеально подходит для модульного тестирования вашего кода. В этом видео я познакомлю вас с базовыми понятиями модульного тестирования. Большинство несведущих разработчиков и менеджеров считают, что модульное тестирование - это лишь модный термин для обозначения тестирования, и не станут беспокоить нас вопросами о том, что мы подразумеваем под словом "модульное". Если вы все же спросите об этом, то возможно, получите множество разных ответов. Некоторые скажут, что модуль - это класс или, может, группа связанных классов.

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

Таким образом, даже если вы считаете, что модуль - это класс или блок, чтобы достичь так называемого "хорошего покрытия кода", вам понадобится написать для такого модуля множество небольших тестов. Итак, каковы же идеи и цели тестирования небольших фрагментов кода? Как известно, убедить разработчика в том, что ему или ей следует заняться модульным тестированием, очень сложно, поскольку им кажется, что на это уйдет много времени. Возможно, им покажется, что они исследуют песчинки, тогда как на самом деле для выполнения задачи в срок нужно просто пробежать через пляж. Чтобы действительно оценить возможности модульного тестирования, вам необходимо убедиться в его преимуществах на собственном опыте, но я попытаюсь объяснить вам, почему вам стоит использовать именно этот вид тестирования.

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

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

Также тесты помогают документировать код. Цель правильно написанного теста должна быть понятна сразу. Читатель должен понять, что должен выполнять этот код. Обычно в ASP.NET модульный тест - это некий метод, возвращающий тип void, за которым следуют процедуры Arrange, Act, Assert. На шаге Arrange (Подготовка) мы подготавливаем элементы, которые собираемся использовать во время теста. В этом случае мы проверяем работу метода, используемого для переключения на защищенный протокол https. Мы будем тестировать его с помощью переменной url, объявленной на шаге Arrange.

На шаге Act (Выполнение) мы запускаем url с помощью метода MakeSecureUrl, а затем на шаге Assert (Проверка) проверяем, соответствует ли результат ожидаемому. Будем использовать этот класс Assert из встроенных инструментов тестирования Visual Studio. Метод AreEqual ничего не возвращает, но на самом деле, если два объекта не равны между собой, выдается исключение, благодаря чему мы понимаем, что тест завершился неудачно. Тест более высокого уровня проверял бы одновременно несколько url, поэтому было бы замечательно использовать в тесте несколько операторов Assert.

Нам нужно знать, приводит ли какой-то из этих url к исключению, а затем мы при необходимости можем устранять в них ошибки поочередно. Итак, теперь, когда я убедил вас в том, что вам несомненно стоит применять модульное тестирование, что еще вам нужно знать перед тем, как приступить к его выполнению? Вам нужно создать класс, в котором будут храниться все ваши методы тестирования. Кроме того, вам нужно несколько инструментов тестирования или фреймворк для тестирования, с помощью которых вы будете выполнять тесты и формировать отчеты о результатах тестирования. В качестве фреймворка для тестирования мы будем использовать Visual Studio. Как и в большинстве фреймворков для тестирования, удачные и неудачные тесты в нем будут выделяться зеленым и красным цветом соответственно.

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