bdd

113
Behavior-Driven Development Бибичев Андрей март 2010 г.

Upload: andrey-bibichev

Post on 15-Nov-2014

2.008 views

Category:

Technology


2 download

DESCRIPTION

Presentation from MS QA Day, March 2010

TRANSCRIPT

Page 1: BDD

Behavior-Driven

Development

Бибичев Андреймарт 2010 г.

Page 3: BDD

«Вы любите Unit-тесты,как люблю их я?»

Page 4: BDD

Сказочка

Page 5: BDD
Page 6: BDD

MyStack

+ Count : int

+ Push(v : int)+ Pop() : int+ Peek() : int

Page 7: BDD
Page 8: BDD
Page 9: BDD
Page 10: BDD
Page 11: BDD
Page 12: BDD
Page 13: BDD
Page 14: BDD
Page 15: BDD
Page 16: BDD
Page 17: BDD
Page 18: BDD
Page 19: BDD
Page 20: BDD
Page 21: BDD
Page 22: BDD
Page 23: BDD
Page 24: BDD
Page 25: BDD
Page 26: BDD
Page 27: BDD
Page 28: BDD
Page 29: BDD
Page 30: BDD
Page 31: BDD
Page 32: BDD
Page 33: BDD
Page 34: BDD

Симптоматическое лечение

Builder-ы / Custom Assert-ы

Page 35: BDD
Page 36: BDD

• тестовые методы называются в стиле TestSomeMethod и являют собой длинную простыню хитросплетений разных сценариев для проверки работы одного метода;

• значительную часть тестовых методов занимает подготовка и настройка окружения, так что тяжело понять, что же именно проверяется;

• попытки поместить создание всего окружения в SetUp-методы делают тестовые классы путанными, а отдельные тестовые методы зависимыми друг от друга;

• рекомендация держать ровно один Assert на тест не выполняется или приводит к огромному дублированию кода;

• при изменении требований не так-то легко найти какие тесты нужно поправить, и даже найдя их, еще нужно сообразить что и как поправить в длинном витьеватом коде;

• что делать, если у нескольких тестов есть общая часть, - как ее следует оформить?

• как "правильно" называть тесты, как их группировать в тестовые классы?

• как соотносятся между собой acceptance-критерии выполнения требований и набор unit-тестов?

Page 37: BDD

FLUENT BUILDER-Ы

Page 38: BDD
Page 39: BDD
Page 40: BDD
Page 41: BDD

Их можно объединять в целые «потемкинские деревни»

Page 42: BDD
Page 43: BDD
Page 44: BDD

Главное:не делать больших «деревень»,

лучше иметь N маленьких

Page 45: BDD

CUSTOM ASSERT-Ы

Page 46: BDD
Page 47: BDD
Page 48: BDD
Page 49: BDD
Page 50: BDD

ЛАКОНИЧНЫЕ ТЕСТЫБЕЗ ВЕТВЛЕНИЙ И ЦИКЛОВ

Ваша цель -

Page 51: BDD

BDD

Разработка на основе поведения

Page 52: BDD

Итак, еще остались существенные проблемы:

• MyClass

– MethodA

– MethodB

– MethodC

• MyClassTests

– TestMethodA

– TestMethodB

– TestMethodC

+ тестировщики+ менеджеры

Page 53: BDD

MyStack

+ Count : int

+ Push(v : int)+ Pop() : int+ Peek() : int

Page 54: BDD

Давайте попробуем описать поведение класса MyStack

• «класс MyStack должен (should):»

– создавать пустой стек

– инициировать исключение при попытке извлечь элемент из пустого стека

– извлекать последний положенный в него элемент

– извлекать все положенные в него элементы в обратном порядке

Page 55: BDD
Page 56: BDD

• «класс MyStack должен (should):»

– создавать пустой стек

GIVEN an empty stack ДАН пустой стек

WHEN Count property is asked КОГДА запрашивается Count

THEN it returns zero ТОГДА возвращается 0

– инициировать исключение при попытке извлечь элемент из пустого стека

GIVEN an empty stack ДАН пустой стек

WHEN Pop() method is called КОГДА вызывается Pop()

THEN exception is raised ТОГДА возникает исключение

Page 57: BDD

• «класс MyStack должен (should):»

– извлекать последний положенный в него элемент

GIVEN an empty stack

and some integer item

WHEN this item is pushed

and Pop() is called

THEN it returns the last item that’s pushed

and it removes item from the stack

and further Pop() call throws exception

Page 58: BDD
Page 59: BDD

Экстремально важный шаблон тестового метода

Page 60: BDD

Дано:

арбуз + гиря 1 кг = гиря 6 кгарбуз = ?

Решение:

x + 1 = 6x = 6 – 1 = 5

Ответ: 5 кг

Page 61: BDD

Март 2006Журнал «Better Software»Статья «Introducing BDD»

Dan North

Page 62: BDD
Page 63: BDD

«Test method names should be sentences»

«A simple sentence template keeps test methods focused. This sentence template –The class should do something»

«“Behavior” is a more useful word than “test”»

«What’s the next most important thing the system doesn’t do?»

Page 64: BDD

От пользовательских историйк описанию поведения

• As [role]I want/can [action]So that [result]

• Как [роль]Я хочу/могу [действие]Так что [результат]

• Given [initial context]When [event/action]Then [ensure some outcomes]

• Дано [начальный контекст]Когда [событие/действие]Тогда [конкретный результат]

Page 65: BDD

Пример: калькулятор

• Как тугой на головуЯ хочу иметь возможность складывать, вычитать, делить и умножать два числаЧтобы видеть результат и не считать в уме

Page 66: BDD

Пример: калькулятор

• Дан калькулятор и два числа – «2» и «2»Когда вводим первое число, «плюс», второе числоТогда видим результат «4»

• Дан калькулятор и два числа – «123» и «23»Когда вводим первое число, «минус», второе числоТогда видим результат «100»

Page 67: BDD

Сценарии

Поведение

Page 68: BDD

Новые интересные метрики

• Количество описанных «Поведений»

• Процент автоматизированных тестов на «Поводение» по отношению к общему числу описанных «Поведений»

• Отношение количества «Поведений» к количеству Пользовательских историй или фич

Page 69: BDD
Page 70: BDD

Ноябрь 2009Конференция «Agile Specifications,

BDD and Testing eXchange»Dan North

«BDD is a second-generation, outside-in, pull-based, multiple-stakeholder, multiple-scale, high-automation, agile methodology. It describes a cycle of interactions with well- defined outputs, resulting in the delivery of working, tested software that matters.»

Page 71: BDD

Agile 2.0 ?

Page 72: BDD

Связь с TDD и DDD

Page 73: BDD

TEST-DRIVEN DEVELOPMENT

Page 74: BDD

Написание Unit-тестов

≠Test-Driven Development

Page 75: BDD
Page 76: BDD

Цикл разработки в TDD

RED

GREENREFACTOR

Написание неработающего тестадля новой функциональности

Пишем ровно столько кода,чтобы тест прошел

Рефакторим код, чтобытесты продолжили проходить,

а код стал чистым

Page 77: BDD

Традиционный цикл разработки

CODING

COMPILINGDEBUGING

Пишем сразу заметныйкусок функциональности

Добиваемсякомпилируемости

Отлаживаем код,ловим и исправляемповерхностные баги

Page 78: BDD

Написание тестовс использованием

*Unit-фреймворков

≠Unit-тестирование(в строгом смысле)

Page 79: BDD

Интеграционныетесты

Модульныетесты

(в строгом смысле)

Mock-и,Stub-ы

Тестируем как прозрачный

ящик

Тестируем как черный ящик

Page 80: BDD

Фун

кци

он

альн

ые

тест

ы

Наг

руз

очн

ые

тест

ы

Стр

есс-

тест

ы

Page 81: BDD

BDD – TDD done well?

«I believe this is more than just ‘doing TDD well’.I think it’s ‘doing TDD and a number of other practices

related to professional software development well’.The five practices above might

conceivably be done in addition to TDD,

but they’re not part of any definition of TDD I’ve seen.»

Page 82: BDD

DOMAIN-DRIVEN DESIGN

Page 83: BDD

История

2004 годEric Evans

«Domain-Driven Design - Tackling Complexity in the Heart of Software»

Page 84: BDD

Domain (словарь)

• наследственная собственность; имение, поместье; земли; владение

• территория, зона, область, район (отмеченные некоторыми физическими особенностями)

• сфера (интересов), поле (деятельности), область (знаний)

• область определения (мат.)

e.g. DNS

Домен поля таблицы в БД

В данном случае этот смысл

Page 85: BDD

Business Domain

Т.е. это о

и

Business Logic

Предметной области

Бизнес-логики

Page 86: BDD

DDD

Центральная роль в мышлении,

проектировании, реализации

Page 87: BDD

Три аспекта DDD

Page 88: BDD
Page 89: BDD
Page 90: BDD
Page 91: BDD

• Даны шаг бегунка в исходном состояниии текущий пользователь – «Петров»

Когда для этого шага выполняется действие «Подтвердить»

Тогда сам шаг переходит в состояние «+»и автором подтверждения помечается «Петров»

Page 92: BDD

• Даны шаг бегунка в состоянии «?»и в бегунке есть следующий шаг в исходном состояниии текущий пользователь – «Петров»

Когда для этого шага выполняется действие «Подтвердить»

Тогда сам шаг переходит в состояние «+»и автором подтверждения помечается «Петров»и следующий шаг бегунка переходит в состояние «?»

Page 93: BDD
Page 94: BDD

ИТОГО ПО *DD

Page 95: BDD

DDD

BDDTDD

Синергетическийэффект

Page 96: BDD

Фреймворки

Page 98: BDD
Page 100: BDD
Page 102: BDD
Page 104: BDD
Page 105: BDD

Своими руками

Page 106: BDD
Page 107: BDD
Page 108: BDD
Page 109: BDD

Заключение

Page 110: BDD

vs.

[TestMethod]

void Test…()

{

// Arrange

// Action

// Assertion

}

[TestMethod]

void Should…()

{

// GIVEN

// WHEN

// THEN

}

Page 111: BDD

Гипотезалингвистической относительности

• aka «гипотеза Сепира-Уорфа»

• существующие в сознании человека системы понятий, а, следовательно, и существенные особенности его мышления определяются тем конкретным языком, носителем которого этот человек является

Page 112: BDD

Аналитик

РазработчикТестировщик

GUIМодель

Поведение модели

Page 113: BDD

Спасибо за внимание!

[email protected]://www.google.com/profiles/biBIGone