bdd

Post on 15-Nov-2014

2.008 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

Presentation from MS QA Day, March 2010

TRANSCRIPT

Behavior-Driven

Development

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

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

Сказочка

MyStack

+ Count : int

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

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

Builder-ы / Custom Assert-ы

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

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

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

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

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

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

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

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

FLUENT BUILDER-Ы

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

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

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

CUSTOM ASSERT-Ы

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

Ваша цель -

BDD

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

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

• MyClass

– MethodA

– MethodB

– MethodC

• MyClassTests

– TestMethodA

– TestMethodB

– TestMethodC

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

MyStack

+ Count : int

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

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

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

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

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

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

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

• «класс 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 ТОГДА возникает исключение

• «класс 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

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

Дано:

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

Решение:

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

Ответ: 5 кг

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

Dan North

«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?»

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

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

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

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

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

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

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

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

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

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

Сценарии

Поведение

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

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

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

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

Ноябрь 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.»

Agile 2.0 ?

Связь с TDD и DDD

TEST-DRIVEN DEVELOPMENT

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

≠Test-Driven Development

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

RED

GREENREFACTOR

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

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

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

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

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

CODING

COMPILINGDEBUGING

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

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

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

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

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

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

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

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

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

Mock-и,Stub-ы

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

ящик

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

Фун

кци

он

альн

ые

тест

ы

Наг

руз

очн

ые

тест

ы

Стр

есс-

тест

ы

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.»

DOMAIN-DRIVEN DESIGN

История

2004 годEric Evans

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

Domain (словарь)

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

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

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

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

e.g. DNS

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

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

Business Domain

Т.е. это о

и

Business Logic

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

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

DDD

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

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

Три аспекта DDD

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

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

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

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

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

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

ИТОГО ПО *DD

DDD

BDDTDD

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

Фреймворки

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

Заключение

vs.

[TestMethod]

void Test…()

{

// Arrange

// Action

// Assertion

}

[TestMethod]

void Should…()

{

// GIVEN

// WHEN

// THEN

}

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

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

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

Аналитик

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

GUIМодель

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

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

biBIGone@gmail.comhttp://www.google.com/profiles/biBIGone

top related