2. Обо мне
Андрей Пономарёв
● 11 лет программирую за деньги
● Sun Certified Java Programmer
● Team Lead
linkedin.com/in/AndreyPonomarev
3. Disclaimer #1
Это не тренинг по Java!
ЦЕЛЕВАЯ АУДИТОРИЯ
● Junior и Middle разработчики,
● с опытом работы с Java больше 1 года,
● с пониманием принципов ООП,
● уверенным владением IDE
● элементарным знанием английского.
5. План
1. Болтовня для тех, кто пришел просто
послушать
2. Практический пример
3. Немного болтовни для разнообразия
4. Перерыв
5. Парное программирование до конца дня
для тех, кто пришел потренироваться
6. Немного Википедии
Разработка через тестирование - техника
разработки ПО, которая основывается на
повторении очень коротких циклов
разработки:
1. пишется тест, покрывающий желаемое
изменение,
2. пишется код, который позволит пройти
тест,
3. проводится рефакторинг нового кода к
соответствующим стандартам.
8. В интернетах пишут...
"Я делаю продукты 8 лет без всякого TDD, и не имею
особенных проблем"
"ТДД - это для теоретиков. В реальных проектах оно
не используется."
"Мне платят за функционал, а не за тесты"
"TDD - это мода. Как пришло - так и уйдёт."
10. Есть мнение что...
"Использование TDD увеличивает время
разработки"
Правда
Согласно исследованиям, время разработки
увеличивается на 15-30%.
("Evaluating the Efficacy of Test-Driven Development:
Industrial Case Studies", Microsoft)
11. ● Бег по утрам
● Набор текста вслепую
● Езда на велосипеде
Потому что...
● Трудно начать
● Выгода не очевидна
● Требуется дисциплина
● Окупается в будущем
Применять TDD похоже на ...
13. Есть мнение что...
"Использование TDD улучшает качество
кода"
Правда
Согласно исследованиям, количество
дефектов уменьшается на 40%.
(“Test-Driven Development as a Defect-Reduction
Practice”, IBM)
18. Самые важные принципы
Позволяющие радикально снизить
количество дефектов и ускорить разработку
KISS
Keep it simple stupid
YAGNI
You aren't gonna need it
19. StringCalculator
Step 1
Create a simple String calculator with a method
int Add(String numbers)
● The method can take 0, 1 or 2 numbers, and
will return their sum (for an empty string it
will return 0) for example “” or “1” or “1,2”
● Start with the simplest test case of an empty
string and move to 1 and two numbers
21. StringCalculator
Step 3
Allow the Add method to handle new lines
between numbers (instead of commas).
● the following input is ok: "1n2,3" (will equal 6)
● the following input is NOT ok: "1,n" (not need
to prove it - just clarifying)
22. StringCalculator
Step 4
Support different delimiters
● to change a delimiter, the beginning of the
string will contain a separate line that looks like
this: "//[delimiter]n[numbers…]" for example
"//;n1;2" should return three where the default
delimiter is ';' .
● the first line is optional. All existing scenarios
should still be supported
23. StringCalculator
Step 5
Calling Add with a negative number will throw
an exception “negatives not allowed” - and the
negative that was passed.
If there are multiple negatives, show all of them
in the exception message
24. Тестирование функций без
побочных эффектов
assertEquals(0, Math.sqrt(0));
assertEquals(1, Math.sqrt(1));
assertEquals(10, Math.sqrt(100));
32. Домен
● Мир - двумерное пространство,
состоящее из клеток
● Клетка может быть «живой» или
«мёртвой»
● У каждой клетки есть 8 соседей
● В каждом поколении клетки умирают или
рождаются по особым правилам
33. Правила
1. Если у клетки меньше двух соседей, она
умирает
2. Если у клетки 2 или 3 соседа, она
продолжает жить
3. Если у клетки больше 3 соседей, она
умирает от перенаселения
4. Если у мёртвой клетки, рядом 3 живые
клетки, то в ней зарождается жизнь
35. Test case 1
Given
a live cell with fewer than 2 live neighbors
When
I calculate the next generation,
Then
the cell is dead.
36. Test case 2
Given
a live cell with more than 3 live neighbors
When
I calculate the next generation
Then
the cell is dead
37. Test case 3
Given
a live cell with 2 or 3 live neighbors
When
I calculate the next generation
Then
the cell is dead.
38. Test case 4
Given
a dead cell with exactly three live neighbors
When
I calculate the next generation
Then
the cell is alive.
39. Спасибо за внимание!
Литература:
● Working Effectively with Legacy Code, Michael Feathers
● Refactoring: Improving the Design of Existing Code, Martin Fowler
● Test Driven Development: By Example, Kent Beck
● Refactoring to Patterns, Joshua Kerievsky
Каты:
● String Calculator kata
● Conway's Game of Life kata
● Что такое Coding Dojo и другие каты
Исходный код:
github.com/kranonit/tdd-training
Вопросы?
Andrey.Ponomarev@gmail.com