kranonit s11e01 Андрей Пономарёв: Тренинг по tdd в java

39
Test Driven Development #kranonit S11E01 13.07.2013 Andrey Ponomarev linkedin.com/in/AndreyPonomarev [email protected]

Upload: krivoy-rog-it-community

Post on 05-Dec-2014

330 views

Category:

Documents


3 download

DESCRIPTION

 

TRANSCRIPT

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

Обо мне

Андрей Пономарёв● 11 лет программирую за деньги● Sun Certified Java Programmer● Team Leadlinkedin.com/in/AndreyPonomarev

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

Disclaimer #1

Это не тренинг по Java!

ЦЕЛЕВАЯ АУДИТОРИЯ● Junior и Middle разработчики, ● с опытом работы с Java больше 1 года, ● с пониманием принципов ООП, ● уверенным владением IDE ● элементарным знанием английского.

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

Disclaimer #2TRUE FALSE

Java разработчик

Опытный программист

Профессиональный тренер

Опытный докладчик

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

План

1. Болтовня для тех, кто пришел просто послушать

2. Практический пример3. Немного болтовни для разнообразия4. Перерыв5. Парное программирование до конца дня

для тех, кто пришел потренироваться

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

Немного Википедии

Разработка через тестирование - техника разработки ПО, которая основывается на повторении очень коротких циклов разработки: 1. пишется тест, покрывающий желаемое

изменение,2. пишется код, который позволит пройти

тест, 3. проводится рефакторинг нового кода к

соответствующим стандартам.

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

TDD мантра

● Красный● Зеленый● Рефакторинг

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

В интернетах пишут...

"Я делаю продукты 8 лет без всякого TDD, и не имею особенных проблем"

"ТДД - это для теоретиков. В реальных проектах оно не используется."

"Мне платят за функционал, а не за тесты"

"TDD - это мода. Как пришло - так и уйдёт."

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

Есть мнение что...

"Использование TDD увеличивает время разработки"

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

Есть мнение что...

"Использование TDD увеличивает время разработки"

Правда

Согласно исследованиям, время разработки увеличивается на 15-30%.("Evaluating the Efficacy of Test-Driven Development: Industrial Case Studies", Microsoft)

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

● Бег по утрам● Набор текста вслепую● Езда на велосипеде

Потому что...● Трудно начать● Выгода не очевидна● Требуется дисциплина● Окупается в будущем

Применять TDD похоже на ...

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

Есть мнение что...

"Использование TDD улучшает качество кода"

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

Есть мнение что...

"Использование TDD улучшает качество кода"

Правда

Согласно исследованиям, количество дефектов уменьшается на 40%.(“Test-Driven Development as a Defect-Reduction Practice”, IBM)

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

Результаты исследования

"Evaluating the Efficacy of Test-Driven Development: Industrial Case Studies", Microsoft

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

Зачем TDD

● Лучше код● Борьба со страхом● Быстрая обратная связь

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

TDD ката

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

Самые важные принципы

Позволяющие радикально снизить количество дефектов и ускорить разработку

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

Самые важные принципы

Позволяющие радикально снизить количество дефектов и ускорить разработку

KISSKeep it simple stupid

YAGNIYou aren't gonna need it

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

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

StringCalculatorStep 2

Allow the Add method to handle an unknown amount of numbers

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

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

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

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

Тестирование функций без побочных эффектов

assertEquals(0, Math.sqrt(0));assertEquals(1, Math.sqrt(1));assertEquals(10, Math.sqrt(100));

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

Тестирование состояния// GivenHashSet<String> set = new HashSet<>();

// Whenset.add("test");

// ThenassertEquals(1, set.size());

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

Тестирование взаимодействия

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

Тестирование взаимодействия (продолжение)

// 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

Тестирование взаимодействия (продолжение)

// Givenwhen(validator.validate(doc)).thenReturn(true);

// Whenservice.register(doc);

// Thenverify(repo.save(doc));

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

Тестирование исключений@Rulepublic ExpectedException ex = ExpectedException.none();

// GivenDocument invalidDoc = createInvalidDoc();

// Expectex.expect(ValidationException.class);

// Whenservice.register(invalidDoc);

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

Перерыв

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

Conway's Game of Life

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

Домен

● Мир - двумерное пространство, состоящее из клеток

● Клетка может быть «живой» или «мёртвой»

● У каждой клетки есть 8 соседей

● В каждом поколении клетки умирают или рождаются по особым правилам

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

Правила

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

2. Если у клетки 2 или 3 соседа, она продолжает жить

3. Если у клетки больше 3 соседей, она умирает от перенаселения

4. Если у мёртвой клетки, рядом 3 живые клетки, то в ней зарождается жизнь

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

Пример

1 поколение

2 поколение

3 поколение

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

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

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

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

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

Спасибо за внимание!Литература:● 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]