Проблема тестовых входных данных
TRANSCRIPT
![Page 1: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/1.jpg)
Проблема тестовых входных данныхSoftware Testing 101
Марат Ахин
Санкт-Петербургский государственный политехнический университет
2014
Марат Ахин (СПбГПУ) Input 2014 48 / 321
![Page 2: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/2.jpg)
Quiz
Марат Ахин (СПбГПУ) Input 2014 49 / 321
![Page 3: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/3.jpg)
Recap
Марат Ахин (СПбГПУ) Input 2014 50 / 321
![Page 4: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/4.jpg)
Проблемы тестирования Проблемы тестирования
Проблемы тестирования
What’s up, Doc? (с)
Проблема тестовых входных данныхПроблема наблюдаемостиПроблема «останова»Проблема тестового оракула
Марат Ахин (СПбГПУ) Input 2014 51 / 321
![Page 5: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/5.jpg)
Проблема тестовых входных данных
Содержание
1 Проблема тестовых входных данныхОбеспечение достижимостиВходные данныеТестовые данныеКлассы эквивалентности
2 Проблема неявных входных данных
3 Разработка через тестирование
4 Интеграционное тестирование
Марат Ахин (СПбГПУ) Input 2014 52 / 321
![Page 6: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/6.jpg)
Проблема тестовых входных данных Обеспечение достижимости
Обеспечение достижимости
Какими способами можно управлять выполнением кода?Изменением входных данныхИзменением самого исходного кода
Какой способ можно использовать для обеспечения достижимости(reachability)?
Марат Ахин (СПбГПУ) Input 2014 53 / 321
![Page 7: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/7.jpg)
Проблема тестовых входных данных Обеспечение достижимости
Обеспечение достижимости
Какими способами можно управлять выполнением кода?Изменением входных данныхИзменением самого исходного кода
Какой способ можно использовать для обеспечения достижимости(reachability)?
Марат Ахин (СПбГПУ) Input 2014 53 / 321
![Page 8: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/8.jpg)
Проблема тестовых входных данных Обеспечение достижимости
Обеспечение достижимости
Какими способами можно управлять выполнением кода?Изменением входных данныхИзменением самого исходного кода
Какой способ можно использовать для обеспечения достижимости(reachability)?
Марат Ахин (СПбГПУ) Input 2014 53 / 321
![Page 9: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/9.jpg)
Проблема тестовых входных данных Обеспечение достижимости
Обеспечение достижимости
Какими способами можно управлять выполнением кода?Изменением входных данныхИзменением самого исходного кода
Какой способ можно использовать для обеспечения достижимости(reachability)?
Марат Ахин (СПбГПУ) Input 2014 53 / 321
![Page 10: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/10.jpg)
Проблема тестовых входных данных Входные данные
Входные данные
Что такое входные данные?
Марат Ахин (СПбГПУ) Input 2014 54 / 321
![Page 11: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/11.jpg)
Проблема тестовых входных данных Входные данные
Входные данные
ФайлыФактические аргументы функцийСетевые пакетыРезультаты запроса к БДПоследовательность вызовов функцийКонфигурация ПО
Марат Ахин (СПбГПУ) Input 2014 55 / 321
![Page 12: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/12.jpg)
Проблема тестовых входных данных Тестовые данные
Тестовые данные
Почему бы просто не перебрать все возможные варианты?
1 int add(int a, int b) { ... }
18,446,744,073,709,551,616 вариантов
А если у тестируемого модуля есть внутреннее состояние?
Марат Ахин (СПбГПУ) Input 2014 56 / 321
![Page 13: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/13.jpg)
Проблема тестовых входных данных Тестовые данные
Тестовые данные
Марат Ахин (СПбГПУ) Input 2014 57 / 321
![Page 14: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/14.jpg)
Проблема тестовых входных данных Классы эквивалентности
Классы эквивалентности
Все пространство входных состояний можно разбить намножество классов эквивалентности
Каждый класс эквивалентности обрабатывается тестируемыммодулем одинаково с точки зрения спецификацииТестирование всех классов эквивалентности позволяет найтиошибки прямого нарушения спецификации
Как найти классы эквивалентности?
Марат Ахин (СПбГПУ) Input 2014 58 / 321
![Page 15: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/15.jpg)
Проблема тестовых входных данных Классы эквивалентности
Ad hoc testing
Тестирование методом «научного тыка»
Запускаем ПОСмотрим на результаты работы...PROFIT!
Марат Ахин (СПбГПУ) Input 2014 59 / 321
![Page 16: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/16.jpg)
Проблема тестовых входных данных Классы эквивалентности
Ad hoc testing
А что будет, если я нажму на этукнопочку?Если сложить два положительныхчисла, то...После умножения на ноль врезультате должен получится нольЕсли ввести очень большое число иудвоить его, то...
В чем проблемы при таком подходе к тестированию?
Марат Ахин (СПбГПУ) Input 2014 60 / 321
![Page 17: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/17.jpg)
Проблема тестовых входных данных Классы эквивалентности
Метод свободного поиска
Ad hoc testing + планирование
Описываем тест-планПроверяем ПО на соответствие тест-плану...PROFIT!
Марат Ахин (СПбГПУ) Input 2014 61 / 321
![Page 18: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/18.jpg)
Проблема тестовых входных данных Классы эквивалентности
Метод свободного поиска
Если ввести число «42», потомнажать «+», потом ввести «1» инажать «=», в результате должнополучиться «43»Многократные нажатия на «C» недолжны приводить к видимымизменениям в интерфейсе
В чем проблемы при таком подходе к тестированию?
Марат Ахин (СПбГПУ) Input 2014 62 / 321
![Page 19: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/19.jpg)
Проблема тестовых входных данных Классы эквивалентности
Анализ граничных значений
Баю баюшки баю, не ложися на краю...
Находим пограничные значения входных данныхПроверяем ПО вокруг выбранных пограничных значений...PROFIT!
Марат Ахин (СПбГПУ) Input 2014 63 / 321
![Page 20: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/20.jpg)
Проблема тестовых входных данных Классы эквивалентности
Анализ граничных значений
Если умножить любое число на «0»,должен получиться «0»Деление любого числа на «0»должно приводить к выводусоответствующей ошибкиЕсли изменить знак наибольшегопредставимого положительногочисла, должно получитьсясоответствующее ему отрицательноечисло
В чем проблемы при таком подходе к тестированию?
Марат Ахин (СПбГПУ) Input 2014 64 / 321
![Page 21: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/21.jpg)
Проблема тестовых входных данных Классы эквивалентности
Причинно-следственный анализ
А давайте сделаем все по уму!
Строим граф причинно-следственных связейПолностью покрываем граф тестами...PROFIT!
Марат Ахин (СПбГПУ) Input 2014 65 / 321
![Page 22: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/22.jpg)
Проблема тестовых входных данных Классы эквивалентности
Причинно-следственный анализ
При последовательном выполнениипрямой и обратной операции долженполучиться исходный результатОперации должны выполняться впорядке, соответствующем ихприоритетуПоследовательные нажатия «=»должны приводить к повторномувыполнению последней операции надпредыдущим результатом
В чем проблемы при таком подходе к тестированию?
Марат Ахин (СПбГПУ) Input 2014 66 / 321
![Page 23: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/23.jpg)
Проблема тестовых входных данных Классы эквивалентности
Примеры
kd-treestoimd5sumPDF reader
Марат Ахин (СПбГПУ) Input 2014 67 / 321
![Page 24: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/24.jpg)
Проблема неявных входных данных
Содержание
1 Проблема тестовых входных данных
2 Проблема неявных входных данныхНеявные входные данныеИспользование заглушек
3 Разработка через тестирование
4 Интеграционное тестирование
Марат Ахин (СПбГПУ) Input 2014 68 / 321
![Page 25: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/25.jpg)
Проблема неявных входных данных Неявные входные данные
Неявные входные данные
Покрывает ли спецификация все множество входных данных?В некоторых случаях – даВ большинстве случаев – нет
Почему?Проблема заключается в том, что на тестовый модуль, кромеявных, влияет множество неявных входных данныхНеявные входные данные часто не находят отражения вспецификации
Марат Ахин (СПбГПУ) Input 2014 69 / 321
![Page 26: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/26.jpg)
Проблема неявных входных данных Неявные входные данные
Неявные входные данные
Текущая дата/времяIP/MAC адресЛокаль пользователяИдентификаторы устройствКонтекстные переключения/планирование нитейСкорость поступления IP пакетовРитм нажатия клавиш на клавиатуре
Все это – примеры неявных входных данных
Марат Ахин (СПбГПУ) Input 2014 70 / 321
![Page 27: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/27.jpg)
Проблема неявных входных данных Неявные входные данные
Therac-25
Марат Ахин (СПбГПУ) Input 2014 71 / 321
![Page 28: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/28.jpg)
Проблема неявных входных данных Использование заглушек
Как учесть неявные входные данные?
Какими способами можно управлять выполнением кода?Изменением входных данныхИзменением самого исходного кода
Simulate and StubЗаменяем части модуля управляемыми заглушкамиЭто позволяет сделать неявные входные данные явнымиЭто также делает управление явными входными данными проще
Марат Ахин (СПбГПУ) Input 2014 72 / 321
![Page 29: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/29.jpg)
Проблема неявных входных данных Использование заглушек
Использование заглушек
Данный подход позволяет:имитировать возникновение редких ситуацийвнести детерминизм там, где его нет
Для того, чтобы можно было использовать S&S, тестируемыймодуль должен разрабатываться соответствующим образом
Марат Ахин (СПбГПУ) Input 2014 73 / 321
![Page 30: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/30.jpg)
Проблема неявных входных данных Использование заглушек
Mock-объекты
Пример S&S – mock-объекты
Повторяют внешний интерфейс тестируемого объектаМогут демонстрировать любое требуемое поведение
Марат Ахин (СПбГПУ) Input 2014 74 / 321
![Page 31: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/31.jpg)
Проблема неявных входных данных Использование заглушек
Mockito
1 @Test2 void testFoo () {3 List mockedList = mock(List.class);45 when(mockedList.get (0)). thenReturn("first");6 when(mockedList.get (1)). thenReturn("second");78 assertEquals("first", mockedList.get (0));9 assertEquals("second", mockedList.get (1));
10 assertEquals(null , mockedList.get (42));11 }
Марат Ахин (СПбГПУ) Input 2014 75 / 321
![Page 32: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/32.jpg)
Проблема неявных входных данных Использование заглушек
Mockito
Сервис аутентификации и авторизации
Вход пользователя с корректными логином/паролем долженприводить к переходу его учетной записи в активное состояние
Марат Ахин (СПбГПУ) Input 2014 76 / 321
![Page 33: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/33.jpg)
Проблема неявных входных данных Использование заглушек
Mockito
1 @Test2 void testLoginForValidUser () {3 IPasswordInfo passInfo = mock(IPasswordInfo.class );4 when(passInfo.matches(anyString ())). thenReturn(true);56 IAccount account = mock(IAccount.class);7 when(account.getPasswordInfo ()). thenReturn(passInfo );89 IAccountRepository repo = mock(IAccountRepository.class);
10 when(repo.find(anyString (), anyString ())). thenReturn(account );1112 AuthService service = new AuthService(repo);13 service.login("marat", "password2");1415 verify(account ). setLoggedIn(true);16 }
Марат Ахин (СПбГПУ) Input 2014 77 / 321
![Page 34: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/34.jpg)
Проблема неявных входных данных Использование заглушек
Mockito
Сервис аутентификации и авторизацииТри последовательные попытки входа пользователя снекорректным паролем должны приводить к блокированию егоучетной записи
Марат Ахин (СПбГПУ) Input 2014 78 / 321
![Page 35: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/35.jpg)
Проблема неявных входных данных Использование заглушек
Mockito
1 @Test2 void testBlockOnIncorrectLogin () {3 IPasswordInfo passInfo = mock(IPasswordInfo.class );4 when(passInfo.matches(anyString ())). thenReturn(false );56 IAccount account = mock(IAccount.class);7 when(account.getPasswordInfo ()). thenReturn(passInfo );89 IAccountRepository repo = mock(IAccountRepository.class);
10 when(repo.find(anyString (), anyString ())). thenReturn(account );1112 AuthService service = new AuthService(repo);13 service.login("bob", "111");14 service.login("bob", "123");15 service.login("bob", "321");1617 verify(account ). setBlocked(true);18 }
Марат Ахин (СПбГПУ) Input 2014 79 / 321
![Page 36: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/36.jpg)
Проблема неявных входных данных Использование заглушек
Mockito1 @Test2 void testBlockOnIncorrectLoginPerAccount () {3 IPasswordInfo aliceInfo = getMockedPasswordInfo(false );4 IPasswordInfo bobInfo = getMockedPasswordInfo(false);56 IAccount aliceAcc = getMockedAccount(aliceInfo );7 IAccount bobAcc = getMockedAccount(bobInfo );89 IAccountRepository repo = mock(IAccountRepository.class);
10 when(repo.find("alice", anyString ())). thenReturn(aliceAcc );11 when(repo.find("bob", anyString ())). thenReturn(bobAcc );1213 AuthService service = new AuthService(repo);14 service.login("bob", "111");15 service.login("alice", "111");16 service.login("bob", "123");17 service.login("alice", "123");18 service.login("bob", "321");1920 verify(aliceAcc , never ()). setBlocked(true);21 verify(bobAcc , times (1)). setBlocked(true);22 }
Марат Ахин (СПбГПУ) Input 2014 80 / 321
![Page 37: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/37.jpg)
Проблема неявных входных данных Использование заглушек
Mocks 6= Stubs 6= Fakes 6= Dummies
Разве есть разница?
DummiesОбъект-муляж, не обладающий собственным поведением
FakesУпрощенная реализация требуемой функциональности
StubsТестовая заглушка, способная отвечать на внешние запросы
MocksТестовая загрушка, способная отвечать на внешние запросы ипроверять их корректность
Марат Ахин (СПбГПУ) Input 2014 81 / 321
![Page 38: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/38.jpg)
Разработка через тестирование
Содержание
1 Проблема тестовых входных данных
2 Проблема неявных входных данных
3 Разработка через тестированиеTest-driven developmentПлюсы TDDМинусы TDD
4 Интеграционное тестирование
Марат Ахин (СПбГПУ) Input 2014 82 / 321
![Page 39: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/39.jpg)
Разработка через тестирование Test-driven development
Нужны ли заглушки?
А как использовать mock-объекты в процессе разработки?
Для управления неявными входными даннымиДля управления явными входными данными
А когда их следует использовать?
Марат Ахин (СПбГПУ) Input 2014 83 / 321
![Page 40: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/40.jpg)
Разработка через тестирование Test-driven development
Заглушки не нужны?
Никогда!
Зачем тратить время на разработку и использование заглушек?Можно просто подождать, пока не будут разработаны всекомпоненты
Получится проще, дешевле и лучше, чем с заглушками!
Марат Ахин (СПбГПУ) Input 2014 84 / 321
![Page 41: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/41.jpg)
Разработка через тестирование Test-driven development
Заглушки не нужны?
Все же будет хорошо, да?
Марат Ахин (СПбГПУ) Input 2014 85 / 321
![Page 42: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/42.jpg)
Разработка через тестирование Test-driven development
Заглушки нужны?
Чем дольше итерация, тем сложнее и дороже исправление ошибок
Чем быстрее будут написаны тесты для разрабатываемогокомпонента, тем проще найти ошибки
После разработки компонента пишем для него тестОтсутствующие части системы заменяем заглушками...PROFIT!
Марат Ахин (СПбГПУ) Input 2014 86 / 321
![Page 43: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/43.jpg)
Разработка через тестирование Test-driven development
Заглушки нужны?
А давайте писать тесты еще быстрее?
Марат Ахин (СПбГПУ) Input 2014 87 / 321
![Page 44: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/44.jpg)
Разработка через тестирование Test-driven development
Test-driven development
Пишем тест для компонента перед его разработкойЗаменяем сам компонент заглушкой...PROFIT???
Разве это будет работать?
Марат Ахин (СПбГПУ) Input 2014 88 / 321
![Page 45: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/45.jpg)
Разработка через тестирование Test-driven development
Test-driven development
Разве это будет работать?
Марат Ахин (СПбГПУ) Input 2014 89 / 321
![Page 46: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/46.jpg)
Разработка через тестирование Плюсы TDD
Плюсы TDD
Разработка ведется небольшими контролируемыми фрагментами
В каждый момент времени разработчик думает об ограниченномфрагменте спецификацииЭто упрощает анализ возможного пространства входных данныхКроме того, код получается более модульным и расширяемым
Марат Ахин (СПбГПУ) Input 2014 90 / 321
![Page 47: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/47.jpg)
Разработка через тестирование Плюсы TDD
Плюсы TDD
Минимальная цена ошибки
В случае возникновения ошибки очень просто вернуть систему врабочее состояниеПрактически отсутствует необходимость в отладкеКрайне просто использовать метод бисекции в случае, еслиошибка смогла пробраться в релиз
Марат Ахин (СПбГПУ) Input 2014 91 / 321
![Page 48: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/48.jpg)
Разработка через тестирование Плюсы TDD
Плюсы TDD
Ошибки обнаруживаются сразу же после их появления
Постоянный запуск тестов гарантирует практически моментальноеобнаружение ошибкиМалый размер тестов позволяет быстро найти причину ошибки
Марат Ахин (СПбГПУ) Input 2014 92 / 321
![Page 49: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/49.jpg)
Разработка через тестирование Плюсы TDD
Плюсы TDD
Сильно упрощается рефакторинг кода
Программист уверен в том, что его изменения ничего не ломаютОблегчается раздельное владение кодом
Марат Ахин (СПбГПУ) Input 2014 93 / 321
![Page 50: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/50.jpg)
Разработка через тестирование Плюсы TDD
Почему я слышу о TDD впервые в жизни?
Почему TDD не используют везде и всюду?!
Марат Ахин (СПбГПУ) Input 2014 94 / 321
![Page 51: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/51.jpg)
Разработка через тестирование Минусы TDD
Минусы TDD
Синдром «розовых очков»
Большое количество тестов создает иллюзию бесконечнойнадежности системы тестированияПри создании теста разработчик может сделать те же допущения,что и при разработке самого компонента
Марат Ахин (СПбГПУ) Input 2014 95 / 321
![Page 52: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/52.jpg)
Разработка через тестирование Минусы TDD
Минусы TDD
Поддержание тестов в актуальном состоянии
При внесении изменений в интерфейсы компонентов системынеобходимо соответствующим образом изменить и все тестыБольшое количество тестов приводит к значительным затратамна рефакторинг тестов
Марат Ахин (СПбГПУ) Input 2014 96 / 321
![Page 53: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/53.jpg)
Разработка через тестирование Минусы TDD
Минусы TDD
Невозможность тестирования сложного взаимодействия несколькихкомпонентов
Каждый тест проверяет ограниченный фрагментфункциональности системыВзаимодействие компонентов затрагивает множество аспектовсистемы сразу
Марат Ахин (СПбГПУ) Input 2014 97 / 321
![Page 54: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/54.jpg)
Разработка через тестирование Минусы TDD
Стоит ли использовать TDD?
Марат Ахин (СПбГПУ) Input 2014 98 / 321
![Page 55: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/55.jpg)
Интеграционное тестирование
Содержание
1 Проблема тестовых входных данных
2 Проблема неявных входных данных
3 Разработка через тестирование
4 Интеграционное тестированиеПроблема «Большого Взрыва»Нисходящее интеграционное тестированиеВосходящее интеграционное тестирование
Марат Ахин (СПбГПУ) Input 2014 99 / 321
![Page 56: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/56.jpg)
Интеграционное тестирование Проблема «Большого Взрыва»
Проблема «Большого Взрыва»
Когда приходит время заменять заглушки на реализацию...
Марат Ахин (СПбГПУ) Input 2014 100 / 321
![Page 57: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/57.jpg)
Интеграционное тестирование Проблема «Большого Взрыва»
Проблема «Большого Взрыва»
Поведение реализации может (и скорее всего будет) отличатьсяот поведения заглушкиЕсли заглушек было много...
Марат Ахин (СПбГПУ) Input 2014 101 / 321
![Page 58: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/58.jpg)
Интеграционное тестирование Проблема «Большого Взрыва»
Проблема «Большого Взрыва»
Каскадное распространение сбоевСложность локализации ошибокБольшая стоимость исправления ошибок
Что мы можем сделать?
Марат Ахин (СПбГПУ) Input 2014 102 / 321
![Page 59: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/59.jpg)
Интеграционное тестирование Проблема «Большого Взрыва»
Интеграционное тестирование
Ускорить процесс замены заглушек на реализацию
Выполнять тестирование взаимодействия постоянно, в процессеразработкиЗаменять заглушки на реализацию инкрементально
Инкрементальное интеграционное тестирование
Марат Ахин (СПбГПУ) Input 2014 103 / 321
![Page 60: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/60.jpg)
Интеграционное тестирование Проблема «Большого Взрыва»
Интеграционное тестирование
Марат Ахин (СПбГПУ) Input 2014 104 / 321
![Page 61: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/61.jpg)
Интеграционное тестирование Нисходящее интеграционное тестирование
Нисходящее интеграционное тестирование
Тестирование начинается с верхних уровней системыОтсутствующие на данный момент модули заменяются«заглушками»По мере реализации новых модулей они подключаются к системевместо «заглушек»
Марат Ахин (СПбГПУ) Input 2014 105 / 321
![Page 62: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/62.jpg)
Интеграционное тестирование Нисходящее интеграционное тестирование
Нисходящее интеграционное тестирование
ПреимуществаВозможность ранней проверки корректности высокоуровневогоповеденияМодули могут добавляться по одному, независимо друг от другаНе требуется разработка множества драйверовМожно разрабатывать систему как в глубину, так и в ширину
Марат Ахин (СПбГПУ) Input 2014 106 / 321
![Page 63: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/63.jpg)
Интеграционное тестирование Нисходящее интеграционное тестирование
Нисходящее интеграционное тестирование
НедостаткиОтложенная проверка низкоуровневого поведенияТребуется разработка «заглушек»Крайне сложно корректно сформулировать требования ковходам/выходам частичной системы
Марат Ахин (СПбГПУ) Input 2014 107 / 321
![Page 64: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/64.jpg)
Интеграционное тестирование Восходящее интеграционное тестирование
Восходящее интеграционное тестирование
Тестирование начинается с нижних уровней системыОтсутствующие на данный момент модули заменяютсядрайверамиПри реализации всех модулей нижнего уровня драйвер можетбыть заменен на соответствующий модуль
Марат Ахин (СПбГПУ) Input 2014 108 / 321
![Page 65: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/65.jpg)
Интеграционное тестирование Восходящее интеграционное тестирование
Восходящее интеграционное тестирование
ПреимуществаВозможность ранней проверки корректности низкоуровневогоповеденияНе требуется написание заглушекПросто определить требования ко входам/выходам модулей
Марат Ахин (СПбГПУ) Input 2014 109 / 321
![Page 66: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/66.jpg)
Интеграционное тестирование Восходящее интеграционное тестирование
Восходящее интеграционное тестирование
НедостаткиОтложенная проверка высокоуровневого поведенияТребуется разработка драйверовПри замене драйвера на модуль высокого уровня можетпроизойти «мини-Большой Взрыв»
Марат Ахин (СПбГПУ) Input 2014 110 / 321
![Page 67: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/67.jpg)
Проблемы тестирования Проблемы тестирования
Проблемы тестирования
What’s up, Doc? (с)
Проблема тестовых входных данныхПроблема наблюдаемостиПроблема «останова»Проблема тестового оракула
Марат Ахин (СПбГПУ) Input 2014 111 / 321
![Page 68: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/68.jpg)
Проблемы тестирования Проблемы тестирования
Обеспечение порчи внутреннего состояния
Для того, чтобы обеспечить порчу внутреннего состояния(corruption), необходимо:
обеспечить достижимостьпередать такие тестовые входные данные, которые вызываютнарушение целостности внутреннего состояния
См. проблему тестовых входных данных
Марат Ахин (СПбГПУ) Input 2014 112 / 321
![Page 69: Проблема тестовых входных данных](https://reader037.vdocuments.mx/reader037/viewer/2022103018/559937be1a28ab15178b4747/html5/thumbnails/69.jpg)
W.I.L.T. What I Learned Today?
W.I.L.T.
Марат Ахин (СПбГПУ) Input 2014 113 / 321