Юнит-тестирование унаследованного кода безопасный рефакторинг презентация

Содержание

Слайд 2

•СБИС - сеть деловых коммуникаций и обмена электронными
документами между компаниями, госорганами и

обыкновенными

людьми

•Свыше 1 000 разработчиков

•Свыше 1 000 000 пользователей

Компания Тензор

2

Десктопная версия Веб-решение Приложение

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 3

О чем будем говорить

3

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange

Editor DEMO

Слайд 4

•Принципы создания тестируемого кода

О чем будем говорить

4

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange

Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 5

•Принципы создания тестируемого кода
•Понятие поддельных объектов

О чем будем говорить

5

PDF-XChange

Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 6

•Принципы создания тестируемого кода
•Понятие поддельных объектов
•Разбор на примере

О чем будем

говорить

6

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 7

•Принципы создания тестируемого кода
•Понятие поддельных объектов

•Разбор на примере

•Общие рекомендации и

практические приемы

О чем будем говорить

7

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 8

Допущения

•Примеры с использованием С++





8

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange

Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 9

Допущения

•Примеры с использованием С++
•Код упрощен





9

PDF-XChange

Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 10

Допущения

•Примеры с использованием С++
•Код упрощен

•Используется Google Test

https://github.com/google/googletest/tree/master/googletest




10

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 11

Пример унаследованного кода

11

class EntryAnalyzer {

public:

bool Analyze( std::string

ename ) {

if( ename.size() < 2 ) {
webService.LogError( "Error: " + ename );
return false;

}


return dbManager.IsValid( ename ) ;

}

private:

DatabaseManager dbManager;
WebService webService;

};

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 12

class EntryAnalyzer {

public:

bool Analyze( std::string ename ) {

if( ename.size() < 2 ) {
webService.LogError( "Error: " + ename );
return false;

}


return dbManager.IsValid( ename ) ;

}

private:

DatabaseManager dbManager;
WebService webService;

};

Пример унаследованного кода

12

class WebService {

public:

void LogError( std::string msg ) {
/* логика, включающая
работу с сетевым соединением*/

}

};

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 13

class EntryAnalyzer {

public:

bool Analyze( std::string ename ) {

if( ename.size() < 2 ) {
webService.LogError( "Error: " + ename );
return false;

}


return dbManager.IsValid( ename ) ;

}

private:

DatabaseManager dbManager;
WebService webService;

};

Пример унаследованного кода

class DatabaseManager {

public:

bool IsValid( std::string ename ) {
/* логика, включающая
операции чтения из базы данных*/

}

};

13

class WebService {

public:

void LogError( std::string msg ) {
/* логика, включающая
работу с сетевым соединением*/

}

};

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 14

Внешняя зависимость

Взаимодействие есть, а контроля нет

14

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange

Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 15

Интеграционный тест VS юнит-тест

Полный контроль

над внешними зависимостями

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


нет да

15

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 16

Признаки хорошего юнит-теста

Полный контроль над внешними зависимостями


16

Результат

PDF-XChange

Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 17

Признаки хорошего юнит-теста

Полный контроль над внешними зависимостями
Результат

•стабилен


17


PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 18

Признаки хорошего юнит-теста

Полный контроль над внешними зависимостями
Результат

•стабилен
•повторим

18


PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 19

Признаки хорошего юнит-теста

Полный контроль над внешними зависимостями
Результат

•стабилен
•повторим
•независим



19

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 20

Признаки хорошего юнит-теста

Полный контроль над внешними зависимостями


Автоматизация
запуска

Результат


•стабилен

•повторим
•независим


20

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 21

Признаки хорошего юнит-теста

Полный контроль над внешними зависимостями


Автоматизация
запуска

Результат


•стабилен

•повторим
•независим


•Малое время выполнения

21

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 22

Признаки хорошего юнит-теста

Полный контроль над внешними зависимостями


Автоматизация
запуска

Результат


•стабилен

•повторим
•независим


•Малое время выполнения
•Малое время компиляции

22

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 23

Признаки хорошего юнит-теста

Полный контроль над внешними зависимостями


Автоматизация
запуска

Результат


•стабилен

•повторим
•независим


•Малое время выполнения
•Малое время компиляции
•Простота чтения

23

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 24

Исходный код

class EntryAnalyzer {

public:

bool Analyze( std::string ename )

{

if( ename.size() < 2 ) {
webService.LogError( "Error: " + ename );
return false;

}


return dbManager.IsValid( ename );

}

private:

DatabaseManager dbManager;
WebService webService;

};

24

class WebService {

public:

void LogError( std::string msg ) {
/* логика, включающая
работу с сетевым соединением*/

}

};

class DatabaseManager {

public:

bool IsValid( std::string ename ) {
/* логика, включающая
операции чтения из базы данных*/

}

};

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 25

Исходный код

class WebService {

public:

void LogError( std::string msg )

{
/* логика, включающая
работу с сетевым соединением*/

}

};

class EntryAnalyzer {

public:

bool Analyze( std::string ename ) {

if( ename.size() < 2 ) {
webService.LogError( "Error: " + ename );
return false;

}


return dbManager.IsValid( ename );

}

private:

DatabaseManager dbManager;
WebService webService;

};

class DatabaseManager {

public:

bool IsValid( std::string ename ) {
/* логика, включающая
операции чтения из базы данных*/

}

};

25

Внешняя зависимость

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 26

Исходный код

class WebService {

public:

void LogError( std::string msg )

{
/* логика, включающая
работу с сетевым соединением*/

}

};

Внешняя зависимость
26

class EntryAnalyzer {

public:

bool Analyze( std::string ename ) {

if( ename.size() < 2 ) {
webService.LogError( "Error: " + ename );
return false;

}


return dbManager.IsValid( ename );

}

private:

DatabaseManager dbManager;
WebService webService;

};

class DatabaseManager {

public:

bool IsValid( std::string ename ) {
/* логика, включающая
операции чтения из базы данных*/

}

};

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 27

Исходный код

Внешние зависимости

27

class EntryAnalyzer {

public:

bool Analyze(

std::string ename ) {

if( ename.size() < 2 ) {
webService.LogError( "Error: " + ename );
return false;

}


return dbManager.IsValid( ename );

}

private:

DatabaseManager dbManager;
WebService webService;

};

class WebService {

public:

void LogError( std::string msg ) {
/* логика, включающая
работу с сетевым соединением*/

}

};

class DatabaseManager {

public:

bool IsValid( std::string ename ) {
/* логика, включающая
операции чтения из базы данных*/

}

};

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 28

Как сделать унаследованный код тестируемым?

28

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange

Editor DEMO

PDF-XChange Editor DEMO

Слайд 29

Понятие программного шва
•Шов — место в котором можно изменить

поведение программы, не

правя ее в этом
месте

•Виды швов:
–Предварительной обработки

–Этапа компиляции
–Компоновочный шов
–Объектный шов

29

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 30

Слои тестирования

30

Препроцессор

Компилятор

Компоновщик

Run-time

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange

Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 31

Слои тестирования

31

Препроцессор

Компилятор

Компоновщик

Run-time

Модифицированный
исходный код

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange

Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 32

Слои тестирования

32

Препроцессор

Компилятор

Компоновщик

Run-time

Модифицированный
исходный код

Машинный код

PDF-XChange

Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 33

Слои тестирования

33

Препроцессор

Компилятор

Компоновщик

Run-time

Модифицированный
исходный код

Исполняемый файл

Машинный

код

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 34

Слои тестирования

34

Препроцессор

Компилятор

Компоновщик

Run-time

Модифицированный
исходный код

Исполняемый файл

Машинный

код

Выполнение приложения

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 35

Слои тестирования

35

Препроцессор

Компилятор

Компоновщик

Run-time

Шов предварительной обработки

Исполняемый файл

Машинный

код

Выполнение приложения

Модифицированный
исходный код

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 36

Слои тестирования

36

Препроцессор

Компилятор

Компоновщик

Run-time

Шов предварительной обработки

Шов этапа компиляции


Исполняемый файл

Машинный код

Выполнение приложения

Модифицированный
исходный код

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 37

Слои тестирования

37

Препроцессор

Компилятор

Компоновщик

Run-time

Шов предварительной обработки

Шов этапа компиляции


Компоновочный шов

Исполняемый файл

Машинный код

Выполнение приложения

Модифицированный
исходный код

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 38

Слои тестирования

38

Препроцессор

Компилятор

Компоновщик

Run-time

Шов предварительной обработки

Шов этапа компиляции


Компоновочный шов

Объектный шов

Исполняемый файл

Машинный код

Выполнение приложения

Модифицированный
исходный код

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 39

Слои тестирования

39

Препроцессор

Компилятор

Компоновщик

Run-time

Шов предварительной обработки

Шов этапа компиляции


Компоновочный шов

Объектный шов

Модифицированный
исходный код

Исполняемый файл

Машинный код

Выполнение приложения

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 40

Слои тестирования

40

Препроцессор

Компилятор

Компоновщик

Run-time

Шов предварительной обработки

Шов этапа компиляции


Компоновочный шов

Объектный шов

Модифицированный
исходный код

Исполняемый файл

Машинный код

Выполнение приложения

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 41

Слои тестирования

41

Препроцессор

Компилятор

Компоновщик

Run-time

Шов предварительной обработки

Шов этапа компиляции


Компоновочный шов

Объектный шов

Модифицированный
исходный код

Исполняемый файл

Машинный код

Выполнение приложения

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 42

Слои тестирования

42

Препроцессор

Компилятор

Компоновщик

Run-time

Шов предварительной обработки

Шов этапа компиляции


Компоновочный шов

Объектный шов

Модифицированный
исходный код

Исполняемый файл

Машинный код

Выполнение приложения

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 43

Признаки хорошего юнит-теста

Полный контроль над внешними зависимостями


Автоматизация
запуска

Результат


•стабилен

•повторим
•независим


•Малое время выполнения
•Малое время компиляции
•Простота чтения

43

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 44

Принцип наименования юнит-теста

Sum_ByDefault_ReturnsZero()


Sum_WhenCalled_CallsTheLogger()

[ИмяТестируемойРабочейЕдиницы]_
[СценарийТеста]_

[ОжидаемыйРезультат]

44

PDF-XChange Editor DEMO

PDF-XChange

Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 45

TEST_F( CalculatorTest,
Sum_ByDefault_ReturnsZero )
{

Calculator calc;



int

last_sum = calc.Sum();



ASSERT_EQ( 0, last_sum );

}

Структура юнит-теста

45

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 46

TEST_F( CalculatorTest,
Sum_ByDefault_ReturnsZero )
{

Calculator calc;



int

last_sum = calc.Sum();



ASSERT_EQ( 0, last_sum );

}

Структура юнит-теста

1. Arrange

46

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 47

TEST_F( CalculatorTest,
Sum_ByDefault_ReturnsZero )
{

Calculator calc;



int

last_sum = calc.Sum();



ASSERT_EQ( 0, last_sum );

}

Структура юнит-теста

1. Arrange

47

2. Act

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 48

TEST_F( CalculatorTest,
Sum_ByDefault_ReturnsZero )
{

Calculator calc;



int

last_sum = calc.Sum();



ASSERT_EQ( 0, last_sum );

}

Структура юнит-теста

1. Arrange

48

2. Act

3. Assert

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 49

TEST_F( CalculatorTest,
Sum_ByDefault_ReturnsZero )
{

Calculator calc;



int

last_sum = calc.Sum();



ASSERT_EQ( 0, last_sum );

}

Структура юнит-теста

1. Arrange

2. Act

3. Assert

49

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 50

Понятие поддельных объектов

50

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 51

Поддельные реализации объектов

Fake-объект



Stub-объект
Задача

ра

зделения

Mock-объект
Задача

ра


спознавания

51

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 52

Stub-объект

Взаимоде
йствие

Тестовый код

Тестируемый код Stub

Взаимодействие

52

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange

Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 53

Mock-объект

Взаимоде
йствие

Тестовый код

Тестируемый код Mock

Взаимодействие

53

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange

Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 54

Слои тестирования

54

Препроцессор

Компилятор

Компоновщик

Run-time

Шов предварительной обработки

Шов этапа компиляции


Компоновочный шов

Объектный шов

Модифицированный
исходный код

Исполняемый файл

Машинный код

Выполнение приложения

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 55

Объектный шов
•Разрешающая точка находится на этапе

создания объектов


•Выбор стратегии выполнения

действия в
зависимости от используемого объекта

55

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 56

Объектный шов

База данных

TestingDatabaseManager DatabaseManager

56

Режим
Тестирования?

Да Нет

PDF-XChange Editor DEMO

PDF-XChange

Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 57

Использование stub

для разрыва зависимости

“Выделить и
переопределить”

57

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange

Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 58

class EntryAnalyzer {

public:

bool Analyze( std::string ename ) {

if( ename.size() < 2 ) {
webService.LogError( "Error: " + ename );
return false;

}


return dbManager.IsValid( ename );

}

private:

DatabaseManager dbManager;
WebService webService;

};

Выделение зависимости

58

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 59

class EntryAnalyzer {

public:

bool Analyze( std::string ename ) {

...



return IsValid( ename );
}


protected:

bool IsValid( std::string ename ) {

return dbManager.IsValid( ename );

}


private:

DatabaseManager dbManager;
...

};

class EntryAnalyzer {

public:

bool Analyze( std::string ename ) {

if( ename.size() < 2 ) {
webService.LogError( "Error: " + ename );
return false;

}


return dbManager.IsValid( ename );

}

private:

DatabaseManager dbManager;
WebService webService;

};

Выделение зависимости

59

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 60

class EntryAnalyzer {

public:

bool Analyze( std::string ename ) {

...



return IsValid( ename );
}


protected:

virtual bool IsValid( std::string ename ) {

return dbManager.IsValid( ename );
}


private:

DatabaseManager dbManager;
...

};

Переопределение зависимости

60

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 61

Переопределение зависимости

class TestingEntryAnalyzer :
public EntryAnalyzer {


public:

bool willBeValid;


private:

bool IsValid( std::string ename ) override {
return willBeValid;

}

};

наследование class EntryAnalyzer {

public:

bool Analyze( std::string ename ) {

...



return IsValid( ename );
}


protected:

virtual bool IsValid( std::string ename ) {

return dbManager.IsValid( ename );

}


private:

DatabaseManager dbManager;
...

};

61

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 62

Переопределение зависимости

class TestingEntryAnalyzer :
public EntryAnalyzer {


public:

bool willBeValid;


private:

bool IsValid( std::string ename ) override {
return willBeValid;

}

};

наследование

тестируемый класс

62

class EntryAnalyzer {

public:

bool Analyze( std::string ename ) {
...



return IsValid( ename );
}


protected:

virtual bool IsValid( std::string ename ) {

return dbManager.IsValid( ename );

}


private:

DatabaseManager dbManager;
...

};

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 63

Переопределение зависимости

class TestingEntryAnalyzer :
public EntryAnalyzer {


public:

bool willBeValid;


private:

bool IsValid( std::string ename ) override {
return willBeValid;

}

};

наследование

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

тестируемый класс

63

class EntryAnalyzer {

public:

bool Analyze( std::string ename ) {
...



return IsValid( ename );
}


protected:

virtual bool IsValid( std::string ename ) {

return dbManager.IsValid( ename );

}


private:

DatabaseManager dbManager;
...

};

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 64

Тестирование возвращаемого значения

TEST_F( EntryAnalyzerTest,
Analyze_ValidEntryName_ReturnsTrue)
{

TestingEntryAnalyzer ea;
ea.willBeValid

= true;


bool result = ea.Analyze( "valid_entry_name" );


ASSERT_EQ( result, true );

}

64

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 65

Тестирование возвращаемого значения

TEST_F( EntryAnalyzerTest,
Analyze_ValidEntryName_ReturnsTrue)
{

TestingEntryAnalyzer ea;
ea.willBeValid

= true;


bool result = ea.Analyze( "valid_entry_name" );


ASSERT_EQ( result, true );

}

class TestingEntryAnalyzer :
public EntryAnalyzer {


public:

bool willBeValid;


private:

bool IsValid( std::string ename ) override {
return willBeValid;

}

};

65

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 66

66

class TestingEntryAnalyzer :
public EntryAnalyzer {


public:
TestingEntryAnalyzer()

{

}

bool willBeValid;

};

class EntryAnalyzer {
public:
EntryAnalyzer() {

}


private:

DatabaseManager dbManager;
WebService webService;

};

Возможные проблемы при переопределении
зависимости

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 67

Возможные проблемы при переопределении
зависимости

67

class TestingEntryAnalyzer :
public EntryAnalyzer {



public:
TestingEntryAnalyzer() {

}

bool willBeValid;

};

class EntryAnalyzer {
public:
EntryAnalyzer() {

}


private:

DatabaseManager dbManager;
WebService webService;

};

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 68

Использование stub

для разрыва зависимости

Параметризация
конструктора.


68

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange

Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 69

Разрыв зависимости от базы данных

База данных

bool IsValid( std::string ename )

IDatabaseManager


FakeDatabaseManager DatabaseManager

69

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 70

Разрыв зависимости от базы данных

70

class IDatabaseManager {

public:

virtual

bool IsValid( std::string ename ) = 0;
};

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 71

class IDatabaseManager {

public:

virtual bool IsValid( std::string ename ) =

0;
};

class FakeDatabaseManager :
public IDatabaseManager {


public:

bool WillBeValid;


FakeDatabaseManager( bool will_be_valid ) :
WillBeValid( will_be_valid ) {

}


bool IsValid( std::string ename ) {


return WillBeValid;
}

};

Разрыв зависимости от базы данных

71

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 72

class DatabaseManager :
public IDatabaseManager {


public:

bool IsValid(

std::string ename ) {


/* сложная логика, включающая
операции чтения из базы данных*/
}

};

class FakeDatabaseManager :
public IDatabaseManager {


public:

bool WillBeValid;


FakeDatabaseManager( bool will_be_valid ) :
WillBeValid( will_be_valid ) {

}


bool IsValid( std::string ename ) {


return WillBeValid;
}

};

Разрыв зависимости от базы данных

72

class IDatabaseManager {

public:

virtual bool IsValid( std::string ename ) = 0;
};

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 73

Вместо конкретной реализации – интерфейс

class EntryAnalyzer {

public:

bool Analyze(

std::string ename ) {

if( ename.size() < 2 ) {
webService.LogError( "Error: " + ename );
return false;

}


return dbManager.IsValid( ename );
}

private:

DatabaseManager dbManager;
WebService webService;

};

73

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 74

Вместо конкретной реализации – интерфейс

class EntryAnalyzer {

public:

EntryAnalyzer() :


pDbManager( std::make_unique() ) {
}


bool Analyze( std::string ename ) {

if( ename.size() < 2 ) {
webService.LogError( "Error: " + ename );
return false;

}


return pDbManager->IsValid( ename );

}

private:

std::unique_ptr pDbManager;
WebService webService;
};

74

class EntryAnalyzer {

public:

bool Analyze( std::string ename ) {

if( ename.size() < 2 ) {
webService.LogError( "Error: " + ename );
return false;

}


return dbManager.IsValid( ename );
}

private:

DatabaseManager dbManager;
WebService webService;

};

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 75

Вместо конкретной реализации – интерфейс

class EntryAnalyzer {

public:

EntryAnalyzer() :


pDbManager( std::make_unique() ) {
}


bool Analyze( std::string ename ) {

if( ename.size() < 2 ) {
webService.LogError( "Error: " + ename );
return false;

}


return pDbManager->IsValid( ename );

}

private:

std::unique_ptr pDbManager;
WebService webService;
};

75

class EntryAnalyzer {

public:

bool Analyze( std::string ename ) {

if( ename.size() < 2 ) {
webService.LogError( "Error: " + ename );
return false;

}


return dbManager.IsValid( ename );
}

private:

DatabaseManager dbManager;
WebService webService;

};

Где появился баг?

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 76

Вместо конкретной реализации – интерфейс

class EntryAnalyzer {

public:

EntryAnalyzer() :


pDbManager( std::make_unique() ) {
}


bool Analyze( std::string ename ) {

if( ename.size() < 2 ) {
webService.LogError( "Error: " + ename );
return false;

}


return pDbManager->IsValid( ename );

}

private:

std::unique_ptr pDbManager;
WebService webService;
};

76

class EntryAnalyzer {

public:

bool Analyze( std::string ename ) {

if( ename.size() < 2 ) {
webService.LogError( "Error: " + ename );
return false;

}


return dbManager.IsValid( ename );
}

private:

DatabaseManager dbManager;
WebService webService;

};

Утечка памяти!

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 77

Разрыв зависимости от базы данных

77

class IDatabaseManager {

public:

virtual

bool IsValid( std::string ename ) = 0;
};

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 78

class IDatabaseManager {

public:

virtual bool IsValid( std::string ename ) =

0;
virtual ~IDatabaseManager() = default;

};

Разрыв зависимости от базы данных

78

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 79

class IDatabaseManager {

public:

virtual bool IsValid( std::string ename ) =

0;
virtual ~IDatabaseManager() = default;

};

class FakeDatabaseManager :
public IDatabaseManager {


public:

bool WillBeValid;


FakeDatabaseManager( bool will_be_valid ) :
WillBeValid( will_be_valid ) {

}


bool IsValid( std::string ename ) override {


return WillBeValid;
}

};

Разрыв зависимости от базы данных

79

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 80

class DatabaseManager :
public IDatabaseManager {


public:

bool IsValid(

std::string ename ) override {


/* сложная логика, включающая
операции чтения из базы данных*/
}

};

class IDatabaseManager {

public:

virtual bool IsValid( std::string ename ) = 0;
virtual ~IDatabaseManager() = default;

};

class FakeDatabaseManager :
public IDatabaseManager {


public:

bool WillBeValid;


FakeDatabaseManager( bool will_be_valid ) :
WillBeValid( will_be_valid ) {

}


bool IsValid( std::string ename ) override {


return WillBeValid;
}

};

Разрыв зависимости от базы данных

80

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 81

class DatabaseManager :
public IDatabaseManager {


public:

bool IsValid(

std::string ename ) override {


/* сложная логика, включающая
операции чтения из базы данных*/
}

};

class IDatabaseManager {

public:

virtual bool IsValid( std::string ename ) = 0;
virtual ~IDatabaseManager() = default;

};

class FakeDatabaseManager :
public IDatabaseManager {


public:

bool WillBeValid;


FakeDatabaseManager( bool will_be_valid ) :
WillBeValid( will_be_valid ) {

}


bool IsValid( std::string ename ) override {


return WillBeValid;
}

};

Разрыв зависимости от базы данных

81

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 82

class DatabaseManager :
public IDatabaseManager {


public:

bool IsValid(

std::string ename ) override {


/* сложная логика, включающая
операции чтения из базы данных*/
}

};

class IDatabaseManager {

public:

virtual bool IsValid( std::string ename ) = 0;
virtual ~IDatabaseManager() = default;

};

class FakeDatabaseManager :
public IDatabaseManager {


public:

bool WillBeValid;


FakeDatabaseManager( bool will_be_valid ) :
WillBeValid( will_be_valid ) {

}


bool IsValid( std::string ename ) override {


return WillBeValid;
}

};

Разрыв зависимости от базы данных

82

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 83

Внедрение зависимости

class EntryAnalyzer {

public:

EntryAnalyzer( std::unique_ptr &&p_db_mng ) :


pDbManager( std::move( p_db_mng ) ) {

}


bool Analyze( std::string ename ) {
...



return pDbManager->IsValid( ename ) ;

}


private:

std::unique_ptr pDbManager;
...

};

83

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 84

class EntryAnalyzer {

public:

EntryAnalyzer( std::unique_ptr &&p_db_mng ) :
pDbManager(

std::move( p_db_mng ) ) {

}


bool Analyze( std::string ename ) {
...



return pDbManager->IsValid( ename ) ;

}


private:

std::unique_ptr pDbManager;
...

};

Внедрение зависимости

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

84

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 85

class EntryAnalyzer {

public:

EntryAnalyzer( std::unique_ptr &&p_db_mng ) :
pDbManager(

std::move( p_db_mng ) ) {

}


bool Analyze( std::string ename ) {
...



return pDbManager->IsValid( ename ) ;

}


private:

std::unique_ptr pDbManager;
...

};

Внедрение зависимости

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

85

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 86

class EntryAnalyzer {

public:

EntryAnalyzer() : pDbManager(
std::make_unique() ) {


}


bool Analyze( std::string ename ) {

if( ename.size() < 2 ) {
webService.LogError( "Error: " + ename );
return false;

}


return pDbManager->IsValid( ename );

}

private:

std::unique_ptr pDbManager;
WebService webService;
};

86

Внедрение зависимости

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 87

class EntryAnalyzer {

public:

EntryAnalyzer() : pDbManager(
std::make_unique() ) {


}


bool Analyze( std::string ename ) {

if( ename.size() < 2 ) {
webService.LogError( "Error: " + ename );
return false;

}


return pDbManager->IsValid( ename );

}

private:

std::unique_ptr pDbManager;
WebService webService;
};

class EntryAnalyzer {

public:

EntryAnalyzer( std::unique_ptr &&p_mng ) :
pDbManager( std::move( p_mng ) )

{

}


bool Analyze( std::string ename ) {


...


}

private:

std::unique_ptr pDbManager;
WebService webService;
};

87

Внедрение зависимости

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 88

class EntryAnalyzer {

public:

EntryAnalyzer( std::unique_ptr &&p_mng =
std::make_unique() )

:
pDbManager( std::move( p_mng ) )

{

}


bool Analyze( std::string ename ) {


...


}

private:

std::unique_ptr pDbManager;
WebService webService;
};

class EntryAnalyzer {

public:

EntryAnalyzer() : pDbManager(
std::make_unique() ) {
}


bool Analyze( std::string ename ) {

if( ename.size() < 2 ) {
webService.LogError( "Error: " + ename );
return false;

}


return pDbManager->IsValid( ename );

}

private:

std::unique_ptr pDbManager;
WebService webService;
};

88

Внедрение зависимости

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 89

class EntryAnalyzer {

public:

EntryAnalyzer( std::unique_ptr &&p_mng =
std::make_unique() )

:
pDbManager( std::move( p_mng ) )

{

}


bool Analyze( std::string ename ) {


...


}

private:

std::unique_ptr pDbManager;
WebService webService;
};

class EntryAnalyzer {

public:

EntryAnalyzer() : pDbManager(
std::make_unique() ) {
}


bool Analyze( std::string ename ) {

if( ename.size() < 2 ) {
webService.LogError( "Error: " + ename );
return false;

}


return pDbManager->IsValid( ename );

}

private:

std::unique_ptr pDbManager;
WebService webService;
};

89

Внедрение зависимости

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 90

Тестирование возвращаемого значения

TEST_F( EntryAnalyzerTest, Analyze_ValidEntryName_ReturnsTrue )

{

EntryAnalyzer ea( std::make_unique( true

) );


bool result = ea.Analyze( "valid_entry_name" );


ASSERT_EQ( result, true );

}

90

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 91

Тестирование возвращаемого значения

class FakeDatabaseManager : public IDatabaseManager {
public:

bool

willBeValid;


FakeDatabaseManager( bool will_be_valid ) : willBeValid( will_be_valid ) {
}


bool IsValid( std::string ename ) override {
return willBeValid;

}

};

TEST_F( EntryAnalyzerTest, Analyze_ValidEntryName_ReturnsTrue )

{

EntryAnalyzer ea( std::make_unique( true ) );


bool result = ea.Analyze( "valid_entry_name" );


ASSERT_EQ( result, true );

}

91

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 92

Разбор на примере

92

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 93

Исходный код

93

class Analyzer {

public:

int Analyze() {

if(

false == WinAPIFind() ) return 1;
if( false == WinAPIProc() ) return 2;


return 0;
}

};


PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 94

Исходный код

94

class Analyzer {

public:

int Analyze() {

if(

false == WinAPIFind() ) return 1;
if( false == WinAPIProc() ) return 2;


return 0;
}

};


PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 95

Локализация внешних зависимостей

95

class Analyzer {

public:

int Analyze() {

if( false == WinAPIFind() ) return 1;
if( false == WinAPIProc() ) return 2;


return 0;
}

};


class Analyzer {

public:

int Analyze() {

if( false == Find() ) return 1;
if( false == Proc() ) return 2;


return 0;

}

private:

bool Find() {
return WinAPIFind();
}

bool Proc() {
return WinAPIProc();
}

};


PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 96

Подготовка к разрыву зависимости

96

class Analyzer {

public:

int Analyze() {


if( false == Find() ) return 1;
if( false == Proc() ) return 2;


return 0;

}

private:

bool Find() {
return WinAPIFind();
}

bool Proc() {
return WinAPIProc();
}

};


PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 97

Подготовка к разрыву зависимости

97

class Analyzer {

public:

int Analyze() {


if( false == Find() ) return 1;
if( false == Proc() ) return 2;


return 0;

}

private:

bool Find() {
return WinAPIFind();
}

bool Proc() {
return WinAPIProc();
}

};


class Analyzer {

public:

int Analyze() {

if( false == Find() ) return 1;
if( false == Proc() ) return 2;


return 0;

}

virtual ~Analyzer() = default;
protected:

virtual bool Find() {
return WinAPIFind();

}

virtual bool Proc() {
return WinAPIProc();

}

};



PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 98

Вводим класс-наследник

98

class TestingAnalyzer : public Analyzer
{

public:

bool findApiCallWillBeReturned;


bool procApiCallWillBeReturned;


private:

virtual bool Find() override

{

return findApiCallWillBeReturned;

}


virtual bool Proc() override

{

return procApiCallWillBeReturned;
}

};


class Analyzer {

public:

int Analyze() {

if( false == Find() ) return 1;
if( false == Proc() ) return 2;


return 0;

}

virtual ~Analyzer() = default;
protected:

virtual bool Find() {
return WinAPIFind();

}

virtual bool Proc() {
return WinAPIProc();

}

};



PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 99

Вводим класс-наследник

99

class TestingAnalyzer : public Analyzer
{

public:

bool findApiCallWillBeReturned;


bool procApiCallWillBeReturned;


private:

virtual bool Find() override

{

return findApiCallWillBeReturned;

}


virtual bool Proc() override

{

return procApiCallWillBeReturned;
}

};


class Analyzer {

public:

int Analyze() {

if( false == Find() ) return 1;
if( false == Proc() ) return 2;


return 0;

}

virtual ~Analyzer() = default;
protected:

virtual bool Find() {
return WinAPIFind();

}

virtual bool Proc() {
return WinAPIProc();

}

};



PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 100

Вводим класс-наследник

100

class TestingAnalyzer : public Analyzer
{

public:

bool findApiCallWillBeReturned;


bool procApiCallWillBeReturned;


private:

virtual bool Find() override

{

return findApiCallWillBeReturned;

}


virtual bool Proc() override

{

return procApiCallWillBeReturned;
}

};


class Analyzer {

public:

int Analyze() {

if( false == Find() ) return 1;
if( false == Proc() ) return 2;


return 0;

}

virtual ~Analyzer() = default;
protected:

virtual bool Find() {
return WinAPIFind();

}

virtual bool Proc() {
return WinAPIProc();

}

};



PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 101

Покрываем существующую логику работы
класса юнит-тестами

101

Analyze_WhenFindFails_Returns1()

{

TestingAnalyzer tf;

tf.findApiCallWillBeReturned = false;


int test_ret = tf.Analyze();


int etalon_ret = 1;

ASSERT_EQ( test_ret, etalon_ret);

}

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 102

Покрываем существующую логику работы
класса юнит-тестами

102

Analyze_WhenFindFails_Returns1()

{

TestingAnalyzer tf;

tf.findApiCallWillBeReturned = false;


int test_ret = tf.Analyze();


int etalon_ret = 1;

ASSERT_EQ( test_ret, etalon_ret);

}

Analyze_WhenProcFails_Returns2()

{

TestingAnalyzer tf;
tf.findApiCallWillBeReturned = true;
tf.procApiCallWillBeReturned = false;


int test_ret = tf.Analyze();


int etalon_ret = 2;

ASSERT_EQ( test_ret, etalon_ret);

}

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 103

Покрываем существующую логику работы
класса юнит-тестами

103

Analyze_WhenFindFails_Returns1()

{

TestingAnalyzer tf;

tf.findApiCallWillBeReturned = false;


int test_ret = tf.Analyze();


int etalon_ret = 1;

ASSERT_EQ( test_ret, etalon_ret);

}

Analyze_WhenProcFails_Returns2()

{

TestingAnalyzer tf;
tf.findApiCallWillBeReturned = true;
tf.procApiCallWillBeReturned = false;


int test_ret = tf.Analyze();


int etalon_ret = 2;

ASSERT_EQ( test_ret, etalon_ret);

}

Analyze_WhenSucceed_Returns0()

{

TestingAnalyzer tf;
tf.findApiCallWillBeReturned = true;
tf.procApiCallWillBeReturned = true;


int test_ret = tf.Analyze();


int etalon_ret = 0;

ASSERT_EQ( test_ret, etalon_ret);

}

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 104

Вносим изменения в боевой класс

104

class Analyzer {

public:

int Analyze()

{

if( false == Find() ) return 1;
if( false == Proc() ) return 2;


return 0;

}

private:

bool Find() {
return WinAPIFind();

}

bool Proc() {
return WinAPIProc();

}

};


PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 105

Вносим изменения в боевой класс

105

class Analyzer {

public:

int Analyze()

{

if( false == Find() ) return 1;
if( false == Proc() ) return 2;


return 0;

}

private:

bool Find() {
return WinAPIFind();

}

bool Proc() {
return WinAPIProc();

}

};


class Analyzer

{

public:

int Analyze()

{

WindowsProcessor wp;
return wr.Process();

}

virtual ~Analyzer() = default;
};


PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 106

Вносим изменения в боевой класс

106

class Analyzer {

public:

int Analyze()

{

if( false == Find() ) return 1;
if( false == Proc() ) return 2;


return 0;

}

private:

bool Find() {
return WinAPIFind();

}

bool Proc() {
return WinAPIProc();

}

};


class Analyzer

{

public:

int Analyze()

{

WindowsProcessor wp;
return wr.Process();

}

virtual ~Analyzer() = default;
};


class WindowsProcessor()

{

public:

int Process()

{

if( false == Find() ) return 1;
if( false == Proc() ) return 2;
return 0;

}

protected:

virtual bool Find()

{

return WinAPIFind();

}


virtual bool Proc()

{

return WinAPIProc();
}

};


PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 107

Поиск внешних зависимостей

107

class Analyzer {

public:

int Analyze() {

if( false == Find() ) return 1;
if( false == Proc() ) return 2;


return 0;

}

private:

bool Find() {
return WinAPIFind();

}

bool Proc() {
return WinAPIProc();

}

};


class Analyzer

{

public:

int Analyze()

{

WindowsProcessor wp;
return wr.Process();

}

virtual ~Analyzer() = default;
};


class WindowsProcessor()

{

public:

int Process()

{

if( false == Find() ) return 1;
if( false == Proc() ) return 2;
return 0;

}

protected:

virtual bool Find()

{

return WinAPIFind();

}


virtual bool Proc()

{

return WinAPIProc();
}

};


Внешние зависимости

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 108

Поиск внешних зависимостей

108

class Analyzer {

public:

int Analyze() {

if( false == Find() ) return 1;
if( false == Proc() ) return 2;


return 0;

}

private:

bool Find() {
return WinAPIFind();

}

bool Proc() {
return WinAPIProc();

}

};


class Analyzer

{

public:

int Analyze()

{

WindowsProcessor wp;
return wr.Process();

}

virtual ~Analyzer() = default;
};


class WindowsProcessor()

{

public:

int Process()

{

if( false == Find() ) return 1;
if( false == Proc() ) return 2;
return 0;

}

protected:

virtual bool Find()

{

return WinAPIFind();

}


virtual bool Proc()

{

return WinAPIProc();
}

};


Внешняя зависимость

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 109

Подготовка к разрыву зависимости

109

class IWindowsProcessor

{

virtual int Process() =

0;

virtual ~IWindowsProcessor() = default;
};


PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 110

Подготовка к разрыву зависимости

110

class IWindowsProcessor

{

virtual int Process() =

0;

virtual ~IWindowsProcessor() = default;
};


class WindowsProcessor :

public IWindowsProcessor

{

public:

int Process() override

{

if( false == Find() ) return 1;
if( false == Proc() ) return 2;
return 0;

}


virtual ~WindowsProcessor() = default;


protected:

virtual bool Find()

{

return WinAPIFind();

}


virtual bool Proc()

{

return WinAPIProc();
}

};


PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 111

Подготовка к разрыву зависимости

111

class IWindowsProcessor

{

virtual int Process() =

0;

virtual ~IWindowsProcessor() = default;
};


class TestingWindowsProcessor :
public WindowsProcessor

{

public:

bool findApiCallWillBeReturned;
bool procApiCallWillBeReturned;
private:

virtual bool Find() override

{

return findApiCallWillBeReturned;
}


virtual bool Proc() override

{

return procApiCallWillBeReturned;
}

};


class WindowsProcessor :

public IWindowsProcessor

{

public:

int Process() override

{

if( false == Find() ) return 1;
if( false == Proc() ) return 2;
return 0;

}


virtual ~WindowsProcessor() = default;


protected:

virtual bool Find()

{

return WinAPIFind();

}


virtual bool Proc()

{

return WinAPIProc();
}

};


PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 112

Подготовка к разрыву зависимости

112

class Analyzer

{

public:

int Analyze()

{

WindowsProcessor wp;
return wr.Process();

}

virtual ~Analyzer() = default;
};


PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 113

Подготовка к разрыву зависимости

113

class Analyzer

{

public:

Analyzer() :

pWindowsProcessor( nullptr )

{

pWindowsProcessor = std::make_unique();

}


int Analyze()

{

return pWindowsProcessor->Process();
}

virtual ~Analyzer() = default;


private:

std::unique_ptr pWindowsProcessor;
};


class Analyzer

{

public:

int Analyze()

{

WindowsProcessor wp;
return wr.Process();

}

virtual ~Analyzer() = default;
};


PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 114

Внедрение зависимости

114

class Analyzer

{

public:

Analyzer() :

pWindowsProcessor( nullptr

)

{

pWindowsProcessor = std::make_unique();

}


int Analyze()

{

return pWindowsProcessor->Process();
}

virtual ~Analyzer() = default;


private:

std::unique_ptr pWindowsProcessor;
};


PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 115

Внедрение зависимости

115

class Analyzer

{

public:

Analyzer() :

pWindowsProcessor( nullptr

)

{

pWindowsProcessor = std::make_unique();

}


int Analyze()

{

return pWindowsProcessor->Process();
}

virtual ~Analyzer() = default;


private:

std::unique_ptr pWindowsProcessor;
};


class Analyzer

{

public:

Analyzer() :

pWindowsProcessor( nullptr )

{

pWindowsProcessor = std::make_unique();
}


void SetWindowsProcessor(
std::unique_ptr &&wp )
{

pWindows Processor = std::move( wp );

}


int Analyze()

{

int ret = pWindowsProcessor->Process();


return ret;

}

virtual ~Analyzer() = default;


private:

std::unique_ptr pWindowsProcessor;
};


PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 116

Обновление тестов

116


Analyze_WhenFindFails_Returns1()

{

Analyzer f;
std::unique_ptr p_twp =


std::make_unique();
p_twp->findApiCallWillBeReturned = false;
SetWindowsProcessor( std::move( p_twr ) );


int test_ret = tf.Analyze();


int etalon_ret = 1;

ASSERT_EQ( test_ret, etalon_ret);

}



Analyze_WhenFindFails_Returns1()

{

TestingAnalyzer tf;
tf.findApiCallWillBeReturned = false;


int test_ret = tf.Analyze();


int etalon_ret = 1;

ASSERT_EQ( test_ret, etalon_ret);

}

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 117

Обновление тестов

117


Analyze_WhenFindFails_Returns1()

{

TestingAnalyzer tf;
tf.findApiCallWillBeReturned = false;



int test_ret = tf.Analyze();


int etalon_ret = 1;

ASSERT_EQ( test_ret, etalon_ret);

}

Analyze_WhenFindFails_Returns1()

{

Analyzer f;
std::unique_ptr p_twp =
std::make_unique();
p_twp->findApiCallWillBeReturned = false;
SetWindowsProcessor( std::move( p_twr ) );


int test_ret = tf.Analyze();


int etalon_ret = 1;

ASSERT_EQ( test_ret, etalon_ret);

}



Создаем
боевой объект

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 118

Обновление тестов

118


Analyze_WhenFindFails_Returns1()

{

Analyzer f;
std::unique_ptr p_twp =


std::make_unique();
p_twp->findApiCallWillBeReturned = false;
SetWindowsProcessor( std::move( p_twr ) );


int test_ret = tf.Analyze();


int etalon_ret = 1;

ASSERT_EQ( test_ret, etalon_ret);

}



Создаем
stub-объект

Analyze_WhenFindFails_Returns1()

{

TestingAnalyzer tf;
tf.findApiCallWillBeReturned = false;


int test_ret = tf.Analyze();


int etalon_ret = 1;

ASSERT_EQ( test_ret, etalon_ret);

}

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 119

Обновление тестов

119


Analyze_WhenFindFails_Returns1()

{

Analyzer f;
std::unique_ptr p_twp =


std::make_unique();
p_twp->findApiCallWillBeReturned = false;
SetWindowsProcessor( std::move( p_twr ) );


int test_ret = tf.Analyze();


int etalon_ret = 1;

ASSERT_EQ( test_ret, etalon_ret);

}



Настраиваем
stub-объект

Analyze_WhenFindFails_Returns1()

{

TestingAnalyzer tf;
tf.findApiCallWillBeReturned = false;


int test_ret = tf.Analyze();


int etalon_ret = 1;

ASSERT_EQ( test_ret, etalon_ret);

}

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 120

Обновление тестов

120


Analyze_WhenFindFails_Returns1()

{

Analyzer f;
std::unique_ptr p_twp =


std::make_unique();
p_twp->findApiCallWillBeReturned = false;
f.SetWindowsProcessor( std::move( p_twr ) );


int test_ret = tf.Analyze();


int etalon_ret = 1;

ASSERT_EQ( test_ret, etalon_ret);

}

Внедряем
зависимость

Analyze_WhenFindFails_Returns1()

{

TestingAnalyzer tf;
tf.findApiCallWillBeReturned = false;


int test_ret = tf.Analyze();


int etalon_ret = 1;

ASSERT_EQ( test_ret, etalon_ret);

}

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 121

Обновление тестов

121


Analyze_WhenFindFails_Returns1()

{

Analyzer f;
std::unique_ptr p_twp =


std::make_unique();
p_twp->findApiCallWillBeReturned = false;
f.SetWindowsProcessor( std::move( p_twr ) );


int test_ret = tf.Analyze();


int etalon_ret = 1;

ASSERT_EQ( test_ret, etalon_ret);

}

Проводим
тестируемое

действие

Analyze_WhenFindFails_Returns1()

{

TestingAnalyzer tf;
tf.findApiCallWillBeReturned = false;


int test_ret = tf.Analyze();


int etalon_ret = 1;

ASSERT_EQ( test_ret, etalon_ret);

}

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 122

Обновление тестов

122


Analyze_WhenFindFails_Returns1()

{

Analyzer f;
std::unique_ptr p_twp =


std::make_unique();
p_twp->findApiCallWillBeReturned = false;
f.SetWindowsProcessor( std::move( p_twr ) );


int test_ret = tf.Analyze();


int etalon_ret = 1;

ASSERT_EQ( test_ret, etalon_ret);

}

Оцениваем
результат

Analyze_WhenFindFails_Returns1()

{

TestingAnalyzer tf;
tf.findApiCallWillBeReturned = false;


int test_ret = tf.Analyze();


int etalon_ret = 1;

ASSERT_EQ( test_ret, etalon_ret);

}

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 123

Обновление тестов

123

Analyze_WhenProcFails_Returns2()

{

Analyzer f;
std::unique_ptr p_twp =

std::make_unique();
p_twr->findApiCallWillBeReturned = true;
p_twr->procApiCallWillBeReturned = false;
f.SetWindowsProcessor( std::move( p_twp ) );


int test_ret = t.Analyze();


int etalon_ret = 2;

ASSERT_EQ( test_ret, etalon_ret);

}

Analyze_WhenProcFails_Returns2()

{

TestingAnalyzer tf;
tf.findApiCallWillBeReturned = true;
tf.procApiCallWillBeReturned = false;


int test_ret = tf.Analyze();


int etalon_ret = 2;

ASSERT_EQ( test_ret, etalon_ret);

}

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 124

Обновление тестов

124

Analyze_WhenSucceeded_Returns0()

{

Analyzer f;
std::unique_ptr p_twp =

std::make_unique();
p_twr->findApiCallWillBeReturned = true;
p_twr->procApiCallWillBeReturned = true;
p_twr->thirdFunclWillBeReturned = false;
f.SetWindowsProcessor( std::move( p_twp ) );


int test_ret = t.Analyze();


int etalon_ret = 0;

ASSERT_EQ( test_ret, etalon_ret);

}

Analyze_WhenSucceed_Returns0()

{

TestingAnalyzer tf;
tf.findApiCallWillBeReturned = true;
tf.procApiCallWillBeReturned = true;


int test_ret = tf.Analyze();


int etalon_ret = 0;

ASSERT_EQ( test_ret, etalon_ret);

}

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 125

Общие рекомендации и практические приемы

125

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange

Editor DEMO

PDF-XChange Editor DEMO

Слайд 126

Рекомендации

•Общий принцип: рефакторинг кода с целью
локализации мест обращения к внешним

зависимостям


126

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 127

Рекомендации

•Общий принцип: рефакторинг кода с целью
локализации мест обращения к внешним

зависимостям



•Сохраняем сигнатуры методов при
внесении изменений

127

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 128

Практические приемы

128

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 129

Практические приемы

• Один тест — один результат работы

129

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange

Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 130

Практические приемы

130

TEST_F( EntryAnalyzerTest,
Analyze_TooShortEntryName_ReturnsFalseLoggsErrorToWebServer )

{

TestingEntryAnalyzer ea;


bool is_valid = ea.Analyze( "e" );
std::string s_err_msg = ea.lastErrMsg;


bool b_test_result = ( false == is_valid && "Error: e" == s_err_msg );
ASSERT_EQ( test_result, true );

}

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 131

Практические приемы

131

TEST_F( EntryAnalyzerTest,
Analyze_TooShortEntryName_ReturnsFalseLoggsErrorToWebServer )

{

TestingEntryAnalyzer ea;


bool is_valid = ea.Analyze( "e" );
std::string s_err_msg = ea.lastErrMsg;


bool b_test_result = ( false == is_valid && "Error: e" == s_err_msg );
ASSERT_EQ( test_result, true );

}

X

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 132

Практические приемы

132

TEST_F( EntryAnalyzerTest,
Analyze_TooShortEntryName_ReturnsFalseLoggsErrorToWebServer )

{

TestingEntryAnalyzer ea;


bool is_valid = ea.Analyze( "e" );
std::string s_err_msg = ea.lastErrMsg;


bool b_test_result = ( false == is_valid && "Error: e" == s_err_msg );
ASSERT_EQ( test_result, true );

}

1

2

X

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 133

Практические приемы

133

TEST_F( EntryAnalyzerTest,
Analyze_TooShortEntryName_ReturnsFalseLoggsErrorToWebServer )

{

TestingEntryAnalyzer ea;


bool is_valid = ea.Analyze( "e" );
std::string s_err_msg = ea.lastErrMsg;


bool b_test_result = ( false == is_valid && "Error: e" == s_err_msg );
ASSERT_EQ( test_result, true );

}

1

? 2

X

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 134

Практические приемы

134

TEST_F( EntryAnalyzerTest,
Analyze_TooShortEntryName_ReturnsFalseLoggsErrorToWebServer )

{

TestingEntryAnalyzer ea;


bool is_valid = ea.Analyze( "e" );
std::string s_err_msg = ea.lastErrMsg;


ASSERT_EQ( is_valid, false );
ASSERT_EQ( s_err_msg, "Error: e" );

}

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 135

Практические приемы

135

TEST_F( EntryAnalyzerTest,
Analyze_TooShortEntryName_ReturnsFalseLoggsErrorToWebServer )

{

TestingEntryAnalyzer ea;


bool is_valid = ea.Analyze( "e" );
std::string s_err_msg = ea.lastErrMsg;


ASSERT_EQ( is_valid, false );
ASSERT_EQ( s_err_msg, "Error: e" );

}

1

? 2

X

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 136

Практические приемы

• Один тест — один результат работы

136

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange

Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 137

Практические приемы

• Один тест — один результат работы

• Тестируем только публичные

методы

137

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 138

Практические приемы

• Один тест — один результат работы

• Тестируем только публичные

методы
• Нет ветвления

•операторы: switch, if, else
•циклы: for, while, std::for_each

138

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 139

Практические приемы

• Один тест — один результат работы

• Тестируем только публичные

методы
• Нет ветвления

•операторы: switch, if, else
•циклы: for, while, std::for_each

• Юнит тест — последовательность вызовов методов + assert

139

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 140

Практические приемы

• Один тест — один результат работы

• Тестируем только публичные

методы
• Нет ветвления

•операторы: switch, if, else
•циклы: for, while, std::for_each

• Юнит тест — последовательность вызовов методов + assert
• Используем фабрики

140

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 141

Практические приемы

141

TEST_F( EntryAnalyzerTest,
Analyze_Condition1_ReturnsTrue )
{

EntryAnalyzer ea;

ea.Analyze( "name1" );


}

TEST_F( EntryAnalyzerTest,
Analyze_Condition2_ReturnsTrue )
{

EntryAnalyzer ea;

ea.Analyze( "name2" );


}

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 142

Практические приемы

142

TEST_F( EntryAnalyzerTest,
Analyze_Condition1_ReturnsTrue )
{

EntryAnalyzer ea;

ea.Analyze( "name1" );


}

TEST_F( EntryAnalyzerTest,
Analyze_Condition2_ReturnsTrue )
{

EntryAnalyzer ea;

ea.Analyze( "name2" );


}

EntryAnalyzer ea(
std::string s_db_name );


PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 143

Практические приемы

143

TEST_F( EntryAnalyzerTest,
Analyze_Condition1_ReturnsTrue )
{

EntryAnalyzer ea;

ea.Analyze( “name1" );


}

TEST_F( EntryAnalyzerTest,
Analyze_Condition2_ReturnsTrue )
{

EntryAnalyzer ea;

ea.Analyze( "name2" );


}

EntryAnalyzer ea(
std::string s_db_name );


PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 144

Практические приемы

144

TEST_F( EntryAnalyzerTest,
Analyze_Condition1_ReturnsTrue )
{

EntryAnalyzer ea;

ea.Analyze( “name1" );


}

TEST_F( EntryAnalyzerTest,
Analyze_Condition2_ReturnsTrue )
{

EntryAnalyzer ea;

ea.Analyze( "name2" );


}

EntryAnalyzer ea(
std::string s_db_name );


std::unique_ptr CreateDefaultEntryAnalyzer()

{

std::string s_db_name( "DummmyDB" )

return std::make_unique( s_db_name );

}

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 145

Практические приемы

145

TEST_F( EntryAnalyzerTest,
Analyze_Condition1_ReturnsTrue )
{

EntryAnalyzer ea;

ea.Analyze( “name1" );


}

TEST_F( EntryAnalyzerTest,
Analyze_Condition2_ReturnsTrue )
{

EntryAnalyzer ea;

ea.Analyze( "name2" );


}

EntryAnalyzer ea(
std::string s_db_name );


TEST_F( EntryAnalyzerTest,
Analyze_Condition1_ReturnsTrue )

{

std::unique_ptr p_ea =
CreateDefaultEntryAnalyzer;
p_ea->Analyze( "name1" );


}

TEST_F( EntryAnalyzerTest,
Analyze_Condition2_ReturnsTrue )

{

std::unique_ptr p_ea =
CreateDefaultEntryAnalyzer;
p_ea->Analyze( "name2" );


}

std::unique_ptr CreateDefaultEntryAnalyzer()

{

std::string s_db_name( "DummmyDB" )

return std::make_unique( s_db_name );

}

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 146

Практические приемы

146

TEST_F( EntryAnalyzerTest,
Analyze_Condition1_ReturnsTrue )
{

EntryAnalyzer ea;

ea.Analyze( “name1" );


}

TEST_F( EntryAnalyzerTest,
Analyze_Condition2_ReturnsTrue )
{

EntryAnalyzer ea;

ea.Analyze( "name2" );


}

EntryAnalyzer ea(
std::string s_db_name );


TEST_F( EntryAnalyzerTest,
Analyze_Condition1_ReturnsTrue )

{

std::unique_ptr p_ea =
CreateDefaultEntryAnalyzer;
p_ea->Analyze( "name1" );


}

TEST_F( EntryAnalyzerTest,
Analyze_Condition2_ReturnsTrue )

{

std::unique_ptr p_ea =
CreateDefaultEntryAnalyzer;
p_ea->Analyze( "name2" );


}

std::unique_ptr CreateDefaultEntryAnalyzer()

{

std::string s_db_name( "DummmyDB" )

return std::make_unique( s_db_name );

}

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 147

Практические приемы

• Один тест — один результат работы

• Тестируем только публичные

методы
• Нет ветвления

•операторы: switch, if, else
•циклы: for, while, std::for_each

• Юнит тест — последовательность вызовов методов + assert
• Используем фабрики

147

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 148

Где почитать подробнее

• Майкл Физерс

“Эффективная работа с унаследованным кодом”





148

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Слайд 149

Где почитать подробнее

• Майкл Физерс

“Эффективная работа с унаследованным кодом”


•Roy

Osherove

“The art of unit testing”. 2nd edition



149

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

PDF-XChange Editor DEMO

Имя файла: Юнит-тестирование-унаследованного-кода-безопасный-рефакторинг.pptx
Количество просмотров: 78
Количество скачиваний: 0