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

Post on 05-Dec-2014

304 Views

Category:

Documents

3 Downloads

Preview:

Click to see full reader

DESCRIPTION

 

TRANSCRIPT

Обо мне

Андрей Пономарёв● 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

Вопросы?Andrey.Ponomarev@gmail.com

top related