Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
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

More Related Content

Test Driven Development in .NET Applications

  • 1. Test driven development in .NET Applications 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
  • 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. Полезные ссылки • 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
  • 20. Вопросы • Спасибо за внимание • Антон Видищев • @antonvidishchev • Anton.Vidishchev@sigmaukraine.com

Editor's Notes

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