Правильные тесты: за гранью книжных примеров

38
Правильные тесты Антон Бевзюк Александр Андронов

Upload: agiledays

Post on 23-Dec-2014

499 views

Category:

Technology


1 download

DESCRIPTION

Антон Бевзюк, Intel (Нижний Новгород) Александр Андронов Intel (Нижний Новгород) TDD - одна из основных практик экстремального программирования, давно и прочно завоевавшая популярность среди программистов. Но не все так просто, как кажется. Когда дело доходит до реального применения, многие программисты сталкиваются с проблемами применения TDD, выходящими за рамки книжных примеров. • Как писать быстрые тесты на несколько слоев? • Каково должно быть соотношение юнит тестов и интеграционных тестов? • Как писать тесты так, чтобы они не замедляли рефакторинг? • Как тестировать GUI? • Как тестировать базу данных? Именно такие проблемы мы и рассмотрим на воркшопе и вместе научимся писать правильные тесты.

TRANSCRIPT

Page 1: Правильные тесты: за гранью книжных примеров

Правильные тесты

Антон Бевзюк

Александр Андронов

Page 2: Правильные тесты: за гранью книжных примеров

План

Кто мы такие?

repeat {

Пример «неправильных» тестов

Упражнение

}

until (EndOfTime)

Полезные советы

Page 3: Правильные тесты: за гранью книжных примеров

Кто мы такие?

Разработчики бизнес-приложений

Agile coaches

Page 4: Правильные тесты: за гранью книжных примеров

Польза от тестов

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

Page 5: Правильные тесты: за гранью книжных примеров

Вред от тестов

Мутные

Долго готовить

Замедляют разработку

Замедляют рефакторинг

Не покрывают сценарий полностью

А если покрывают, то медленные

Удел избранных

Page 6: Правильные тесты: за гранью книжных примеров

Пример: Жизнь

В мёртвой клетке, рядом с которой ровно три живые клетки, зарождается жизнь

Если у живой клетки есть две или три живые соседки, то эта клетка продолжает жить

Если у живой клетки меньше двух соседей, клетка умирает от одиночества

Если у живой клетки больше трех соседей, клетка умирает от перенаселенности

Page 7: Правильные тесты: за гранью книжных примеров

Мутные тесты

Page 8: Правильные тесты: за гранью книжных примеров

Названия тестов

Page 9: Правильные тесты: за гранью книжных примеров

Упражнение 1

Придумайте хорошее название тестам

Tests\DomainTests\NotPerfect\GameTests.cs

• WhenMakeANewStep• AnyLiveCellWithThreeNeighborsLives

• CellDiesWhen• ItHasLessThenThreeNeighbors

• ItHasMoreThenThreeNeighbors

Page 10: Правильные тесты: за гранью книжных примеров

Тест, который трудно понять

Page 11: Правильные тесты: за гранью книжных примеров

Тест, который легко понять

Page 12: Правильные тесты: за гранью книжных примеров

Так пишите так!

Page 13: Правильные тесты: за гранью книжных примеров

Упражнение 2

Сделайте DSL для Arrange и Assert

Create.Game

Create(a.Game)

Arrange.Game

Given(a.Game)

AssertThat.AreEqual

Assert.That(game, Equivalent.To())

Page 14: Правильные тесты: за гранью книжных примеров

Тесты, замедляющие рефакторинг

Page 15: Правильные тесты: за гранью книжных примеров

GameGame(size)

GameGame(name, size)

Page 16: Правильные тесты: за гранью книжных примеров

Gamebool Cells[,]

Cellbool IsAlive

GameCell Cells[,]

Cellbool IsAlive

*

Page 17: Правильные тесты: за гранью книжных примеров

Тесты не компилируются

Page 18: Правильные тесты: за гранью книжных примеров

Тесты падают

Page 19: Правильные тесты: за гранью книжных примеров

Тесты ходят

Page 20: Правильные тесты: за гранью книжных примеров

Упражнение 3• Добавьте свойство Game.Name

• Сделайте рефакторинг bool[,] -> Cell[,]

• Перепишите упавшие тесты, используя DSL

Page 21: Правильные тесты: за гранью книжных примеров

Медленные тесты

Page 22: Правильные тесты: за гранью книжных примеров

Тесты на DB - медленные

Page 23: Правильные тесты: за гранью книжных примеров

Тесты на InMemoryDb - быстрые

Page 24: Правильные тесты: за гранью книжных примеров

Тесты на поведение

Page 25: Правильные тесты: за гранью книжных примеров

Тесты поведения

Page 26: Правильные тесты: за гранью книжных примеров

Client

Runtime

ViewModel

Model

ServerWCF

ServiceApp

ServiceDomain

Infrastructure

DB

Page 27: Правильные тесты: за гранью книжных примеров

Client

Application Test

ViewModel

Model

ServerWCF

ServiceApp

ServiceDomain

Infrastructure

InMemDB

Fake

Page 28: Правильные тесты: за гранью книжных примеров

Упражнение 4

Заменить тесты на поведение тестами на состояние

Page 29: Правильные тесты: за гранью книжных примеров

Сдвиг фокуса Unit Tests

Integration Tests

Application Tests

TDD ATDD

Page 30: Правильные тесты: за гранью книжных примеров

Запахи тестов

Assert.AreEqual(1, collection.Count)

StringAssert.Contains()

CollectionAssert.Contains()

Много сломанных тестов после рефакторинга

Медленные тесты

Page 31: Правильные тесты: за гранью книжных примеров

Итак, мы узнали

Как давать тестам хорошие имена

Как использовать DSL для Arrange и Assert

Как писать быстрые интеграционные тесты с помощью InMemoryDb

Как писать автоматизированные приемочные тесты

Page 32: Правильные тесты: за гранью книжных примеров

Be ag;)e!

Page 33: Правильные тесты: за гранью книжных примеров

Вопросы?

Page 34: Правильные тесты: за гранью книжных примеров

Правильные тесты

Антон Бевзюк

[email protected]

Александр Андронов

[email protected]

Page 35: Правильные тесты: за гранью книжных примеров

Backup

Page 36: Правильные тесты: за гранью книжных примеров
Page 37: Правильные тесты: за гранью книжных примеров
Page 38: Правильные тесты: за гранью книжных примеров