Test Driven Development
#kranonit S11E01
13.07.2013
Andrey Ponomarev
linkedin.com/in/AndreyPonomarev
Andrey.Ponomarev@gmai...
Обо мне
Андрей Пономарёв
● 11 лет программирую за деньги
● Sun Certified Java Programmer
● Team Lead
linkedin.com/in/Andre...
Disclaimer #1
Это не тренинг по Java!
ЦЕЛЕВАЯ АУДИТОРИЯ
● Junior и Middle разработчики,
● с опытом работы с Java больше 1 ...
Disclaimer #2
TRUE FALSE
Java разработчик
Опытный программист
Профессиональный тренер
Опытный докладчик
План
1. Болтовня для тех, кто пришел просто
послушать
2. Практический пример
3. Немного болтовни для разнообразия
4. Перер...
Немного Википедии
Разработка через тестирование - техника
разработки ПО, которая основывается на
повторении очень коротких...
TDD мантра
● Красный
● Зеленый
● Рефакторинг
В интернетах пишут...
"Я делаю продукты 8 лет без всякого TDD, и не имею
особенных проблем"
"ТДД - это для теоретиков. В р...
Есть мнение что...
"Использование TDD увеличивает время
разработки"
Есть мнение что...
"Использование TDD увеличивает время
разработки"
Правда
Согласно исследованиям, время разработки
увелич...
● Бег по утрам
● Набор текста вслепую
● Езда на велосипеде
Потому что...
● Трудно начать
● Выгода не очевидна
● Требуется ...
Есть мнение что...
"Использование TDD улучшает качество
кода"
Есть мнение что...
"Использование TDD улучшает качество
кода"
Правда
Согласно исследованиям, количество
дефектов уменьшает...
Результаты исследования
"Evaluating the Efficacy of Test-Driven Development: Industrial Case Studies", Microsoft
Зачем TDD
● Лучше код
● Борьба со страхом
● Быстрая обратная связь
TDD ката
Самые важные принципы
Позволяющие радикально снизить
количество дефектов и ускорить разработку
Самые важные принципы
Позволяющие радикально снизить
количество дефектов и ускорить разработку
KISS
Keep it simple stupid
...
StringCalculator
Step 1
Create a simple String calculator with a method
int Add(String numbers)
● The method can take 0, 1...
StringCalculator
Step 2
Allow the Add method to handle an unknown
amount of numbers
StringCalculator
Step 3
Allow the Add method to handle new lines
between numbers (instead of commas).
● the following inpu...
StringCalculator
Step 4
Support different delimiters
● to change a delimiter, the beginning of the
string will contain a s...
StringCalculator
Step 5
Calling Add with a negative number will throw
an exception “negatives not allowed” - and the
negat...
Тестирование функций без
побочных эффектов
assertEquals(0, Math.sqrt(0));
assertEquals(1, Math.sqrt(1));
assertEquals(10, ...
Тестирование состояния
// Given
HashSet<String> set = new HashSet<>();
// When
set.add("test");
// Then
assertEquals(1, se...
Тестирование взаимодействия
Тестирование взаимодействия
(продолжение)
// Setup
DocValidator validator = mock(DocValidator.class);
DocRepository repo =...
Тестирование взаимодействия
(продолжение)
// Given
when(validator.validate(doc)).thenReturn(true);
// When
service.registe...
Тестирование исключений
@Rule
public ExpectedException ex
= ExpectedException.none();
// Given
Document invalidDoc = creat...
Перерыв
Conway's Game of Life
Домен
● Мир - двумерное пространство,
состоящее из клеток
● Клетка может быть «живой» или
«мёртвой»
● У каждой клетки есть...
Правила
1. Если у клетки меньше двух соседей, она
умирает
2. Если у клетки 2 или 3 соседа, она
продолжает жить
3. Если у к...
Пример
1
поколение
2
поколение
3
поколение
Test case 1
Given
a live cell with fewer than 2 live neighbors
When
I calculate the next generation,
Then
the cell is dead.
Test case 2
Given
a live cell with more than 3 live neighbors
When
I calculate the next generation
Then
the cell is dead
Test case 3
Given
a live cell with 2 or 3 live neighbors
When
I calculate the next generation
Then
the cell is dead.
Test case 4
Given
a dead cell with exactly three live neighbors
When
I calculate the next generation
Then
the cell is aliv...
Спасибо за внимание!
Литература:
● Working Effectively with Legacy Code, Michael Feathers
● Refactoring: Improving the Des...
Upcoming SlideShare
Loading in …5
×

kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java

238 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
238
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java

  1. 1. Test Driven Development #kranonit S11E01 13.07.2013 Andrey Ponomarev linkedin.com/in/AndreyPonomarev Andrey.Ponomarev@gmail.com
  2. 2. Обо мне Андрей Пономарёв ● 11 лет программирую за деньги ● Sun Certified Java Programmer ● Team Lead linkedin.com/in/AndreyPonomarev
  3. 3. Disclaimer #1 Это не тренинг по Java! ЦЕЛЕВАЯ АУДИТОРИЯ ● Junior и Middle разработчики, ● с опытом работы с Java больше 1 года, ● с пониманием принципов ООП, ● уверенным владением IDE ● элементарным знанием английского.
  4. 4. Disclaimer #2 TRUE FALSE Java разработчик Опытный программист Профессиональный тренер Опытный докладчик
  5. 5. План 1. Болтовня для тех, кто пришел просто послушать 2. Практический пример 3. Немного болтовни для разнообразия 4. Перерыв 5. Парное программирование до конца дня для тех, кто пришел потренироваться
  6. 6. Немного Википедии Разработка через тестирование - техника разработки ПО, которая основывается на повторении очень коротких циклов разработки: 1. пишется тест, покрывающий желаемое изменение, 2. пишется код, который позволит пройти тест, 3. проводится рефакторинг нового кода к соответствующим стандартам.
  7. 7. TDD мантра ● Красный ● Зеленый ● Рефакторинг
  8. 8. В интернетах пишут... "Я делаю продукты 8 лет без всякого TDD, и не имею особенных проблем" "ТДД - это для теоретиков. В реальных проектах оно не используется." "Мне платят за функционал, а не за тесты" "TDD - это мода. Как пришло - так и уйдёт."
  9. 9. Есть мнение что... "Использование TDD увеличивает время разработки"
  10. 10. Есть мнение что... "Использование TDD увеличивает время разработки" Правда Согласно исследованиям, время разработки увеличивается на 15-30%. ("Evaluating the Efficacy of Test-Driven Development: Industrial Case Studies", Microsoft)
  11. 11. ● Бег по утрам ● Набор текста вслепую ● Езда на велосипеде Потому что... ● Трудно начать ● Выгода не очевидна ● Требуется дисциплина ● Окупается в будущем Применять TDD похоже на ...
  12. 12. Есть мнение что... "Использование TDD улучшает качество кода"
  13. 13. Есть мнение что... "Использование TDD улучшает качество кода" Правда Согласно исследованиям, количество дефектов уменьшается на 40%. (“Test-Driven Development as a Defect-Reduction Practice”, IBM)
  14. 14. Результаты исследования "Evaluating the Efficacy of Test-Driven Development: Industrial Case Studies", Microsoft
  15. 15. Зачем TDD ● Лучше код ● Борьба со страхом ● Быстрая обратная связь
  16. 16. TDD ката
  17. 17. Самые важные принципы Позволяющие радикально снизить количество дефектов и ускорить разработку
  18. 18. Самые важные принципы Позволяющие радикально снизить количество дефектов и ускорить разработку KISS Keep it simple stupid YAGNI You aren't gonna need it
  19. 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
  20. 20. StringCalculator Step 2 Allow the Add method to handle an unknown amount of numbers
  21. 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. 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. 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. 24. Тестирование функций без побочных эффектов assertEquals(0, Math.sqrt(0)); assertEquals(1, Math.sqrt(1)); assertEquals(10, Math.sqrt(100));
  25. 25. Тестирование состояния // Given HashSet<String> set = new HashSet<>(); // When set.add("test"); // Then assertEquals(1, set.size());
  26. 26. Тестирование взаимодействия
  27. 27. Тестирование взаимодействия (продолжение) // Setup DocValidator validator = mock(DocValidator.class); DocRepository repo = mock(DocRepository.class); DocService service = new DocService(validator, repo); Document doc = new Document();
  28. 28. Тестирование взаимодействия (продолжение) // Given when(validator.validate(doc)).thenReturn(true); // When service.register(doc); // Then verify(repo.save(doc));
  29. 29. Тестирование исключений @Rule public ExpectedException ex = ExpectedException.none(); // Given Document invalidDoc = createInvalidDoc(); // Expect ex.expect(ValidationException.class); // When service.register(invalidDoc);
  30. 30. Перерыв
  31. 31. Conway's Game of Life
  32. 32. Домен ● Мир - двумерное пространство, состоящее из клеток ● Клетка может быть «живой» или «мёртвой» ● У каждой клетки есть 8 соседей ● В каждом поколении клетки умирают или рождаются по особым правилам
  33. 33. Правила 1. Если у клетки меньше двух соседей, она умирает 2. Если у клетки 2 или 3 соседа, она продолжает жить 3. Если у клетки больше 3 соседей, она умирает от перенаселения 4. Если у мёртвой клетки, рядом 3 живые клетки, то в ней зарождается жизнь
  34. 34. Пример 1 поколение 2 поколение 3 поколение
  35. 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. 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. 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. 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. 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

×