Правильные тесты: за гранью книжных примеров
DESCRIPTION
Антон Бевзюк, Intel (Нижний Новгород) Александр Андронов Intel (Нижний Новгород) TDD - одна из основных практик экстремального программирования, давно и прочно завоевавшая популярность среди программистов. Но не все так просто, как кажется. Когда дело доходит до реального применения, многие программисты сталкиваются с проблемами применения TDD, выходящими за рамки книжных примеров. • Как писать быстрые тесты на несколько слоев? • Каково должно быть соотношение юнит тестов и интеграционных тестов? • Как писать тесты так, чтобы они не замедляли рефакторинг? • Как тестировать GUI? • Как тестировать базу данных? Именно такие проблемы мы и рассмотрим на воркшопе и вместе научимся писать правильные тесты.TRANSCRIPT
Правильные тесты
Антон Бевзюк
Александр Андронов
План
Кто мы такие?
repeat {
Пример «неправильных» тестов
Упражнение
}
until (EndOfTime)
Полезные советы
Кто мы такие?
Разработчики бизнес-приложений
Agile coaches
Польза от тестов
When the intern tells me that "the tests are for those who can not program"
http://martinvalasek.com/blog/pictures-from-a-developers-life-part-2
Вред от тестов
Мутные
Долго готовить
Замедляют разработку
Замедляют рефакторинг
Не покрывают сценарий полностью
А если покрывают, то медленные
Удел избранных
Пример: Жизнь
В мёртвой клетке, рядом с которой ровно три живые клетки, зарождается жизнь
Если у живой клетки есть две или три живые соседки, то эта клетка продолжает жить
Если у живой клетки меньше двух соседей, клетка умирает от одиночества
Если у живой клетки больше трех соседей, клетка умирает от перенаселенности
Мутные тесты
Названия тестов
Упражнение 1
Придумайте хорошее название тестам
Tests\DomainTests\NotPerfect\GameTests.cs
• WhenMakeANewStep• AnyLiveCellWithThreeNeighborsLives
• CellDiesWhen• ItHasLessThenThreeNeighbors
• ItHasMoreThenThreeNeighbors
Тест, который трудно понять
Тест, который легко понять
Так пишите так!
Упражнение 2
Сделайте DSL для Arrange и Assert
Create.Game
Create(a.Game)
Arrange.Game
Given(a.Game)
AssertThat.AreEqual
Assert.That(game, Equivalent.To())
Тесты, замедляющие рефакторинг
GameGame(size)
GameGame(name, size)
Gamebool Cells[,]
Cellbool IsAlive
GameCell Cells[,]
Cellbool IsAlive
*
Тесты не компилируются
Тесты падают
Тесты ходят
Упражнение 3• Добавьте свойство Game.Name
• Сделайте рефакторинг bool[,] -> Cell[,]
• Перепишите упавшие тесты, используя DSL
Медленные тесты
Тесты на DB - медленные
Тесты на InMemoryDb - быстрые
Тесты на поведение
Тесты поведения
Client
Runtime
ViewModel
Model
ServerWCF
ServiceApp
ServiceDomain
Infrastructure
DB
Client
Application Test
ViewModel
Model
ServerWCF
ServiceApp
ServiceDomain
Infrastructure
InMemDB
Fake
Упражнение 4
Заменить тесты на поведение тестами на состояние
Сдвиг фокуса Unit Tests
Integration Tests
Application Tests
TDD ATDD
Запахи тестов
Assert.AreEqual(1, collection.Count)
StringAssert.Contains()
CollectionAssert.Contains()
Много сломанных тестов после рефакторинга
Медленные тесты
Итак, мы узнали
Как давать тестам хорошие имена
Как использовать DSL для Arrange и Assert
Как писать быстрые интеграционные тесты с помощью InMemoryDb
Как писать автоматизированные приемочные тесты
Be ag;)e!
Вопросы?
Правильные тесты
Антон Бевзюк
Александр Андронов
Backup