Test driven development in .NET Applications Anton Vidishchev MCPD Team leader at Sigma Ukraine @antonvidishchev Anton.Vidishchev@sigmaukraine.com
Обо мне • Более 6 лет в .NET разработке • Полгода практикую TDD • Один из лидеров одесской .NET User Group
Содержание доклада • Проблематика • Основные принципы TDD • Преимущества • Недостатки • Принципы тестирования кода • Unit tests, integration tests • Fakes, Mocks, Stubs, Dummies • Практики применения • Тестирование DAL • Тестирование BLL • Тестирование GUI • Tips & Tricks
Проблематика • Баги в ПО обходятся экономике США в $59.5 млрд ежегодно • В 2009 году отмененные проекты стоили компаниям $67млрд; превышения бюджета проектов обошлись в $21 млрд • В среднем профессиональные разработчики допускают от 100 до 150 ошибок на 1000 написанных строк • Стоимость исправления бага увеличивается в 10-100 раз, если код попал в production
Мантра ТDD
Преимущества TDD • Повышает качество кода • Стимулирует стройность архитектуры • Повышает уверенность в написанном коде • Меньше времени тратится на отладку • Снижает количество багов в production-коде • Уверенность при рефакторинге
Недостатки TDD • Сложность тестирования БД, сервисов • Ошибочный тест ведет к ошибочному коду • Тесты необходимо поддерживать
Что такое Unit-test • Характеристики • Single responsibility • Малый размер • Изолированность
Ваш тест не является unit- тестом, если: • Тест взаимодействует с базой • Тест использует сетевое взаимодействие • Тест работает с файловой системой • Тест не может быть запущен одновременно с любыми другими юнит-тестами • Вам приходится специально настраивать среду выполнения (например редактировать конфигурационные файлы) для его выполнения.
Как изолировать тест от зависимостей? • Fakes, Test doubles Объекты-двойники, копирующие поведение заменяемого объекта. Например, in-memory база данных. • Mocks Объекты, имитирующие поведение заменяемого объекта. Также позволяют проверить факт вызова методов • Dummies Объекты-заглушки, передаваемые в качестве обязательных параметров, но не использующиеся в методах • Stubs Заглушки. Helper-методы, имитирующие поведение объектов.
Практика применения • Текущий проект • ASP.NET MVC 3 • WCF REST services • Entity Framework 4.0 • EF POCO Objects • T4 Templates for Fake repository • SQL Azure • NUnit • Moq • Resharper • dotCover
Тестирование DAL • Используйте POCO объекты • Используйте абстракции над контекстом: IRepository, IUnitOfWork • Используйте in-memory fakes • Пользуйтесь похожестью Linq to Objects и Linq to Entities • Создавайте темплейты заполнения in-memory хранилища для разных тест-кейсов • Используйте ObjectMother • Тестируйте различия на Mock Objects (Например, SaveChanges() ) • ……. • PROFIT!
Тестирование DAL: Integration Tests • Если возможно, используйте unit-тесты на in-memory хранилище вместо integration-тестов • Используйте sanity integration tests для проверки соответствия модели и схемы БД. • Тестируйте хранимые процедуры • Sanity integration test для проверки маппинга • Старайтесь использовать эталонные C# методы для тестирования сложных процедур
Тестирование BLL • Пишите тесты до имплементации логики! • Используйте Dependency Injection/IoC контейнеры • Избегайте хрупких тестов! • Старайтесь протестировать «как это работает», а не «что вызывается» • Старайтесь тестировать логику на test-doubles
Тестирование UI • Выделяйте стабильные/нестабильные зоны в UI • Используйте, по возможности, паттерны MVC/MVVM • Используйте Contrib-библиотеки (MVCContrib). • Тестируйте Routes • Тестируйте Controller • Возвращаемый ActionResult • Передаваемая модель • Возвращаемое представление • ModelState
Tips & Tricks • Пишите короткие тесты • Одна проверка – один тест • Давайте тестам понятные названия • Избегайте хрупких тестов • Используйте Dependency Injection/IoC-контейнеры • Следите за временем билда. Используйте Ndepend для его снижения • Следите за временем выполнения тестов • Разбивайте тесты на тест-кейсы • Формализуйте Setup / TearDown
More improvements • Используйте разные виды тестирования: • UI tests • Coded-UI tests • Load tests • Integration tests • Используйте Continuous Integration • Выполняйте unit-тесты на каждом check-in • Выполняйте дорогие тесты ежедневно
Полезные фреймворки и утилиты • Unit testing • MSTest, Nunit • Mocking • Moq, RhinoMocks • Isolation and White box Unit Testing for .NET • Pex and Moles • UI Testing • MS Test Manager, Selenium • Continuous integration • TFS, TeamCity, Hudson/Jenkins, CruiseControl.NET • DI/IoC • Unity, Spring.NET, Ninject • Contribution projects • NUGET, MVCContrib • Refactoring • Resharper • Code Coverage • Visual Studio, dotCover
Полезные ссылки • Kent Beck. Test Driven Development: By Example http://www.amazon.com/Test-Driven-Development- Kent-Beck/dp/0321146530/ • Testability and Entity Framework 4.0 http://msdn.microsoft.com/en- us/library/ff714955.aspx • Mocks aren’t Stubs. Martin Fowler http://martinfowler.com/articles/mocksArentStubs.ht ml
Вопросы • Спасибо за внимание • Антон Видищев • @antonvidishchev • Anton.Vidishchev@sigmaukraine.com

Test Driven Development in .NET Applications

  • 1.
    Test driven development in .NETApplications Anton Vidishchev MCPD Team leader at Sigma Ukraine @antonvidishchev Anton.Vidishchev@sigmaukraine.com
  • 2.
    Обо мне • Более6 лет в .NET разработке • Полгода практикую TDD • Один из лидеров одесской .NET User Group
  • 3.
    Содержание доклада • Проблематика •Основные принципы TDD • Преимущества • Недостатки • Принципы тестирования кода • Unit tests, integration tests • Fakes, Mocks, Stubs, Dummies • Практики применения • Тестирование DAL • Тестирование BLL • Тестирование GUI • Tips & Tricks
  • 4.
    Проблематика • Баги вПО обходятся экономике США в $59.5 млрд ежегодно • В 2009 году отмененные проекты стоили компаниям $67млрд; превышения бюджета проектов обошлись в $21 млрд • В среднем профессиональные разработчики допускают от 100 до 150 ошибок на 1000 написанных строк • Стоимость исправления бага увеличивается в 10-100 раз, если код попал в production
  • 5.
  • 6.
    Преимущества TDD • Повышает качество кода • Стимулирует стройность архитектуры • Повышает уверенность в написанном коде • Меньше времени тратится на отладку • Снижает количество багов в production-коде • Уверенность при рефакторинге
  • 7.
    Недостатки TDD • Сложностьтестирования БД, сервисов • Ошибочный тест ведет к ошибочному коду • Тесты необходимо поддерживать
  • 8.
    Что такое Unit-test •Характеристики • Single responsibility • Малый размер • Изолированность
  • 9.
    Ваш тест неявляется unit- тестом, если: • Тест взаимодействует с базой • Тест использует сетевое взаимодействие • Тест работает с файловой системой • Тест не может быть запущен одновременно с любыми другими юнит-тестами • Вам приходится специально настраивать среду выполнения (например редактировать конфигурационные файлы) для его выполнения.
  • 10.
    Как изолировать тестот зависимостей? • Fakes, Test doubles Объекты-двойники, копирующие поведение заменяемого объекта. Например, in-memory база данных. • Mocks Объекты, имитирующие поведение заменяемого объекта. Также позволяют проверить факт вызова методов • Dummies Объекты-заглушки, передаваемые в качестве обязательных параметров, но не использующиеся в методах • Stubs Заглушки. Helper-методы, имитирующие поведение объектов.
  • 11.
    Практика применения • Текущийпроект • ASP.NET MVC 3 • WCF REST services • Entity Framework 4.0 • EF POCO Objects • T4 Templates for Fake repository • SQL Azure • NUnit • Moq • Resharper • dotCover
  • 12.
    Тестирование DAL • ИспользуйтеPOCO объекты • Используйте абстракции над контекстом: IRepository, IUnitOfWork • Используйте in-memory fakes • Пользуйтесь похожестью Linq to Objects и Linq to Entities • Создавайте темплейты заполнения in-memory хранилища для разных тест-кейсов • Используйте ObjectMother • Тестируйте различия на Mock Objects (Например, SaveChanges() ) • ……. • PROFIT!
  • 13.
    Тестирование DAL: Integration Tests •Если возможно, используйте unit-тесты на in-memory хранилище вместо integration-тестов • Используйте sanity integration tests для проверки соответствия модели и схемы БД. • Тестируйте хранимые процедуры • Sanity integration test для проверки маппинга • Старайтесь использовать эталонные C# методы для тестирования сложных процедур
  • 14.
    Тестирование BLL • Пишитетесты до имплементации логики! • Используйте Dependency Injection/IoC контейнеры • Избегайте хрупких тестов! • Старайтесь протестировать «как это работает», а не «что вызывается» • Старайтесь тестировать логику на test-doubles
  • 15.
    Тестирование UI • Выделяйте стабильные/нестабильные зоны в UI • Используйте, по возможности, паттерны MVC/MVVM • Используйте Contrib-библиотеки (MVCContrib). • Тестируйте Routes • Тестируйте Controller • Возвращаемый ActionResult • Передаваемая модель • Возвращаемое представление • ModelState
  • 16.
    Tips & Tricks •Пишите короткие тесты • Одна проверка – один тест • Давайте тестам понятные названия • Избегайте хрупких тестов • Используйте Dependency Injection/IoC-контейнеры • Следите за временем билда. Используйте Ndepend для его снижения • Следите за временем выполнения тестов • Разбивайте тесты на тест-кейсы • Формализуйте Setup / TearDown
  • 17.
    More improvements • Используйтеразные виды тестирования: • UI tests • Coded-UI tests • Load tests • Integration tests • Используйте Continuous Integration • Выполняйте unit-тесты на каждом check-in • Выполняйте дорогие тесты ежедневно
  • 18.
    Полезные фреймворки и утилиты •Unit testing • MSTest, Nunit • Mocking • Moq, RhinoMocks • Isolation and White box Unit Testing for .NET • Pex and Moles • UI Testing • MS Test Manager, Selenium • Continuous integration • TFS, TeamCity, Hudson/Jenkins, CruiseControl.NET • DI/IoC • Unity, Spring.NET, Ninject • Contribution projects • NUGET, MVCContrib • Refactoring • Resharper • Code Coverage • Visual Studio, dotCover
  • 19.
    Полезные ссылки • KentBeck. Test Driven Development: By Example http://www.amazon.com/Test-Driven-Development- Kent-Beck/dp/0321146530/ • Testability and Entity Framework 4.0 http://msdn.microsoft.com/en- us/library/ff714955.aspx • Mocks aren’t Stubs. Martin Fowler http://martinfowler.com/articles/mocksArentStubs.ht ml
  • 20.
    Вопросы • Спасибо завнимание • Антон Видищев • @antonvidishchev • Anton.Vidishchev@sigmaukraine.com

Editor's Notes

  • #3 О себеОдесская группаХорошо, что происходят мероприятия
  • #4 Содержание, что мы будем обсуждать
  • #5 Выбирая как построить доклад, решил не вдаваться в евангелистические насторения