Содержание

Слайд 2

3

Определение
Разработка через тестирование (англ. test-driven development) —
техника программирования, при которой модульные тесты

3 Определение Разработка через тестирование (англ. test-driven development) — техника программирования, при
для
программы или ее фрагмента пишутся до самой программы и, по
существу, управляют ее разработкой.
Методика:



Пишем новый код только тогда, когда автоматический тест не
сработал.
Удаляем дублирование

Слайд 3

4

Цикл разработки (кратко)

Красный — напишите небольшой тест, который не работает, а возможно,

даже

4 Цикл разработки (кратко) Красный — напишите небольшой тест, который не работает,
не компилируется.

Зеленый — заставьте тест работать как можно быстрее, при этом не
думайте о правильности дизайна и чистоте кода. Напишите ровно
столько кода, чтобы тест сработал.

Рефакторинг — удалите из написанного кода любое дублирование.

Красный — зеленый — рефакторинг

Рефакторинг — процесс полного или частичного преобразования
внутренней структуры программы при сохранении ее внешнего
поведения.

Слайд 4

5

Цикл разработки (схема)

5 Цикл разработки (схема)

Слайд 5

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

1.
2.
3.
4.

Из репозитория извлекается программная система, находящаяся в
согласованном состоянии, когда весь набор

Цикл разработки 1. 2. 3. 4. Из репозитория извлекается программная система, находящаяся
модульных тестов выполняется
успешно.
Добавляется новый тест. Он может состоять в проверке, реализует ли
система некоторое новое поведение или содержит ли некоторую ошибку, о
которой недавно стало известно.
Успешно выполняется весь набор тестов, кроме нового теста, который
выполняется неуспешно. Этот шаг необходим для проверки самого теста -
включен ли он в общую систему тестирования и правильно ли отражает
новое требование к системе, которому она, естественно, еще не
удовлетворяет.
Программа изменяется с тем, чтобы как можно скорее выполнялись все
тесты. Нужно добавить самое простое решение, удовлетворяющее новому
тесту, и одновременно с этим не испортить существующие тесты. Большая
часть нежелательных побочных и отдаленных эффектов от вносимых в
программу изменений отслеживается именно на этом этапе, с помощью
достаточно полного набора тестов.
6

Слайд 6

Цикл разработки (продолжение)

5.
6.
7.
8.

Весь набор тестов выполняется успешно.
Теперь, когда требуемая в этом цикле

Цикл разработки (продолжение) 5. 6. 7. 8. Весь набор тестов выполняется успешно.
функциональность
достигнута самым простым способом, программа подвергается
рефакторингу для улучшения структуры и устранения избыточного,
дублированного кода.
Весь набор тестов выполняется успешно.
Комплект изменений, сделанных в этом цикле в тестах и программе

заносится в репозиторий, после чего программа снова находится в
согласованном состоянии и содержит четко осязаемое улучшение
по сравнению с предыдущим состоянием.
Продолжительность каждого цикла — порядка нескольких минут.
7

Слайд 7

Что дает TDD?

Актуальное описание намерений, дизайна и использования системы
Легкое обнаружение слабых мест

Что дает TDD? Актуальное описание намерений, дизайна и использования системы Легкое обнаружение
в дизайне
Автоматическое регрессионное тестирование
Безопасный рефакторинг
Быстрое обнаружение дефектов

Слайд 8

8

Пример 1. Числа Фибоначчи

Последовательность Фибоначчи определяется
следующим соотношением:

F(n) = F(n – 1) +

8 Пример 1. Числа Фибоначчи Последовательность Фибоначчи определяется следующим соотношением: F(n) =
F(n – 2)

F(1) = 1
F(0) = 0

Требуется написать функцию для определения
n-го члена последовательности

Слайд 9

9

}

Пример 1. (продолжение)
Первый тест
[Test]
public void TestFirstFibonacciNumber()
{
Assert.AreEqual(0, MathUtils.Fibonacci(0));
}
Реализация функции
public class MathUtils
{
public static uint

9 } Пример 1. (продолжение) Первый тест [Test] public void TestFirstFibonacciNumber() {
Fibonacci(uint n)
{
return 0;
}

Слайд 10

10

Пример 1. (продолжение)

10 Пример 1. (продолжение)

Слайд 11

11

Пример 1. (продолжение)

public void TestSecondFibonacciNumber()
{

Assert.AreEqual(1, MathUtils.Fibonacci(1));

}

Проверяем второй член последовательности

11 Пример 1. (продолжение) public void TestSecondFibonacciNumber() { Assert.AreEqual(1, MathUtils.Fibonacci(1)); } Проверяем второй член последовательности

Слайд 12

12

Пример 1. (продолжение)

12 Пример 1. (продолжение)

Слайд 13

13

Пример 1. (продолжение)

public static uint Fibonacci(uint n)
{

if (n == 0)

return 0;

else

return 1;

}

Модифицируем

13 Пример 1. (продолжение) public static uint Fibonacci(uint n) { if (n
функцию

Слайд 14

14

Пример 1. (продолжение)

14 Пример 1. (продолжение)

Слайд 15

15

Пример 1. (продолжение)

public void TestThirdFibonacciNumber()
{

Assert.AreEqual(1, MathUtils.Fibonacci(2));

}

public void TestFourthFibonacciNumber()
{

Assert.AreEqual(2, MathUtils.Fibonacci(3));

}

Добавляем новые тесты, проверяющие
третий

15 Пример 1. (продолжение) public void TestThirdFibonacciNumber() { Assert.AreEqual(1, MathUtils.Fibonacci(2)); } public
и четвертый члены.

Слайд 16

16

Пример 1. (продолжение)

16 Пример 1. (продолжение)

Слайд 17

17

Пример 1. (продолжение)

public static uint Fibonacci(uint n)
{

if (n == 0)

return 0;

else if

17 Пример 1. (продолжение) public static uint Fibonacci(uint n) { if (n
(n == 1)

return 1;

else

return Fibonacci(n - 1) + Fibonacci(n - 2);

}

Модифицируем функцию

Слайд 18

18

Пример 1. (продолжение)

18 Пример 1. (продолжение)

Слайд 19

19

Пример 2. Функция CombinePaths

Требуется реализовать функцию, складывающюю два пути.

Например:

C:\Data\ + MySQL\data.sql =

19 Пример 2. Функция CombinePaths Требуется реализовать функцию, складывающюю два пути. Например:
C:\Data\MySQL\data.sql

Необходимо учесть следующие варианты использования:
1. Разные вариации наличия/отсутствия завершающего и
начального слэша в первом и втором путях соответственно

C:\folder + file.txt
C:\folder + \file.txt
C:\folder\ + file.txt
C:\folder\ + \file.txt

2. Если первый путь пуст

'' + file.txt

3. Если второй путь абсолютный

C:\folder + D:\folder2\file.txt

Слайд 20

20

Пример 2. (продолжение)

type

TCombinePathTests = class(TTestCase)
published

procedure TestCombineSimplePaths;

end;

procedure TCombinePathTests.TestCombineSimplePaths;
begin

CheckEquals(

'C:\file_name.txt',

CombinePaths('C:\', 'file_name.txt')

);
end;

Первый тест

20 Пример 2. (продолжение) type TCombinePathTests = class(TTestCase) published procedure TestCombineSimplePaths; end;

Слайд 21

21

Пример 2. (продолжение)

function CombinePaths(const APath1,

APath2: string): string;

begin

Result := EmptyStr;

end;

Реализация функции

21 Пример 2. (продолжение) function CombinePaths(const APath1, APath2: string): string; begin Result

Слайд 22

22

Пример 2. (продолжение)

22 Пример 2. (продолжение)

Слайд 23

23

Пример 2. (продолжение)

function CombinePaths(const APath1,

APath2: string): string;

begin

Result := APath1 + APath2;

end;

Модифицируем функцию

23 Пример 2. (продолжение) function CombinePaths(const APath1, APath2: string): string; begin Result

Слайд 24

24

Пример 2. (продолжение)

24 Пример 2. (продолжение)

Слайд 25

25

Пример 2. (продолжение)

procedure TCombinePathTests.

TestCombinePathsWithoutTrailingSlash;

begin

CheckEquals(

C:\file_name.txt',

CombinePaths('C:', 'file_name.txt')

);
end;

25 Пример 2. (продолжение) procedure TCombinePathTests. TestCombinePathsWithoutTrailingSlash; begin CheckEquals( C:\file_name.txt', CombinePaths('C:', 'file_name.txt') ); end;

Слайд 26

26

Пример 2. (продолжение)

26 Пример 2. (продолжение)

Слайд 27

27

Пример 2. (продолжение)

function CombinePaths(const APath1,

APath2: string): string;

begin

Result :=

IncludeTrailingPathDelimiter(APath1)+
APath2;

end;

Модифицируем функцию

27 Пример 2. (продолжение) function CombinePaths(const APath1, APath2: string): string; begin Result

Слайд 28

28

Пример 2. (продолжение)

28 Пример 2. (продолжение)

Слайд 29

29

Пример 2. (продолжение)

procedure TCombinePathTests.

TestCombinePathsWithEmptyFirstPath;

begin

CheckEquals(

'file_name.txt',

CombinePaths('', 'file_name.txt')

);
end;

29 Пример 2. (продолжение) procedure TCombinePathTests. TestCombinePathsWithEmptyFirstPath; begin CheckEquals( 'file_name.txt', CombinePaths('', 'file_name.txt') ); end;

Слайд 30

30

Пример 2. (продолжение)

30 Пример 2. (продолжение)

Слайд 31

31

Пример 2. (продолжение)

function CombinePaths(const APath1,

APath2: string): string;

begin

if APath1 = EmptyStr then

Result :=

31 Пример 2. (продолжение) function CombinePaths(const APath1, APath2: string): string; begin if
APath2

else

Result :=

IncludeTrailingPathDelimiter(APath1) +
APath2;

end;

Модифицируем функцию

Слайд 32

32

Пример 2. (продолжение)

32 Пример 2. (продолжение)

Слайд 33

Пример 2. (продолжение)

33

function CombinePaths(const APath1,

APath2: string): string;

begin

if IsAbsolutePath(APath2) or (APath1 = EmptyStr)

Пример 2. (продолжение) 33 function CombinePaths(const APath1, APath2: string): string; begin if
then

Result := APath2

else

Result :=

IncludeTrailingPathDelimiter(APath1) +
DeletePrecedingPathDelimiter(APath2);

end;

Окончательный вариант функции

Слайд 34

Приёмы (паттерны) TDD







Изолированный тест (Isolated Test)
Список тестов (Test List)
Сначала утверждение (Assertion First)
Тестовые

Приёмы (паттерны) TDD ● ● ● ● ● ● Изолированный тест (Isolated
данные (Test Data)
Понятные данные (Evident Data)
Arrange – Act – Assert (AAA)

Слайд 35

Изолированный тест




Если не проходит один тест, другие не
должны свалиться вслед за ним.
Если

Изолированный тест ● ● ● Если не проходит один тест, другие не
тесты изолированы, порядок их
выполнения значения не имеет.
Тесты не должны использовать общие
ресурсы. Общие ресурсы, используемые
тестами, не должны изменяться в ходе
тестирования.

Слайд 36

Список тестов




Запишите все тесты, которые хотите
реализовать, и придерживайтесь этого
списка.
От зелёной полосы всегда

Список тестов ● ● ● Запишите все тесты, которые хотите реализовать, и
должен отделять
один тест, поэтому не стоит сразу
программировать тесты.
Тесты, в которых возникает необходимость
в процессе написания другого, просто
занесите в список.

Слайд 37

Сначала утверждение




Такой подход позволяет мгновенно ответить
на два важных вопроса: «Что считать
правильным результатом

Сначала утверждение ● ● ● Такой подход позволяет мгновенно ответить на два
теста?» и «Каким
образом можно проверить его
правильность?».
Сначала мы определяем, что нужно
получить, а потом создаем необходимые
условия, чтобы assert прошел.
В тесте не должно быть слишком много
утверждений (идеальный вариант ─ один,
максимум ─ три).

Слайд 38

Тестовые данные




Не используйте одинаковые данные. Если
нет разницы между 1 и 2, берите

Тестовые данные ● ● ● Не используйте одинаковые данные. Если нет разницы
1.
Если 3 набора дадут тот же результат, что
и 10, используйте 3.
Используйте реалистичные тестовые
данные.

Слайд 39

Понятные данные




При тестировании должно быть очевидно,
откуда берется тот или иной результат.
Не прячьте

Понятные данные ● ● ● При тестировании должно быть очевидно, откуда берется
вычисления за константами,
так будет понятно, что же нужно
запрограммировать.
Код теста должен читаться с первого раза.

Слайд 40

Понятные данные (пример)

Bank bank = new Bank();

bank.addRate("USD", "GBP", STANDARD_RATE);
bank.commission(STANDARD_COMMISSION);

Money result = bank.convert(new

Понятные данные (пример) Bank bank = new Bank(); bank.addRate("USD", "GBP", STANDARD_RATE); bank.commission(STANDARD_COMMISSION);
Note(100, "USD"), "GBP");
assertEquals(new Note(49.25, "GBP"), result);

Bank bank = new Bank();

bank.addRate("USD", "GBP", 2);
bank.commission(0.015);

Money result=bank.convert(new Note(100, "USD"), "GBP");
assertEquals(new Note(100 / 2 * (1 - 0.015), "GBP"), result);

Или более очевидно:

Слайд 41

Arrange – Act – Assert

[Test]
public void TestTranslate()
{
    // Arrange.
    // Здесь

Arrange – Act – Assert [Test] public void TestTranslate() { // Arrange.
выставляются начальные условия
    ITranslator translator = new EngRusTranslator();
// Act.
    // Отработка тестируемого функционала.
    string result = translator.Translate("Hello, World!");
// Assert.
    // Сверка ожидаемых значений с полученными
    Assert.AreEqual("Привет, Мир!", result);
}

Слайд 42

Arrange – Act – Assert (пример 2)

// Arranging
var annualSalary = 120000M;
var

Arrange – Act – Assert (пример 2) // Arranging var annualSalary =
period = 3; // for a quarter profit
var calc = new SalaryCalculator();
// Acting
var result = calc.CalculateProfit(annualSalary, period);
// Assertion
Assert.IsEqual(40000, result);

Слайд 43

Arrange – Act – Assert

Преимущества использования этого паттерна:
Assert-методы никогда не перемешаются

Arrange – Act – Assert Преимущества использования этого паттерна: Assert-методы никогда не
с Act-методами
Неявное навязывание писать ОДИН Assert на ОДИН тест
Упрощенный рефакторинг, Вам легко будет обнаружить Arrange-блоки, которые можно вынести в SetUp-метод

Слайд 44

Инструменты

unit-тестирования

Инструменты unit-тестирования

Слайд 45

Список инструментов






Java: JUnit;
C++: CppUnit, Boost Test;
Delphi: DUnit;
PHP: PHPUnit;
С#: NUnit.

Полный список:
http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks

Список инструментов ● ● ● ● ● Java: JUnit; C++: CppUnit, Boost

Слайд 46

BDD

BDD (behavior-driven development) — расширение подхода TDD к разработке и тестированию, при

BDD BDD (behavior-driven development) — расширение подхода TDD к разработке и тестированию,
котором особое внимание уделяется поведению системы/модуля в терминах бизнеса(заказчика).
Как правило, такие тесты иллюстрируют и тестируют различные сценарии, которые интересны непосредственно клиенту системы. В связи с этим при составлении таких тестов часто используется фреймворки, обладающие синтаксисом, обеспечивающим читаемость тестов не только программистом, но и представителями заказчика

Слайд 47

На каких принципах базируется TDD?

«Делай проще, дурачок» (keep it simple, stupid, KISS)
«Вам

На каких принципах базируется TDD? «Делай проще, дурачок» (keep it simple, stupid,
это не понадобится» (you ain’t gonna need it, YAGNI)
«Подделай, пока не сделаешь» (fake it till you make it)

Слайд 48

Выводы

Гораздо больше времени уходит на реализацию простого класса, чем это требуется при

Выводы Гораздо больше времени уходит на реализацию простого класса, чем это требуется
написании кода «в лоб» (прямой реализации). Вот чего боятся менеджеры и программисты, которые не владеют TDD
Вы всегда можете сравнить первую и последнюю реализации, используя TDD. Главной разницей будет то, что последняя реализация будет действительно объектно-ориентированной. Вы можете работать с модулем как с независимым объектом, запрашивать его состояние и пытаться исполнить отдельные операторы. Поэтому код, который будет работать с таким классом, сам будет более объектно-ориентированным.

Слайд 49

Выводы

Помимо самого класса вы получите полный набор тестов для него. Для разработчика

Выводы Помимо самого класса вы получите полный набор тестов для него. Для
нет больше преимущества, чем полное покрытие кода тестами. Если тесты пишутся после кода, будет сложно обеспечивать полное покрытие: вы забудете написать тест на какую-нибудь функцию, что-то покажется слишком легким, чтобы писать на него тест и т.д. Такие тесты часто сложные, потому что вы хотите проверить сразу несколько аспектов в одном тесте. Используя TDD, вы получите набор простых понятных тестов, которые будет легко поддерживать.
Вы получите живую документацию на код. Любой может прочитать названия тестовых методов и понять их смысл, цель и поведение. Будет гораздо легче понять код, имея такую информацию, вам не нужно будет отвлекать коллег просьбами объяснить их код.

Слайд 50

Выводы

При использовании TDD легче обдумывать, что вы хотите получить от класса, его

Выводы При использовании TDD легче обдумывать, что вы хотите получить от класса,
поведение и варианты использования. Имея хорошее понимание уже разработанных компонентов, можно понять, как написать более сложные компоненты.
При использовании TDD вы реально оцениваете сложность задачи, всегда знаете, когда нужно закончить. Если у вас нет тестов, у вас часто будет появляться ощущение что все уже написано. А потом окажется, что вам нужно много времени на исправление ошибок и модификацию кода.

Слайд 51

Выводы

Самое главное: уменьшаются зависимости между классами, увеличивается сцепление классов!

Выводы Самое главное: уменьшаются зависимости между классами, увеличивается сцепление классов!

Слайд 52

Вопросы для самостоятельного изучения

В каких задачах методология TDD не применима?
Чем отличаются тесты,

Вопросы для самостоятельного изучения В каких задачах методология TDD не применима? Чем
созданные по методологии TDD, от модульного тестирования? От интеграционного тестирования?
Когда удобно использовать fake- и mock-объекты при использовании TDD?

Слайд 53

Дополнительный материал

Описание терминологии и технологии разработки через тестирование в различных инструментах:
xUnit
Junit
NUnit
CppUnit
DUnit

Дополнительный материал Описание терминологии и технологии разработки через тестирование в различных инструментах:

Слайд 54

xUnit. Терминология





Тестовый метод (test method)
Метод, в котором выполняется проверка работы
тестируемого объекта.
Утверждение (assertion)
Метод

xUnit. Терминология ● ● ● ● Тестовый метод (test method) Метод, в
сравнения ожидаемых и фактических
результатов.
Фикстура уровня метода (method fixture)
Набор операций, выполняемый до и после каждого
тестового метода.
Фикстура уровня класса (class fixture)
Набор операций, выполняемый до и после всех
тестовых методов класса.

Слайд 55

xUnit. Порядок вызова
Class
SetUp

Method
SetUp
Method
SetUp

Test
Method 1
Test
Method 2

Method
TearDown
Method
TearDown
Class
TearDown

xUnit. Порядок вызова Class SetUp Method SetUp Method SetUp Test Method 1

Слайд 56

JUnit 3




JUnit — библиотека для тестирования
программного обеспечения на языке Java.
Создана Кентом Беком

JUnit 3 ● ● ● JUnit — библиотека для тестирования программного обеспечения
и Эриком Гаммой
Берѐт своѐ начало в SUnit (тестовая среда
для Smalltalk)

Слайд 57

JUnit 3. Организация тестов
Класс TestCase
● Разработчик наследует свои классы
тестов от этого класса.

JUnit 3. Организация тестов Класс TestCase ● Разработчик наследует свои классы тестов
Тестовые методы — все методы класса,
имя которых начинается с test.
● Класс TestCase реализует паттерн
Шаблонный Метод (Template Method) и
ссылается на виртуальные методы:




setUp()
runTest()
tearDown()

Слайд 58

JUnit 3. Организация тестов

Класс TestSuite

● Используется для формирования набора

тестов.

● Наборы тестов могут

JUnit 3. Организация тестов Класс TestSuite ● Используется для формирования набора тестов.
включать в себя
одиночные тесты и другие наборы тестов.

● Реализует паттерн Компоновщик

(Composite).

● Разработчику предлагается
переопределять метод suite().

Слайд 59

JUnit 3. Утверждения
Класс Assert
● Содержит специальные методы сравнения





Сравнение на равенство
(assertEquals)
Cравнение на истинность/ложность
(assertTrue/assertFalse)
Сравнение

JUnit 3. Утверждения Класс Assert ● Содержит специальные методы сравнения ● ●
с нулевым указателем
(assertNull и assertNotNull)
Сравнение на идентичность/неидентичность
(assertSame/assertNotSame)


Является базовым классом для TestCase

Слайд 60

JUnit 3. Пример

public class TestGame extends TestCase
{

private Game g;

public void setUp()
{

g =

JUnit 3. Пример public class TestGame extends TestCase { private Game g;
new Game();

}

public void testTwoThrowsNoMark()
{

g.add(5);
g.add(4);

assertEquals(9, g.score());

}
}

Слайд 61

NUnit





NUnit — открытая среда юнит-
тестирования приложений для .NET
(включая платформу Mono).
Портирован с языка

NUnit ● ● ● ● NUnit — открытая среда юнит- тестирования приложений
java и написан на J#.
Новые версии написаны на С# с учѐтом
таких новшеств как атрибуты.
Текущая версия: 2.5.7.

Слайд 62

NUnit. Организация тестов

Для оргнизации тестов используются
атрибуты:

● [Test]

помечает тестовый метод.

● [TestFixture]

помечает класс с

NUnit. Организация тестов Для оргнизации тестов используются атрибуты: ● [Test] помечает тестовый
набором тестов.

● [SetUp], [TearDown]

помечает любую процедуру без

параметров как фикстуру уровня метода.

Слайд 63

NUnit. Утверждения
Класс Assert
● Класс содержит статические методы
проверки фактических значений с
ожидаемыми:






AreEqual, AreNotEqual.
AreSame, AreNotSame.
IsTrue,

NUnit. Утверждения Класс Assert ● Класс содержит статические методы проверки фактических значений
IsFalse.
Greater, GreaterOrEqual, и т.п.
IsNotNull, IsNull.

Слайд 64

NUnit. Пример

[TestFixture]

public class TestGame {

private Game game;

[SetUp]

public void SetUp() {

game = new

NUnit. Пример [TestFixture] public class TestGame { private Game game; [SetUp] public
Game();

}

[Test]

public void TestTwoThrowsNoMark() {

game.Add(5);
game.Add(4);

Assert.AreEqual(9, game.GetScore());

}
}

Слайд 65

NUnit. Утверждения

С версии NUnit 2.4 введены constraint-based
утверждения.

Новый тип утверждений базируется на
статической функции

NUnit. Утверждения С версии NUnit 2.4 введены constraint-based утверждения. Новый тип утверждений
Assert.That()

Assert.That(object actual,

IResolveConstraint constraint,
string message);

Слайд 66

NUnit. Утверждения

Assert.That(myString, Is.EqualTo("Hello"));

Assert.That(7, Is.GreaterThanOrEqualTo(3));

Assert.That(phrase,

Contains.Substring("tests fail"));

Assert.That(phrase,

Is.Not.StringContaining("tests pass"));

Assert.That(3, Is.LessThan(5) | Is.GreaterThan(10));

Примеры использования constraint-based утверждений:

NUnit. Утверждения Assert.That(myString, Is.EqualTo("Hello")); Assert.That(7, Is.GreaterThanOrEqualTo(3)); Assert.That(phrase, Contains.Substring("tests fail")); Assert.That(phrase, Is.Not.StringContaining("tests pass"));

Слайд 67

CppUnit




CppUnit – библиотека тестирования для
языка C++.
Является портом с JUnit на С++.
Текущая версия:

CppUnit ● ● ● CppUnit – библиотека тестирования для языка C++. Является
1.12.1

Слайд 68

CppUnit. Организация тестов




CPPUNIT_TEST_SUITE,
CPPUNIT_TEST_SUITE_END
создают набор тестов.
CPPUNIT_TEST
создаѐт тестовый метод.
setUp(), tearDown()
фикстуры уровня метода, виртуальные
функции класса

CppUnit. Организация тестов ● ● ● CPPUNIT_TEST_SUITE, CPPUNIT_TEST_SUITE_END создают набор тестов. CPPUNIT_TEST
TestFixture.

Слайд 69

CppUnit. Утверждения


Проверочные методы реализованы в виде
макросов:






CPPUNIT_ASSERT
CPPUNIT_ASSERT_EQUAL
CPPUNIT_ASSERT_DOUBLES_EQUAL
CPPUNIT_ASSERT_THROW
CPPUNIT_ASSERT_NO_THROW

CppUnit. Утверждения ● Проверочные методы реализованы в виде макросов: ● ● ●

Слайд 70

CppUnit. Пример

class TestGame : public CPPUNIT_NS::TestFixture
{

CPPUNIT_TEST_SUITE(TestGame);

CPPUNIT_TEST(testTwoThrowsNoMark);
CPPUNIT_TEST_SUITE_END();

protected:

Game * game;

protected:

void testTwoThrowsNoMark();

public:

void setUp();

void tearDown();

};

CppUnit. Пример class TestGame : public CPPUNIT_NS::TestFixture { CPPUNIT_TEST_SUITE(TestGame); CPPUNIT_TEST(testTwoThrowsNoMark); CPPUNIT_TEST_SUITE_END(); protected:

Слайд 71

CppUnit. Пример
void TestGame::setUp() {
game = new Game();
}
void TestGame::tearDown() {
delete game;
}

void TestGame::testTwoThrowsNoMar()

{

game->Add(5);
game->Add(4);
CPPUNIT_ASSERT( game->GetScore()

CppUnit. Пример void TestGame::setUp() { game = new Game(); } void TestGame::tearDown()
== 9 );
}

Слайд 72

JUnit 4



JUnit 4 — новая версия библиотеки,
построенная на появившихся в Java 5
аннотациях.
Текущая

JUnit 4 ● ● JUnit 4 — новая версия библиотеки, построенная на
версия: 4.8.2

Слайд 73

JUnit 4. Организация тестов



Набор тестов помещается в отдельный класс.
Для организации тестов используются
аннотации:




@Test
помечает

JUnit 4. Организация тестов ● ● Набор тестов помещается в отдельный класс.
тестовый метод.
@Before, @After
помечает любую процедуру без параметров как
фикстуру уровня метода.
@BeforeClass, @AfterClass
помечает любую процедуру без параметров как
фикстуру уровня класса

Слайд 74

JUnit 4. Утверждения
Класс Assert
● Содержит набор статических методов,
аналогичный набору JUnit 3






assertEquals,
assertSame/assertNotSame,
assertArrayEquals,
assertFalse/assertTrue,
assertNull/assertNotNull.

JUnit 4. Утверждения Класс Assert ● Содержит набор статических методов, аналогичный набору

Слайд 75

JUnit 4. Пример 1

public class TestGame
{

@Test

public void testTwoThrowsNoMark()
{

g = new Game();
g.add(5);
g.add(4);

Assert.assertEquals(9, g.score());

}
}

JUnit 4. Пример 1 public class TestGame { @Test public void testTwoThrowsNoMark()

Слайд 76

JUnit 4. Пример 2

public class TestGame
{

private Game g;

@Before

public void setUp()
{

g = new

JUnit 4. Пример 2 public class TestGame { private Game g; @Before
Game();

}

@Test

public void twoThrowsNoMark()
{

g.add(5);
g.add(4);

Assert.assertEquals(9, g.score());

}
}

Слайд 77

DUnit




Dunit — инструмент тестирования для
среды Borland Delphi.
Первоначальная версия написана
Juanco Anez в 2000г.
DUnit

DUnit ● ● ● Dunit — инструмент тестирования для среды Borland Delphi.
стал стандартной частью в среде
разработки Delphi 2005.

Слайд 78

DUnit. Организация тестов

Класс TTestCase

● Разработчик наследует свои классы

тестов от этого класса.

● Тестовые

DUnit. Организация тестов Класс TTestCase ● Разработчик наследует свои классы тестов от
методы — это все методы без

параметров, которые находятся в
published секции класса.

● Фикстуры уровня метода определяются
перегрузкой виртуальных функций SetUp и

TearDown.

Слайд 79

DUnit. Утверждения

Класс TTestCase содержит набор
проверочных методов:

● CheckEquals/CheckNotEquals
● CheckNull/CheckNotNull
● CheckSame
● CheckIs

● CheckInherits

DUnit. Утверждения Класс TTestCase содержит набор проверочных методов: ● CheckEquals/CheckNotEquals ● CheckNull/CheckNotNull

Слайд 80

DUnit. Пример

type

TGameTest = class(TTestCase)
private

FGame: TGame;

protected

procedure SetUp; override;

procedure TearDown; override;

published

procedure TestTwoThrowsNoMark;

end;

DUnit. Пример type TGameTest = class(TTestCase) private FGame: TGame; protected procedure SetUp;