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
Notas del editor
О себеОдесская группаХорошо, что происходят мероприятия
Содержание, что мы будем обсуждать
Выбирая как построить доклад, решил не вдаваться в евангелистические насторения