kranonit s11e01 Андрей Пономарёв: Тренинг по tdd в java
DESCRIPTION
TRANSCRIPT
![Page 1: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/1.jpg)
Test Driven Development
#kranonit S11E01 13.07.2013
Andrey Ponomarevlinkedin.com/in/[email protected]
![Page 2: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/2.jpg)
Обо мне
Андрей Пономарёв● 11 лет программирую за деньги● Sun Certified Java Programmer● Team Leadlinkedin.com/in/AndreyPonomarev
![Page 3: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/3.jpg)
Disclaimer #1
Это не тренинг по Java!
ЦЕЛЕВАЯ АУДИТОРИЯ● Junior и Middle разработчики, ● с опытом работы с Java больше 1 года, ● с пониманием принципов ООП, ● уверенным владением IDE ● элементарным знанием английского.
![Page 4: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/4.jpg)
Disclaimer #2TRUE FALSE
Java разработчик
Опытный программист
Профессиональный тренер
Опытный докладчик
![Page 5: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/5.jpg)
План
1. Болтовня для тех, кто пришел просто послушать
2. Практический пример3. Немного болтовни для разнообразия4. Перерыв5. Парное программирование до конца дня
для тех, кто пришел потренироваться
![Page 6: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/6.jpg)
Немного Википедии
Разработка через тестирование - техника разработки ПО, которая основывается на повторении очень коротких циклов разработки: 1. пишется тест, покрывающий желаемое
изменение,2. пишется код, который позволит пройти
тест, 3. проводится рефакторинг нового кода к
соответствующим стандартам.
![Page 7: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/7.jpg)
TDD мантра
● Красный● Зеленый● Рефакторинг
![Page 8: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/8.jpg)
В интернетах пишут...
"Я делаю продукты 8 лет без всякого TDD, и не имею особенных проблем"
"ТДД - это для теоретиков. В реальных проектах оно не используется."
"Мне платят за функционал, а не за тесты"
"TDD - это мода. Как пришло - так и уйдёт."
![Page 9: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/9.jpg)
Есть мнение что...
"Использование TDD увеличивает время разработки"
![Page 10: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/10.jpg)
Есть мнение что...
"Использование TDD увеличивает время разработки"
Правда
Согласно исследованиям, время разработки увеличивается на 15-30%.("Evaluating the Efficacy of Test-Driven Development: Industrial Case Studies", Microsoft)
![Page 11: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/11.jpg)
● Бег по утрам● Набор текста вслепую● Езда на велосипеде
Потому что...● Трудно начать● Выгода не очевидна● Требуется дисциплина● Окупается в будущем
Применять TDD похоже на ...
![Page 12: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/12.jpg)
Есть мнение что...
"Использование TDD улучшает качество кода"
![Page 13: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/13.jpg)
Есть мнение что...
"Использование TDD улучшает качество кода"
Правда
Согласно исследованиям, количество дефектов уменьшается на 40%.(“Test-Driven Development as a Defect-Reduction Practice”, IBM)
![Page 14: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/14.jpg)
Результаты исследования
"Evaluating the Efficacy of Test-Driven Development: Industrial Case Studies", Microsoft
![Page 15: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/15.jpg)
Зачем TDD
● Лучше код● Борьба со страхом● Быстрая обратная связь
![Page 16: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/16.jpg)
TDD ката
![Page 17: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/17.jpg)
Самые важные принципы
Позволяющие радикально снизить количество дефектов и ускорить разработку
![Page 18: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/18.jpg)
Самые важные принципы
Позволяющие радикально снизить количество дефектов и ускорить разработку
KISSKeep it simple stupid
YAGNIYou aren't gonna need it
![Page 19: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/19.jpg)
StringCalculatorStep 1
Create a simple String calculator with a methodint 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
![Page 20: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/20.jpg)
StringCalculatorStep 2
Allow the Add method to handle an unknown amount of numbers
![Page 21: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/21.jpg)
StringCalculatorStep 3
Allow the Add method to handle new lines between numbers (instead of commas).
● the following input is ok: "1\n2,3" (will equal 6)● the following input is NOT ok: "1,\n" (not need
to prove it - just clarifying)
![Page 22: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/22.jpg)
StringCalculatorStep 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
![Page 23: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/23.jpg)
StringCalculatorStep 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
![Page 24: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/24.jpg)
Тестирование функций без побочных эффектов
assertEquals(0, Math.sqrt(0));assertEquals(1, Math.sqrt(1));assertEquals(10, Math.sqrt(100));
![Page 25: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/25.jpg)
Тестирование состояния// GivenHashSet<String> set = new HashSet<>();
// Whenset.add("test");
// ThenassertEquals(1, set.size());
![Page 26: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/26.jpg)
Тестирование взаимодействия
![Page 27: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/27.jpg)
Тестирование взаимодействия (продолжение)
// SetupDocValidator validator = mock(DocValidator.class);
DocRepository repo = mock(DocRepository.class);
DocService service = new DocService(validator, repo);
Document doc = new Document();
![Page 28: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/28.jpg)
Тестирование взаимодействия (продолжение)
// Givenwhen(validator.validate(doc)).thenReturn(true);
// Whenservice.register(doc);
// Thenverify(repo.save(doc));
![Page 29: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/29.jpg)
Тестирование исключений@Rulepublic ExpectedException ex = ExpectedException.none();
// GivenDocument invalidDoc = createInvalidDoc();
// Expectex.expect(ValidationException.class);
// Whenservice.register(invalidDoc);
![Page 30: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/30.jpg)
Перерыв
![Page 31: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/31.jpg)
Conway's Game of Life
![Page 32: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/32.jpg)
Домен
● Мир - двумерное пространство, состоящее из клеток
● Клетка может быть «живой» или «мёртвой»
● У каждой клетки есть 8 соседей
● В каждом поколении клетки умирают или рождаются по особым правилам
![Page 33: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/33.jpg)
Правила
1. Если у клетки меньше двух соседей, она умирает
2. Если у клетки 2 или 3 соседа, она продолжает жить
3. Если у клетки больше 3 соседей, она умирает от перенаселения
4. Если у мёртвой клетки, рядом 3 живые клетки, то в ней зарождается жизнь
![Page 34: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/34.jpg)
Пример
1 поколение
2 поколение
3 поколение
![Page 35: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/35.jpg)
Test case 1
Given a live cell with fewer than 2 live neighbors
When I calculate the next generation,
Then the cell is dead.
![Page 36: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/36.jpg)
Test case 2
Given a live cell with more than 3 live neighbors
When I calculate the next generation
Then the cell is dead
![Page 37: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/37.jpg)
Test case 3
Given a live cell with 2 or 3 live neighbors
When I calculate the next generation
Then the cell is dead.
![Page 38: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/38.jpg)
Test case 4
Givena dead cell with exactly three live neighbors
WhenI calculate the next generation
Thenthe cell is alive.
![Page 39: kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java](https://reader034.vdocuments.mx/reader034/viewer/2022042512/54849379b47959e20c8b4c14/html5/thumbnails/39.jpg)
Спасибо за внимание!Литература:● 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
Вопросы[email protected]