Test Driven Development
#kranonit S11E01 13.07.2013
Andrey Ponomarevlinkedin.com/in/[email protected]
Обо мне
Андрей Пономарёв● 11 лет программирую за деньги● Sun Certified Java Programmer● Team Leadlinkedin.com/in/AndreyPonomarev
Disclaimer #1
Это не тренинг по Java!
ЦЕЛЕВАЯ АУДИТОРИЯ● Junior и Middle разработчики, ● с опытом работы с Java больше 1 года, ● с пониманием принципов ООП, ● уверенным владением IDE ● элементарным знанием английского.
Disclaimer #2TRUE FALSE
Java разработчик
Опытный программист
Профессиональный тренер
Опытный докладчик
План
1. Болтовня для тех, кто пришел просто послушать
2. Практический пример3. Немного болтовни для разнообразия4. Перерыв5. Парное программирование до конца дня
для тех, кто пришел потренироваться
Немного Википедии
Разработка через тестирование - техника разработки ПО, которая основывается на повторении очень коротких циклов разработки: 1. пишется тест, покрывающий желаемое
изменение,2. пишется код, который позволит пройти
тест, 3. проводится рефакторинг нового кода к
соответствующим стандартам.
TDD мантра
● Красный● Зеленый● Рефакторинг
В интернетах пишут...
"Я делаю продукты 8 лет без всякого TDD, и не имею особенных проблем"
"ТДД - это для теоретиков. В реальных проектах оно не используется."
"Мне платят за функционал, а не за тесты"
"TDD - это мода. Как пришло - так и уйдёт."
Есть мнение что...
"Использование TDD увеличивает время разработки"
Есть мнение что...
"Использование TDD увеличивает время разработки"
Правда
Согласно исследованиям, время разработки увеличивается на 15-30%.("Evaluating the Efficacy of Test-Driven Development: Industrial Case Studies", Microsoft)
● Бег по утрам● Набор текста вслепую● Езда на велосипеде
Потому что...● Трудно начать● Выгода не очевидна● Требуется дисциплина● Окупается в будущем
Применять TDD похоже на ...
Есть мнение что...
"Использование TDD улучшает качество кода"
Есть мнение что...
"Использование TDD улучшает качество кода"
Правда
Согласно исследованиям, количество дефектов уменьшается на 40%.(“Test-Driven Development as a Defect-Reduction Practice”, IBM)
Результаты исследования
"Evaluating the Efficacy of Test-Driven Development: Industrial Case Studies", Microsoft
Зачем TDD
● Лучше код● Борьба со страхом● Быстрая обратная связь
TDD ката
Самые важные принципы
Позволяющие радикально снизить количество дефектов и ускорить разработку
Самые важные принципы
Позволяющие радикально снизить количество дефектов и ускорить разработку
KISSKeep it simple stupid
YAGNIYou aren't gonna need it
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
StringCalculatorStep 2
Allow the Add method to handle an unknown amount of numbers
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)
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
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
Тестирование функций без побочных эффектов
assertEquals(0, Math.sqrt(0));assertEquals(1, Math.sqrt(1));assertEquals(10, Math.sqrt(100));
Тестирование состояния// GivenHashSet<String> set = new HashSet<>();
// Whenset.add("test");
// ThenassertEquals(1, set.size());
Тестирование взаимодействия
Тестирование взаимодействия (продолжение)
// SetupDocValidator validator = mock(DocValidator.class);
DocRepository repo = mock(DocRepository.class);
DocService service = new DocService(validator, repo);
Document doc = new Document();
Тестирование взаимодействия (продолжение)
// Givenwhen(validator.validate(doc)).thenReturn(true);
// Whenservice.register(doc);
// Thenverify(repo.save(doc));
Тестирование исключений@Rulepublic ExpectedException ex = ExpectedException.none();
// GivenDocument invalidDoc = createInvalidDoc();
// Expectex.expect(ValidationException.class);
// Whenservice.register(invalidDoc);
Перерыв
Conway's Game of Life
Домен
● Мир - двумерное пространство, состоящее из клеток
● Клетка может быть «живой» или «мёртвой»
● У каждой клетки есть 8 соседей
● В каждом поколении клетки умирают или рождаются по особым правилам
Правила
1. Если у клетки меньше двух соседей, она умирает
2. Если у клетки 2 или 3 соседа, она продолжает жить
3. Если у клетки больше 3 соседей, она умирает от перенаселения
4. Если у мёртвой клетки, рядом 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
Givena dead cell with exactly three live neighbors
WhenI calculate the next generation
Thenthe cell is alive.
Спасибо за внимание!Литература:● 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]