Академический Документы
Профессиональный Документы
Культура Документы
Марат Ахин
2018
4 Интеграционное тестирование
Файлы
Фактические аргументы функций
Сетевые пакеты
Результаты запроса к БД
Последовательность вызовов функций
Конфигурация ПО
18,446,744,073,709,551,616 вариантов
Запускаем ПО
Смотрим на результаты работы
...
PROFIT!
Описываем тест-план
Проверяем ПО на соответствие тест-плану
...
PROFIT!
kd-tree
stoi
md5sum
PDF reader
4 Интеграционное тестирование
Почему?
Проблема заключается в том, что на тестовый модуль, кроме
явных, влияет множество неявных входных данных
Неявные входные данные часто не находят отражения в
спецификации
Текущая дата/время
IP/MAC адрес
Локаль пользователя
Идентификаторы устройств
Контекстные переключения/планирование нитей
Скорость поступления IP пакетов
Ритм нажатия клавиш на клавиатуре
1 @Test
2 void testFoo () {
3 List mockedList = mock ( List . class );
4
5 when ( mockedList . get (0)). thenReturn ( " first " );
6 when ( mockedList . get (1)). thenReturn ( " second " );
7
8 assertEquals ( " first " , mockedList . get (0));
9 assertEquals ( " second " , mockedList . get (1));
10 assertEquals ( null , mockedList . get (42));
11 }
1 @Test
2 void t e s t L o g i n F o r V a l i d U s e r () {
3 IPasswordInfo passInfo = mock ( IPasswordInfo . class );
4 when ( passInfo . matches ( anyString ())). thenReturn ( true );
5
6 IAccount account = mock ( IAccount . class );
7 when ( account . ge t Pa ss w or d In fo ()). thenReturn ( passInfo );
8
9 I A c c o u n t R e p o s i t o r y repo = mock ( I A c c o u n t R e p o s i t o r y . class );
10 when ( repo . find ( anyString () , anyString ())). thenReturn ( account );
11
12 AuthService service = new AuthService ( repo );
13 service . login ( " marat " , " password2 " );
14
15 verify ( account ). setLoggedIn ( true );
16 }
1 @Test
2 void t e s t B l o c k O n I n c o r r e c t L o g i n () {
3 IPasswordInfo passInfo = mock ( IPasswordInfo . class );
4 when ( passInfo . matches ( anyString ())). thenReturn ( false );
5
6 IAccount account = mock ( IAccount . class );
7 when ( account . ge t Pa ss w or d In fo ()). thenReturn ( passInfo );
8
9 I A c c o u n t R e p o s i t o r y repo = mock ( I A c c o u n t R e p o s i t o r y . class );
10 when ( repo . find ( anyString () , anyString ())). thenReturn ( account );
11
12 AuthService service = new AuthService ( repo );
13 service . login ( " bob " , " 111 " );
14 service . login ( " bob " , " 123 " );
15 service . login ( " bob " , " 321 " );
16
17 verify ( account ). setBlocked ( true );
18 }
Dummies
Объект-муляж, не обладающий собственным поведением
Fakes
Упрощенная реализация требуемой функциональности
Stubs
Тестовая заглушка, способная отвечать на внешние запросы
Mocks
Тестовая загрушка, способная отвечать на внешние запросы и
проверять их корректность
4 Интеграционное тестирование
Никогда!
4 Интеграционное тестирование
Проблема «Большого Взрыва»
Нисходящее интеграционное тестирование
Восходящее интеграционное тестирование
Преимущества
Возможность ранней проверки корректности высокоуровневого
поведения
Модули могут добавляться по одному, независимо друг от друга
Не требуется разработка множества драйверов
Можно разрабатывать систему как в глубину, так и в ширину
Недостатки
Отложенная проверка низкоуровневого поведения
Требуется разработка «заглушек»
Крайне сложно корректно сформулировать требования ко
входам/выходам частичной системы
Преимущества
Возможность ранней проверки корректности низкоуровневого
поведения
Не требуется написание заглушек
Просто определить требования ко входам/выходам модулей
Недостатки
Отложенная проверка высокоуровневого поведения
Требуется разработка драйверов
При замене драйвера на модуль высокого уровня может
произойти «мини-Большой Взрыв»