SlideShare a Scribd company logo
Tестирование программного обеспечения
Что, зачем и почему?
Software Testing 101
Марат Ахин
Санкт-Петербургский политехнический университет
2016
Марат Ахин (СПбПУ) Intro 2016 1 / 359
Содержание
1 Прелюдия
Обеспечение качества ПО
Тестирование ПО
2 Тестирование за 45 минут
3 Тестирование в процессе разработки ПО
4 Проблема тестовых входных данных
5 Проблема неявных входных данных
6 Разработка через тестирование
7 Интеграционное тестирование
Марат Ахин (СПбПУ) Intro 2016 2 / 359
Обеспечение качества ПО
Функциональные vs нефункциональные требования
Марат Ахин (СПбПУ) Intro 2016 3 / 359
Обеспечение качества ПО
Функциональные требования
Адекватность
Точность
Интероперабельность
Безопасность
Нефункциональные требования
Надежность
Эффективность
Поддерживаемость
Переносимость
Как можно их проверять?
Марат Ахин (СПбПУ) Intro 2016 4 / 359
Обеспечение качества ПО
Марат Ахин (СПбПУ) Intro 2016 5 / 359
Обеспечение качества ПО
Thinking is hard, running is simple. (c)
Запустить программу просто и это можно сделать всегда
Думать о программе сложно и требует «высшего знания»
Будем запускать программу, чтобы проверить, отвечает ли она
предъявленным требованиям
Марат Ахин (СПбПУ) Intro 2016 6 / 359
Что такое тестирование ПО?
То, чем вы будете заниматься до 80% времени
Марат Ахин (СПбПУ) Intro 2016 7 / 359
Что за вопрос лежит в основе тестирования?
Работает ли это ПО правильно?
НЕТ
Работает ли это ПО неправильно?
ДА
Тестирование
=
Разрушение
Марат Ахин (СПбПУ) Intro 2016 8 / 359
Что за вопрос лежит в основе тестирования?
Работает ли это ПО правильно?
НЕТ
Работает ли это ПО неправильно?
ДА
Тестирование
=
Разрушение
Марат Ахин (СПбПУ) Intro 2016 8 / 359
Что за вопрос лежит в основе тестирования?
Работает ли это ПО правильно?
НЕТ
Работает ли это ПО неправильно?
ДА
Тестирование
=
Разрушение
Марат Ахин (СПбПУ) Intro 2016 8 / 359
Что за вопрос лежит в основе тестирования?
Работает ли это ПО правильно?
НЕТ
Работает ли это ПО неправильно?
ДА
Тестирование
=
Разрушение
Марат Ахин (СПбПУ) Intro 2016 8 / 359
Что за вопрос лежит в основе тестирования?
Работает ли это ПО правильно?
НЕТ
Работает ли это ПО неправильно?
ДА
Тестирование
=
Разрушение
Марат Ахин (СПбПУ) Intro 2016 8 / 359
Кому помогает тестирование?
Лучший друг верификации и валидации ПО
В чем разница?
Верификация – «мы сделали это правильно»
Валидация – «мы сделали то, что надо»
Марат Ахин (СПбПУ) Intro 2016 9 / 359
Можем ли мы что-то гарантировать при тестировании?
Данное ПО никогда не упадет
Потоки никогда не заблокируются
Вычисления всегда выполняются корректно
Временные характеристики всегда выдерживаются
Мы можем дать такие гарантии лишь в самых тривиальных случаях,
когда обычно все ясно и без тестирования
Марат Ахин (СПбПУ) Intro 2016 10 / 359
Можем ли мы что-то гарантировать при тестировании?
Данное ПО никогда не упадет
Потоки никогда не заблокируются
Вычисления всегда выполняются корректно
Временные характеристики всегда выдерживаются
Мы можем дать такие гарантии лишь в самых тривиальных случаях,
когда обычно все ясно и без тестирования
Марат Ахин (СПбПУ) Intro 2016 10 / 359
Почему тестировать сложно?
Brian Kernighan
«Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by
definition, not smart enough to debug it.»
Massimo Arnoldi (feat. Kent Beck)
«Unfortunately at least for me (and not only) testing goes against human
nature. If you realize the pig in you, you will see that you program without
tests.»
Марат Ахин (СПбПУ) Intro 2016 11 / 359
Почему тестировать нужно?
Если отложить сегодняшние дела на послезавтра, у вас появятся два
свободных дня! (с)
Марат Ахин (СПбПУ) Intro 2016 12 / 359
Что же делать?
Марат Ахин (СПбПУ) Intro 2016 13 / 359
Содержание
1 Прелюдия
2 Тестирование за 45 минут
Тестирование ПО с точки зрения дилетанта
Модель программной ошибки
Модель тестирования ПО
Процесс тестирования ПО
3 Тестирование в процессе разработки ПО
4 Проблема тестовых входных данных
5 Проблема неявных входных данных
6 Разработка через тестирование
7 Интеграционное тестированиеМарат Ахин (СПбПУ) Intro 2016 14 / 359
Тестирование ПО с точки зрения дилетанта
Запустили приложение
Проверили результаты выполнения на предмет наличия в них
ошибок
aka «багов»
aka «сбоев»
aka «дефектов»
aka «неудач»
Сперва надо разобраться, а что же такое «программная ошибка»?
Марат Ахин (СПбПУ) Intro 2016 15 / 359
Модель программной ошибки
FAILURE
FAULT
ERROR
Неудача – наблюдаемое снаружи
некорректное поведение программы
Сбой – некорректное состояние
программы из-за ошибки
Ошибка – ошибка в самой
программе, внесенная на этапе
разработки
Рассмотрим данную модель на примере
Марат Ахин (СПбПУ) Intro 2016 16 / 359
Модель программной ошибки
Найдите ошибку в следующей программе на Java
1 int sumCollection (final @NotNull Collection <Integer > c) {
2 int sum = 0;
3 for (int i : c) {
4 sum += i;
5 }
6 return sum;
7 }
Возможное переполнение в строке 4
Марат Ахин (СПбПУ) Intro 2016 17 / 359
Модель программной ошибки
Найдите ошибку в следующей программе на Java
1 int sumCollection (final @NotNull Collection <Integer > c) {
2 int sum = 0;
3 for (int i : c) {
4 sum += i;
5 }
6 return sum;
7 }
Возможное переполнение в строке 4
Марат Ахин (СПбПУ) Intro 2016 17 / 359
Модель программной ошибки
c = {}
Что будет?
1 int sumCollection (final @NotNull Collection <Integer > c) {
2 int sum = 0;
3 for (int i : c) {
4 sum += i;
5 }
6 return sum;
7 }
Нет ни сбоя, ни неудачи – программа работает корректно
Марат Ахин (СПбПУ) Intro 2016 18 / 359
Модель программной ошибки
c = {}
Что будет?
1 int sumCollection (final @NotNull Collection <Integer > c) {
2 int sum = 0;
3 for (int i : c) {
4 sum += i;
5 }
6 return sum;
7 }
Нет ни сбоя, ни неудачи – программа работает корректно
Марат Ахин (СПбПУ) Intro 2016 18 / 359
Модель программной ошибки
c = {1, 2, 3, 5}
Что будет?
1 int sumCollection (final @NotNull Collection <Integer > c) {
2 int sum = 0;
3 for (int i : c) {
4 sum += i;
5 }
6 return sum;
7 }
Нет ни сбоя, ни неудачи – программа работает корректно
Марат Ахин (СПбПУ) Intro 2016 19 / 359
Модель программной ошибки
c = {1, 2, 3, 5}
Что будет?
1 int sumCollection (final @NotNull Collection <Integer > c) {
2 int sum = 0;
3 for (int i : c) {
4 sum += i;
5 }
6 return sum;
7 }
Нет ни сбоя, ни неудачи – программа работает корректно
Марат Ахин (СПбПУ) Intro 2016 19 / 359
Модель программной ошибки
c = {1, 2, 3, 5, Integer.MAX_VALUE, Integer.MIN_VALUE}
Что будет?
1 int sumCollection (final @NotNull Collection <Integer > c) {
2 int sum = 0;
3 for (int i : c) {
4 sum += i;
5 }
6 return sum;
7 }
Сбой есть – программа проходит через некорректное состояние
Но неудачи нет – результат работы программы корректен
Марат Ахин (СПбПУ) Intro 2016 20 / 359
Модель программной ошибки
c = {1, 2, 3, 5, Integer.MAX_VALUE, Integer.MIN_VALUE}
Что будет?
1 int sumCollection (final @NotNull Collection <Integer > c) {
2 int sum = 0;
3 for (int i : c) {
4 sum += i;
5 }
6 return sum;
7 }
Сбой есть – программа проходит через некорректное состояние
Но неудачи нет – результат работы программы корректен
Марат Ахин (СПбПУ) Intro 2016 20 / 359
Модель программной ошибки
c = {1, 2, 3, 5, Integer.MAX_VALUE}
Что будет?
1 int sumCollection (final @NotNull Collection <Integer > c) {
2 int sum = 0;
3 for (int i : c) {
4 sum += i;
5 }
6 return sum;
7 }
Сбой есть – программа проходит через некорректное состояние
Неудача тоже есть – результат работы программы неправильный
Марат Ахин (СПбПУ) Intro 2016 21 / 359
Модель программной ошибки
c = {1, 2, 3, 5, Integer.MAX_VALUE}
Что будет?
1 int sumCollection (final @NotNull Collection <Integer > c) {
2 int sum = 0;
3 for (int i : c) {
4 sum += i;
5 }
6 return sum;
7 }
Сбой есть – программа проходит через некорректное состояние
Неудача тоже есть – результат работы программы неправильный
Марат Ахин (СПбПУ) Intro 2016 21 / 359
Что мы делали?
Запускали ПО (мысленно)
Сравнивали результаты работы с ожидаемыми (логически)
Можно ли придумать другой способ тестирования?
Марат Ахин (СПбПУ) Intro 2016 22 / 359
Модель тестирования ПО
Эталонная модель может быть
представлена множеством различных
способов
неформальное представление о том,
«как должна работать программа»
формальная техническая
спецификация
набор тестовых примеров
корректные результаты работы
программы
другая (априори корректная)
реализация той же исходной
спецификации
Марат Ахин (СПбПУ) Intro 2016 23 / 359
Процесс тестирования ПО
Что может случиться?
Марат Ахин (СПбПУ) Intro 2016 24 / 359
Тест прошел
A-WE-SO-ME!
Марат Ахин (СПбПУ) Intro 2016 25 / 359
Тест не прошел
OH-MI-GOD!
Марат Ахин (СПбПУ) Intro 2016 26 / 359
Ошибка в ПО
Все просто и понятно, да?
Марат Ахин (СПбПУ) Intro 2016 27 / 359
Ошибка в эталонной модели
Некорректный тест? Ошибка в спецификации?
Марат Ахин (СПбПУ) Intro 2016 28 / 359
Ошибка в тестовом окружении
Баг в тестовой библиотеке?
Марат Ахин (СПбПУ) Intro 2016 29 / 359
Ошибка в платформе
Баг в ОС? Аппаратный сбой? Ошибка компилятора?
Марат Ахин (СПбПУ) Intro 2016 30 / 359
Процесс тестирования ПО
Является ли данная модель самодостаточной?
Марат Ахин (СПбПУ) Intro 2016 31 / 359
Процесс тестирования ПО
Откуда брать эталонную модель?
Как сравнивать результаты работы программы и модели?
Марат Ахин (СПбПУ) Intro 2016 32 / 359
Процесс тестирования ПО
Когда останавливать процесс тестирования?
Марат Ахин (СПбПУ) Intro 2016 33 / 359
Процесс тестирования ПО
Как подобрать входные данные, чтобы:
дойти до места с программной ошибкой (Reachibility)
испортить состояние программы с появлением сбоя (Corruption)
вызвать неудачу в работе программы (Propagation)
Марат Ахин (СПбПУ) Intro 2016 34 / 359
Проблемы тестирования
What’s up, Doc? (с)
Проблема тестовых входных данных
Проблема наблюдаемости
Проблема «останова»
Проблема тестового оракула
Марат Ахин (СПбПУ) Intro 2016 35 / 359
Содержание
1 Прелюдия
2 Тестирование за 45 минут
3 Тестирование в процессе разработки ПО
Модели разработки ПО
Проблемы тестирования ПО
4 Проблема тестовых входных данных
5 Проблема неявных входных данных
6 Разработка через тестирование
7 Интеграционное тестирование
Марат Ахин (СПбПУ) Intro 2016 36 / 359
Модели разработки ПО
Чем активнее используется тестирование в процессе разработки,
тем важнее его правильное использование
Марат Ахин (СПбПУ) Intro 2016 37 / 359
Водопадная модель
Строго последовательная модель
разработки
Тестирование выполняется над всей
программой сразу
Имеется хорошая эталонная модель
Стоимость поиска и исправления
ошибок очень высока
Марат Ахин (СПбПУ) Intro 2016 38 / 359
Инкрементальная модель
Разработка проходит в несколько
итераций
Тестируются отдельные версии
программы
Имеется неплохая эталонная модель
Стоимость поиска и исправления
ошибок высока
Марат Ахин (СПбПУ) Intro 2016 39 / 359
Гибкая модель
Все этапы разработки неразрывно
связаны друг с другом
Тестированию подвергаются как сама
программа, так и ее компоненты
Эталонная модель есть не всегда
Стоимость поиска и исправления
ошибок относительно низка
Марат Ахин (СПбПУ) Intro 2016 40 / 359
Проблемы тестирования ПО
Разве что-то может пойти совсем плохо?
Марат Ахин (СПбПУ) Intro 2016 41 / 359
Розовые очки
Марат Ахин (СПбПУ) Intro 2016 42 / 359
Розовые очки
Неправильное тестирование создает иллюзию, что все хорошо...
...тогда как на самом деле все может быть очень и очень плохо
Все тесты проходят
Выпускаем код в релиз
...
BOOM!
Марат Ахин (СПбПУ) Intro 2016 43 / 359
Наводнение
Марат Ахин (СПбПУ) Intro 2016 44 / 359
Наводнение
Неправильное тестирование создает иллюзию, что все плохо...
...тогда как на самом деле все вполне себе ничего
Большинство тестов не проходит
Садимся и исправляем ошибки
...
UNREACHABLE!
Марат Ахин (СПбПУ) Intro 2016 45 / 359
Прятки
Марат Ахин (СПбПУ) Intro 2016 46 / 359
Прятки
Неправильное тестирование создает иллюзию, что все плохо...
...тогда как на самом деле все плохо в другом месте
Некоторые тесты не проходит
Садимся и ищем ошибки
...
HUH?
Марат Ахин (СПбПУ) Intro 2016 47 / 359
Что же делать?
Марат Ахин (СПбПУ) Intro 2016 48 / 359
Что же делать?
Марат Ахин (СПбПУ) Intro 2016 49 / 359
W.I.L.T.
Марат Ахин (СПбПУ) Intro 2016 50 / 359
Проблема тестовых входных данных
Software Testing 101
Марат Ахин
Санкт-Петербургский политехнический университет
2016
Марат Ахин (СПбПУ) Input 2016 51 / 359
Quiz
Марат Ахин (СПбПУ) Input 2016 52 / 359
Recap
Марат Ахин (СПбПУ) Input 2016 53 / 359
Проблемы тестирования
What’s up, Doc? (с)
Проблема тестовых входных данных
Проблема наблюдаемости
Проблема «останова»
Проблема тестового оракула
Марат Ахин (СПбПУ) Input 2016 54 / 359
Содержание
1 Прелюдия
2 Тестирование за 45 минут
3 Тестирование в процессе разработки ПО
4 Проблема тестовых входных данных
Обеспечение достижимости
Входные данные
Тестовые данные
Классы эквивалентности
5 Проблема неявных входных данных
6 Разработка через тестирование
7 Интеграционное тестированиеМарат Ахин (СПбПУ) Input 2016 55 / 359
Обеспечение достижимости
Какими способами можно управлять выполнением кода?
Изменением входных данных
Изменением самого исходного кода
Какой способ можно использовать для обеспечения достижимости
(reachability)?
Марат Ахин (СПбПУ) Input 2016 56 / 359
Обеспечение достижимости
Какими способами можно управлять выполнением кода?
Изменением входных данных
Изменением самого исходного кода
Какой способ можно использовать для обеспечения достижимости
(reachability)?
Марат Ахин (СПбПУ) Input 2016 56 / 359
Обеспечение достижимости
Какими способами можно управлять выполнением кода?
Изменением входных данных
Изменением самого исходного кода
Какой способ можно использовать для обеспечения достижимости
(reachability)?
Марат Ахин (СПбПУ) Input 2016 56 / 359
Обеспечение достижимости
Какими способами можно управлять выполнением кода?
Изменением входных данных
Изменением самого исходного кода
Какой способ можно использовать для обеспечения достижимости
(reachability)?
Марат Ахин (СПбПУ) Input 2016 56 / 359
Входные данные
Что такое входные данные?
Марат Ахин (СПбПУ) Input 2016 57 / 359
Входные данные
Файлы
Фактические аргументы функций
Сетевые пакеты
Результаты запроса к БД
Последовательность вызовов функций
Конфигурация ПО
Марат Ахин (СПбПУ) Input 2016 58 / 359
Тестовые данные
Почему бы просто не перебрать все возможные варианты?
1 int add(int a, int b) { ... }
18,446,744,073,709,551,616 вариантов
А если у тестируемого модуля есть внутреннее состояние?
Марат Ахин (СПбПУ) Input 2016 59 / 359
Тестовые данные
Марат Ахин (СПбПУ) Input 2016 60 / 359
Классы эквивалентности
Все пространство входных состояний можно разбить на
множество классов эквивалентности
Каждый класс эквивалентности обрабатывается тестируемым
модулем одинаково с точки зрения спецификации
Тестирование всех классов эквивалентности позволяет найти
ошибки прямого нарушения спецификации
Как найти классы эквивалентности?
Марат Ахин (СПбПУ) Input 2016 61 / 359
Ad hoc testing
Тестирование методом «научного тыка»
Запускаем ПО
Смотрим на результаты работы
...
PROFIT!
Марат Ахин (СПбПУ) Input 2016 62 / 359
Ad hoc testing
А что будет, если я нажму на эту
кнопочку?
Если сложить два положительных
числа, то...
После умножения на ноль в
результате должен получится ноль
Если ввести очень большое число и
удвоить его, то...
В чем проблемы при таком подходе к тестированию?
Марат Ахин (СПбПУ) Input 2016 63 / 359
Метод свободного поиска
Ad hoc testing + планирование
Описываем тест-план
Проверяем ПО на соответствие тест-плану
...
PROFIT!
Марат Ахин (СПбПУ) Input 2016 64 / 359
Метод свободного поиска
Если ввести число «42», потом
нажать «+», потом ввести «1» и
нажать «=», в результате должно
получиться «43»
Многократные нажатия на «C» не
должны приводить к видимым
изменениям в интерфейсе
В чем проблемы при таком подходе к тестированию?
Марат Ахин (СПбПУ) Input 2016 65 / 359
Анализ граничных значений
Баю баюшки баю, не ложися на краю...
Находим пограничные значения входных данных
Проверяем ПО вокруг выбранных пограничных значений
...
PROFIT!
Марат Ахин (СПбПУ) Input 2016 66 / 359
Анализ граничных значений
Если умножить любое число на «0»,
должен получиться «0»
Деление любого числа на «0»
должно приводить к выводу
соответствующей ошибки
Если изменить знак наибольшего
представимого положительного
числа, должно получиться
соответствующее ему отрицательное
число
В чем проблемы при таком подходе к тестированию?
Марат Ахин (СПбПУ) Input 2016 67 / 359
Примеры
kd-tree
stoi
md5sum
PDF reader
Марат Ахин (СПбПУ) Input 2016 68 / 359
Содержание
1 Прелюдия
2 Тестирование за 45 минут
3 Тестирование в процессе разработки ПО
4 Проблема тестовых входных данных
5 Проблема неявных входных данных
Неявные входные данные
Использование заглушек
6 Разработка через тестирование
7 Интеграционное тестирование
Марат Ахин (СПбПУ) Input 2016 69 / 359
Неявные входные данные
Покрывает ли спецификация все множество входных данных?
В некоторых случаях – да
В большинстве случаев – нет
Почему?
Проблема заключается в том, что на тестовый модуль, кроме
явных, влияет множество неявных входных данных
Неявные входные данные часто не находят отражения в
спецификации
Марат Ахин (СПбПУ) Input 2016 70 / 359
Неявные входные данные
Текущая дата/время
IP/MAC адрес
Локаль пользователя
Идентификаторы устройств
Контекстные переключения/планирование нитей
Скорость поступления IP пакетов
Ритм нажатия клавиш на клавиатуре
Все это – примеры неявных входных данных
Марат Ахин (СПбПУ) Input 2016 71 / 359
Therac-25
Марат Ахин (СПбПУ) Input 2016 72 / 359
Robot pharmacist
Марат Ахин (СПбПУ) Input 2016 73 / 359
Как учесть неявные входные данные?
Какими способами можно управлять выполнением кода?
Изменением входных данных
Изменением самого исходного кода
Simulate and Stub
Заменяем части модуля управляемыми заглушками
Это позволяет сделать неявные входные данные явными
Это также делает управление явными входными данными проще
Марат Ахин (СПбПУ) Input 2016 74 / 359
Использование заглушек
Данный подход позволяет:
имитировать возникновение редких ситуаций
внести детерминизм там, где его нет
Для того, чтобы можно было использовать S&S, тестируемый
модуль должен разрабатываться соответствующим образом
Марат Ахин (СПбПУ) Input 2016 75 / 359
Mock-объекты
Пример S&S – mock-объекты
Повторяют внешний интерфейс тестируемого объекта
Могут демонстрировать любое требуемое поведение
Марат Ахин (СПбПУ) Input 2016 76 / 359
Mockito
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 }
Марат Ахин (СПбПУ) Input 2016 77 / 359
Mockito
Сервис аутентификации и авторизации
Вход пользователя с корректными логином/паролем должен
приводить к переходу его учетной записи в активное состояние
Марат Ахин (СПбПУ) Input 2016 78 / 359
Mockito
1 @Test
2 void testLoginForValidUser () {
3 IPasswordInfo passInfo = mock( IPasswordInfo .class );
4 when(passInfo.matches(anyString ())). thenReturn(true );
5
6 IAccount account = mock(IAccount.class );
7 when(account. getPasswordInfo ()). thenReturn(passInfo );
8
9 IAccountRepository repo = mock( IAccountRepository .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 }
Марат Ахин (СПбПУ) Input 2016 79 / 359
Mockito
Сервис аутентификации и авторизации
Три последовательные попытки входа пользователя с
некорректным паролем должны приводить к блокированию его
учетной записи
Марат Ахин (СПбПУ) Input 2016 80 / 359
Mockito
1 @Test
2 void testBlockOnIncorrectLogin () {
3 IPasswordInfo passInfo = mock( IPasswordInfo .class );
4 when(passInfo.matches(anyString ())). thenReturn(false );
5
6 IAccount account = mock(IAccount.class );
7 when(account. getPasswordInfo ()). thenReturn(passInfo );
8
9 IAccountRepository repo = mock( IAccountRepository .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 }
Марат Ахин (СПбПУ) Input 2016 81 / 359
Mockito
1 @Test
2 void testBlockOnIncorrectLoginPerAccount () {
3 IPasswordInfo aliceInfo = getMockedPasswordInfo (false );
4 IPasswordInfo bobInfo = getMockedPasswordInfo (false );
5
6 IAccount aliceAcc = getMockedAccount (aliceInfo );
7 IAccount bobAcc = getMockedAccount (bobInfo );
8
9 IAccountRepository repo = mock( IAccountRepository .class );
10 when(repo.find("alice", anyString ())). thenReturn(aliceAcc );
11 when(repo.find("bob", anyString ())). thenReturn(bobAcc );
12
13 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");
19
20 verify(aliceAcc , never ()). setBlocked(true );
21 verify(bobAcc , times (1)). setBlocked(true );
22 }
Марат Ахин (СПбПУ) Input 2016 82 / 359
Mocks = Stubs = Fakes = Dummies
Разве есть разница?
Dummies
Объект-муляж, не обладающий собственным поведением
Fakes
Упрощенная реализация требуемой функциональности
Stubs
Тестовая заглушка, способная отвечать на внешние запросы
Mocks
Тестовая загрушка, способная отвечать на внешние запросы и
проверять их корректность
Марат Ахин (СПбПУ) Input 2016 83 / 359
Содержание
1 Прелюдия
2 Тестирование за 45 минут
3 Тестирование в процессе разработки ПО
4 Проблема тестовых входных данных
5 Проблема неявных входных данных
6 Разработка через тестирование
Test-driven development
Плюсы TDD
Минусы TDD
7 Интеграционное тестирование
Марат Ахин (СПбПУ) Input 2016 84 / 359
Нужны ли заглушки?
А как использовать mock-объекты в процессе разработки?
Для управления неявными входными данными
Для управления явными входными данными
А когда их следует использовать?
Марат Ахин (СПбПУ) Input 2016 85 / 359
Заглушки не нужны?
Никогда!
Зачем тратить время на разработку и использование заглушек?
Можно просто подождать, пока не будут разработаны все
компоненты
Получится проще, дешевле и лучше, чем с заглушками!
Марат Ахин (СПбПУ) Input 2016 86 / 359
Заглушки не нужны?
Все же будет хорошо, да?
Марат Ахин (СПбПУ) Input 2016 87 / 359
Заглушки нужны?
Чем дольше итерация, тем сложнее и дороже исправление ошибок
Чем быстрее будут написаны тесты для разрабатываемого
компонента, тем проще найти ошибки
После разработки компонента пишем для него тест
Отсутствующие части системы заменяем заглушками
...
PROFIT!
Марат Ахин (СПбПУ) Input 2016 88 / 359
Заглушки нужны?
А давайте писать тесты еще быстрее?
Марат Ахин (СПбПУ) Input 2016 89 / 359
Test-driven development
Пишем тест для компонента перед его разработкой
Заменяем сам компонент заглушкой
...
PROFIT???
Разве это будет работать?
Марат Ахин (СПбПУ) Input 2016 90 / 359
Test-driven development
Разве это будет работать?
Марат Ахин (СПбПУ) Input 2016 91 / 359
Плюсы TDD
Разработка ведется небольшими контролируемыми фрагментами
В каждый момент времени разработчик думает об ограниченном
фрагменте спецификации
Это упрощает анализ возможного пространства входных данных
Кроме того, код получается более модульным и расширяемым
Марат Ахин (СПбПУ) Input 2016 92 / 359
Плюсы TDD
Минимальная цена ошибки
В случае возникновения ошибки очень просто вернуть систему в
рабочее состояние
Практически отсутствует необходимость в отладке
Крайне просто использовать метод бисекции в случае, если
ошибка смогла пробраться в релиз
Марат Ахин (СПбПУ) Input 2016 93 / 359
Плюсы TDD
Ошибки обнаруживаются сразу же после их появления
Постоянный запуск тестов гарантирует практически моментальное
обнаружение ошибки
Малый размер тестов позволяет быстро найти причину ошибки
Марат Ахин (СПбПУ) Input 2016 94 / 359
Плюсы TDD
Сильно упрощается рефакторинг кода
Программист уверен в том, что его изменения ничего не ломают
Облегчается раздельное владение кодом
Марат Ахин (СПбПУ) Input 2016 95 / 359
Почему я слышу о TDD впервые в жизни?
Почему TDD не используют везде и всюду?!
Марат Ахин (СПбПУ) Input 2016 96 / 359
Минусы TDD
Синдром «розовых очков»
Большое количество тестов создает иллюзию бесконечной
надежности системы тестирования
При создании теста разработчик может сделать те же допущения,
что и при разработке самого компонента
Марат Ахин (СПбПУ) Input 2016 97 / 359
Минусы TDD
Поддержание тестов в актуальном состоянии
При внесении изменений в интерфейсы компонентов системы
необходимо соответствующим образом изменить и все тесты
Большое количество тестов приводит к значительным затратам
на рефакторинг тестов
Марат Ахин (СПбПУ) Input 2016 98 / 359
Минусы TDD
Невозможность тестирования сложного взаимодействия нескольких
компонентов
Каждый тест проверяет ограниченный фрагмент
функциональности системы
Взаимодействие компонентов затрагивает множество аспектов
системы сразу
Марат Ахин (СПбПУ) Input 2016 99 / 359
Стоит ли использовать TDD?
Марат Ахин (СПбПУ) Input 2016 100 / 359
Содержание
1 Прелюдия
2 Тестирование за 45 минут
3 Тестирование в процессе разработки ПО
4 Проблема тестовых входных данных
5 Проблема неявных входных данных
6 Разработка через тестирование
7 Интеграционное тестирование
Проблема «Большого Взрыва»
Нисходящее интеграционное тестирование
Восходящее интеграционное тестирование
Марат Ахин (СПбПУ) Input 2016 101 / 359
Проблема «Большого Взрыва»
Когда приходит время заменять заглушки на реализацию...
Марат Ахин (СПбПУ) Input 2016 102 / 359
Проблема «Большого Взрыва»
Поведение реализации может (и скорее всего будет) отличаться
от поведения заглушки
Если заглушек было много...
Марат Ахин (СПбПУ) Input 2016 103 / 359
Проблема «Большого Взрыва»
Каскадное распространение сбоев
Сложность локализации ошибок
Большая стоимость исправления ошибок
Что мы можем сделать?
Марат Ахин (СПбПУ) Input 2016 104 / 359
Интеграционное тестирование
Ускорить процесс замены заглушек на реализацию
Выполнять тестирование взаимодействия постоянно, в процессе
разработки
Заменять заглушки на реализацию инкрементально
Инкрементальное интеграционное тестирование
Марат Ахин (СПбПУ) Input 2016 105 / 359
Интеграционное тестирование
Марат Ахин (СПбПУ) Input 2016 106 / 359
Нисходящее интеграционное тестирование
Тестирование начинается с верхних уровней системы
Отсутствующие на данный момент модули заменяются
«заглушками»
По мере реализации новых модулей они подключаются к системе
вместо «заглушек»
Марат Ахин (СПбПУ) Input 2016 107 / 359
Нисходящее интеграционное тестирование
Преимущества
Возможность ранней проверки корректности высокоуровневого
поведения
Модули могут добавляться по одному, независимо друг от друга
Не требуется разработка множества драйверов
Можно разрабатывать систему как в глубину, так и в ширину
Марат Ахин (СПбПУ) Input 2016 108 / 359
Нисходящее интеграционное тестирование
Недостатки
Отложенная проверка низкоуровневого поведения
Требуется разработка «заглушек»
Крайне сложно корректно сформулировать требования ко
входам/выходам частичной системы
Марат Ахин (СПбПУ) Input 2016 109 / 359
Восходящее интеграционное тестирование
Тестирование начинается с нижних уровней системы
Отсутствующие на данный момент модули заменяются
драйверами
При реализации всех модулей нижнего уровня драйвер может
быть заменен на соответствующий модуль
Марат Ахин (СПбПУ) Input 2016 110 / 359
Восходящее интеграционное тестирование
Преимущества
Возможность ранней проверки корректности низкоуровневого
поведения
Не требуется написание заглушек
Просто определить требования ко входам/выходам модулей
Марат Ахин (СПбПУ) Input 2016 111 / 359
Восходящее интеграционное тестирование
Недостатки
Отложенная проверка высокоуровневого поведения
Требуется разработка драйверов
При замене драйвера на модуль высокого уровня может
произойти «мини-Большой Взрыв»
Марат Ахин (СПбПУ) Input 2016 112 / 359
Проблемы тестирования
What’s up, Doc? (с)
Проблема тестовых входных данных
Проблема наблюдаемости
Проблема «останова»
Проблема тестового оракула
Марат Ахин (СПбПУ) Input 2016 113 / 359
Обеспечение порчи внутреннего состояния
Для того, чтобы обеспечить порчу внутреннего состояния
(corruption), необходимо:
обеспечить достижимость
передать такие тестовые входные данные, которые вызывают
нарушение целостности внутреннего состояния
См. проблему тестовых входных данных
Марат Ахин (СПбПУ) Input 2016 114 / 359
W.I.L.T.
Марат Ахин (СПбПУ) Input 2016 115 / 359
Проблема наблюдаемости
Software Testing 101
Марат Ахин
Санкт-Петербургский политехнический университет
2016
Марат Ахин (СПбПУ) PP 2016 116 / 359
Quiz
Марат Ахин (СПбПУ) PP 2016 117 / 359
Recap
Марат Ахин (СПбПУ) PP 2016 118 / 359
Проблемы тестирования
What’s up, Doc? (с)
Проблема тестовых входных данных
Проблема наблюдаемости
Проблема «останова»
Проблема тестового оракула
Марат Ахин (СПбПУ) PP 2016 119 / 359
Содержание
1 Прелюдия
2 Тестирование за 45 минут
3 Тестирование в процессе разработки ПО
4 Проблема тестовых входных данных
5 Проблема неявных входных данных
6 Разработка через тестирование
7 Интеграционное тестирование
8 Проблема наблюдаемости
Обеспечение распространения сбоя
Марат Ахин (СПбПУ) PP 2016 120 / 359
Обеспечение распространения сбоя
Какими способами можно управлять выполнением кода?
Изменением входных данных
Изменением самого исходного кода
Необходимо обнаружить сбой и распространить его, сделав
наблюдаемым снаружи (Propagation)
Марат Ахин (СПбПУ) PP 2016 121 / 359
Обеспечение распространения сбоя
Марат Ахин (СПбПУ) PP 2016 122 / 359
Assertions
Основной способ обеспечения наблюдаемости – assertions
1 private void checkInvariants () {
2 assert elements[tail] == null;
3 assert head == tail
4 ? elements[head] == null
5 : (elements[head] != null &&
6 elements [( tail - 1) & (elements.length - 1)] != null );
7 assert elements [( head - 1) & (elements.length - 1)] == null;
8 }
Марат Ахин (СПбПУ) PP 2016 123 / 359
Assertions
Что такое assertion?
Формула в логике первого порядка
Проверяется на истинность во время выполнения программы
Также может проверяться на истинность статически
Допускает возможность отключения проверки истинности
Марат Ахин (СПбПУ) PP 2016 124 / 359
Что дает использование assertions?
Проверка корректности внутреннего состояния
Внутреннее состояние обычно недоступно снаружи (полностью
или частично)
При изменении состояния хочется проверить, что оно остается
корректным
Марат Ахин (СПбПУ) PP 2016 125 / 359
Что дает использование assertions?
Неудача происходит ближе к причине ее возникновения
Чем больше задержка перед обнаружением неудачи, тем сложнее
найти ее исходную причину
Assertions позволяют найти неудачу практически в любой точке
программы
Марат Ахин (СПбПУ) PP 2016 126 / 359
Что дает использование assertions?
Явное документирование пред- и пост-условий
В общем случае программист ничего не знает о контракте
используемой функции
Использование assertions позволяет в явном виде описать
внешний контракт функции
Марат Ахин (СПбПУ) PP 2016 127 / 359
Assertions
Марат Ахин (СПбПУ) PP 2016 128 / 359
Какие проблемы связаны с assertions?
Ошибки в assertions
Побочные эффекты в assertions
Неправильное логическое условие срабатывания
Марат Ахин (СПбПУ) PP 2016 129 / 359
Какие проблемы связаны с assertions?
Влияние на производительность
Проверка assertions занимает время
Чем сложнее assertion, тем больше он замедляет работу
программы
Марат Ахин (СПбПУ) PP 2016 130 / 359
Какие проблемы связаны с assertions?
Эффект «вышибалы»
Сработавший assertion превращает любую ошибку в неудачу
Это полностью останавливает возможность дальнейшего
тестирования
Марат Ахин (СПбПУ) PP 2016 131 / 359
Какие проблемы связаны с assertions?
Сложность проверки определенных условий
Некоторые просто формулируемые условия крайне сложно
проверить на практике
Их реализация в виде assertion является крайне затруднительной
Марат Ахин (СПбПУ) PP 2016 132 / 359
Работают ли assertions?
Марат Ахин (СПбПУ) PP 2016 133 / 359
Работают ли assertions?
1 int* ptr = malloc(sizeof(int) * 10);
2 assert(ptr);
Адекватный assertion в правильном месте
Марат Ахин (СПбПУ) PP 2016 134 / 359
Работают ли assertions?
1 int* ptr = malloc(sizeof(int) * 10);
2 assert(ptr);
Замена обработки ошибок на assertion
Марат Ахин (СПбПУ) PP 2016 135 / 359
Работают ли assertions?
Марат Ахин (СПбПУ) PP 2016 136 / 359
Работают ли assertions?
Microsoft Office ≈ 1%
Proprietary software ≈ 3%
Open source software ≈ 5%
Eiffel software ≈ 7%
Сейчас assertions используются еще более широко
Марат Ахин (СПбПУ) PP 2016 137 / 359
Работают ли assertions?1
LLVM
≈ 500,000 SLOC
≈ 7000 assertions
> 400 ошибок, относящихся к assertions
1
http://blog.regehr.org/
Марат Ахин (СПбПУ) PP 2016 138 / 359
Работают ли assertions?1
GCC
≈ 1,000,000 SLOC
≈ 9500 assertions
> 200 ошибок, относящихся к assertions
1
http://blog.regehr.org/
Марат Ахин (СПбПУ) PP 2016 138 / 359
Работают ли assertions?2
1 assert( BlockAddrFwdRefs .empty () && ...);
2 assert(Ty == V->getType () && ...);
3 assert ((Ty == 0 || Ty == V->getType ()) && ...);
4 assert(It != ResolveConstants .end() && ...);
5 assert(isa <ConstantExpr >( UserC) && ...);
6 assert(V->getType ()-> isMetadataTy () && ...);
7 assert ((! Alignment || isPowerOf2_32 (Alignment )) && ...);
8 assert (( Record[i] == 3 || Record[i] == 4) && ...);
9 assert(Record[i] == 0 && ...);
10 assert(Record[i] == 0 && ...);
11 assert(ResultTy && ...);
12 assert(TypeList[NumRecords] == 0 && ...);
13 assert(NextBitCode == bitc :: METADATA_NAMED_NODE );
14 assert ((CT != LandingPadInst :: Catch
15 || !isa <ArrayType >(Val ->getType ())) && ...);
16 assert ((CT != LandingPadInst :: Filter
17 || isa <ArrayType >(Val ->getType ())) && ...);
18 assert(DFII != DeferredFunctionInfo .end () && ...);
19 assert( DeferredFunctionInfo .count(F) && ...);
20 assert(M == TheModule && ...);
2
http://blog.regehr.org/
Марат Ахин (СПбПУ) PP 2016 139 / 359
Журналирование
Марат Ахин (СПбПУ) PP 2016 140 / 359
Журналирование
Журналирование (logging)
Запись хода выполнения программы в том или ином виде
В зависимости от необходимости журнал может быть более или
менее детализированным
По журналу выполнения при необходимости возможно
восстановить причину возникшей ошибки
Марат Ахин (СПбПУ) PP 2016 141 / 359
Журналирование
Журналирование для
пользователя
Высокоуровневые
сообщения
Как можно меньше
«мусора»
Чем проще и понятнее
формат сообщений, тем
лучше
Журналирование для
программиста
Низкоуровневые
сообщения
Допустим любой шум
Никаких ограничений на
формат сообщений
Марат Ахин (СПбПУ) PP 2016 142 / 359
Как вести журнал?
1 Result :: Ptr processBatchJob (Job :: Ptr job) {
2 // do the heavy lifting ...
3 }
Как записать ход выполнения программы?
Марат Ахин (СПбПУ) PP 2016 143 / 359
Как вести журнал?
1 Result :: Ptr ThreadedProcessor :: processBatchJob (Job:: Ptr job) {
2 log () << "Start of: " << job << endl;
3 // do the heavy lifting ...
4 log () << "End of: " << job << endl;
5 }
Ручная вставка журналирующих вызовов
Марат Ахин (СПбПУ) PP 2016 144 / 359
Как вести журнал?
1 aspect ProcessTracer {
2 advice call("% %Processor :: process %(%)") : before () {
3 log () << "Start of: " << * JoinedPoint ::arg <0 >() << endl;
4 }
5 advice call("% %Processor :: process %(%)") : after () {
6 log () << "End of: " << *JoinedPoint ::arg <0 >() << endl;
7 }
8 };
Журналирующие аспекты / интерсепторы
Марат Ахин (СПбПУ) PP 2016 145 / 359
Как вести журнал?
Logging as a Service
Марат Ахин (СПбПУ) PP 2016 146 / 359
Основная проблема журналирования
INFO [http -thread -pool -8080(5)] Received token: e6749451
TRACE [http -thread -pool -8080(5)] Calling: AuthStorageBean . getAuthData
TRACE [http -thread -pool -8080(5)] Called: AuthStorageBean .getAuthData -> 2.0708E-5
INFO [http -thread -pool -8080(5)] Authentication data found: AuthData { authToken:e6749451
userId :1 firstName: lastName:Admin patrName: role:ru.korus.tmis.core.entity.model.
Role[id=1] spec: }
TRACE [http -thread -pool -8080(5)] Calling: AuthStorageBean . getAuthDateTime
TRACE [http -thread -pool -8080(5)] Called: AuthStorageBean . getAuthDateTime -> 1.9825E-5
INFO [http -thread -pool -8080(5)] Token is valid
TRACE [http -thread -pool -8080(5)] attempting to get session; create = false; session is
null = true; session has id = false
TRACE [http -thread -pool -8080(5)] Authentication attempt received for token [ru.korus.tmis
.core.auth. TmisShiroToken@37bd2b6 ]
DEBUG [http -thread -pool -8080(5)] Performing credentials equality check for
tokenCredentials of type [java.lang.String and accountCredentials of type [java.lang
.String]
DEBUG [http -thread -pool -8080(5)] Both credentials arguments can be easily converted to
byte arrays. Performing array equals comparison
DEBUG [http -thread -pool -8080(5)] Authentication successful for token [ru.korus.tmis.core.
auth. TmisShiroToken@37bd2b6 ]. Returned account [(admin ,ru.korus.tmis.core.entity.
model.Role[id =1])]
DEBUG [http -thread -pool -8080(5)] No SecurityManager available in subject context map.
Falling back to SecurityUtils . getSecurityManager () lookup.
Too much data!
Марат Ахин (СПбПУ) PP 2016 147 / 359
Основная проблема журналирования
Чем больше мы хотим узнать о ходе выполнения программы, тем
больше мы должны журналировать
Чем больше мы журналируем, тем сложнее разобраться в журнале
Чем сложнее разобраться в журнале, тем меньше мы знаем о ходе
выполнения программы
Марат Ахин (СПбПУ) PP 2016 148 / 359
Ограничение размера журнала
Необходимо ограничивать размер записываемых данных
Марат Ахин (СПбПУ) PP 2016 149 / 359
Уровни журналирования
Сообщения пишутся в журнал с определенным уровнем
В дальнейшем возможно фильтровать сообщения по уровням
Error / Warning / Info / Debug / Trace
Марат Ахин (СПбПУ) PP 2016 150 / 359
Домены журналирования
Домены ортогональны уровням журналирования
В зависимости от типа сообщения пишутся в разные домены
Database / Network / UI / Configuration / ...
Марат Ахин (СПбПУ) PP 2016 151 / 359
Стохастическое журналирование
В случае, если какие-то события встречаются очень часто,
достаточно записывать лишь их часть
1 if (_ok == true) {
2 _logger.log( Level.WARNING , "Server seen down: " + _addr , e );
3 } else if (Math.random () < 0.1) {
4 _logger.log( Level.WARNING , "Server seen down: " + _addr );
5 }
Марат Ахин (СПбПУ) PP 2016 152 / 359
Сессионное журналирование
Часто работа ПО разбита на набор слабо связанных сессий
Каждая сессия может журналироваться независимо от других
1 try {
2 // logging ...
3 } catch (Exception ex) {
4 ctx.logging. dumpCurrentSession ();
5 throw;
6 } finally {
7 ctx.logging.reset ();
8 }
Марат Ахин (СПбПУ) PP 2016 153 / 359
Структурированное журналирование
Вместо простого текста журнал ведется в определенном формате
Структурированный формат облегчает поиск и анализ по журналу
1 {
2 "session_id": "e6749451",
3 "event": " method_call",
4 "class_name": " AuthStorageBean ",
5 "method_name ": "getAuthData "
6 }
Марат Ахин (СПбПУ) PP 2016 154 / 359
W.I.L.T.
Марат Ахин (СПбПУ) PP 2016 155 / 359
Полнота тестирования ПО
Software Testing 101
Марат Ахин
Санкт-Петербургский политехнический университет
2016
Марат Ахин (СПбПУ) TC 2016 156 / 359
Quiz
Марат Ахин (СПбПУ) TC 2016 157 / 359
Recap
Марат Ахин (СПбПУ) TC 2016 158 / 359
Проблемы тестирования
What’s up, Doc? (с)
Проблема тестовых входных данных
Проблема наблюдаемости
Проблема «останова»
Проблема тестового оракула
Марат Ахин (СПбПУ) TC 2016 159 / 359
Содержание
1 Прелюдия
2 Тестирование за 45 минут
3 Тестирование в процессе разработки ПО
4 Проблема тестовых входных данных
5 Проблема неявных входных данных
6 Разработка через тестирование
7 Интеграционное тестирование
8 Проблема наблюдаемости
Марат Ахин (СПбПУ) TC 2016 160 / 359
Проблема «останова» в тестировании
Проблема останова
По заданному алгоритму и входным данным определить, завершится
ли за конечное время его выполнение
При чем здесь тестирование?!
Марат Ахин (СПбПУ) TC 2016 161 / 359
Проблема «останова» в тестировании
Алгоритм ⇔ процесс тестирования
Входные данные ⇔ тестируемая программа
В подавляющем большинстве случаев процесс тестирования является
бесконечным
Марат Ахин (СПбПУ) TC 2016 162 / 359
Проблема «останова» в тестировании
Мы не можем позволить себе тестировать бесконечное время
Слишком долго
Слишком дорого
Слишком странно
Что же делать?
Марат Ахин (СПбПУ) TC 2016 163 / 359
Проблема «останова» в тестировании
Останавливать процесс тестирования «вручную»
Когда?
У нас кончилось время и/или деньги на тестирование
Мы протестировали ПО достаточно хорошо
Марат Ахин (СПбПУ) TC 2016 164 / 359
Проблема «останова» в тестировании
Проблема «останова» в тестировании
По заданному набору тестов и программе определить, протестировали
ли мы ее достаточно хорошо
Что такое – достаточно хорошо?
Марат Ахин (СПбПУ) TC 2016 165 / 359
Тестовое покрытие
Мы протестировали программу достаточно хорошо, когда мы
нашли большую часть ошибок в программе
Чтобы найти ошибку, необходимо обеспечить выполнение трех
основных свойств
Обеспечение достижимости (reachability) и порчи (corruption)
требует, чтобы мы выполнили определенный участок кода с
определенными входными данными
Качество тестирования можно оценить через тестовое покрытие
Марат Ахин (СПбПУ) TC 2016 166 / 359
Виды тестового покрытия
Выделяют два основных вида покрытия
Покрытие потока управления
Покрытие потока данных
Они работают с такими понятиями, как граф потока
управления (CFG) и граф потока данных (DFG)
Надеюсь, что все знают, что такое CFG и DFG?
Марат Ахин (СПбПУ) TC 2016 167 / 359
Покрытие потока управления
Как мы можем покрыть данный
CFG?
По узлам
По дугам
По условиям
По путям
...
Марат Ахин (СПбПУ) TC 2016 168 / 359
Покрытие операторов программы
Каждый узел CFG был пройден в
процессе тестирования хотя бы один раз
Самый слабый способ оценки тестового
покрытия
Сколько тестов требуется для того, чтобы
обеспечить полное покрытие операторов
программы для следующего примера?
Марат Ахин (СПбПУ) TC 2016 169 / 359
Покрытие ветвлений программы
Каждая ветка программы была пройдена
хотя бы один раз
Несколько более сильный способ оценки
покрытия
Сколько тестов требуется для того, чтобы
обеспечить полное покрытие ветвлений
программы для следующего примера?
Марат Ахин (СПбПУ) TC 2016 170 / 359
Покрытие ветвлений программы
Как соотносятся между собой покрытия
операторов и ветвлений?
1 Никак
2 Покрытие операторов включает покрытие
ветвлений
3 Покрытие ветвлений включает покрытие
операторов
Марат Ахин (СПбПУ) TC 2016 171 / 359
Покрытие ветвлений программы
Никак
Почему покрытие ветвлений не включает
в себя покрытие операторов?
Потому что в программе может
присутствовать «мертвый код»
Потому что в программе могут вообще
отсутствовать ветвления
Марат Ахин (СПбПУ) TC 2016 172 / 359
Покрытие условий программы
Каждое ветвление может выполняться по различным причинам
При покрытии условий программы мы требуем, чтобы все условия
ветвлений хотя бы один раз приняли значение true и false
1 if (req.isSsl () && (cfg.SslEnabled () || cfg.isDebug ())) {
2 ...
3 }
Как соотносятся между собой покрытия ветвлений и условий?
Марат Ахин (СПбПУ) TC 2016 173 / 359
Покрытие условий программы
Никак
Разные комбинации условий могут приводить к выбору одного и
того же ветвления
1 if (req. isLocalhost () || cfg.isDebug () || cfg.isDevMode ()) {
2 ...
3 }
Марат Ахин (СПбПУ) TC 2016 174 / 359
Покрытие ветвлений и условий программы
Комбинация соответствующих покрытий
Полностью их покрывает
Можно ли предложить что-то более сильное?
1 if (req.isSsl () && (cfg.SslEnabled () || cfg.isDebug ())) {
2 ...
3 }
Марат Ахин (СПбПУ) TC 2016 175 / 359
Модифицированное покрытие ветвлений и условий
Также известное как MC/DC
Является одним из обязательных условий при тестировании ПО
на уровень A в рамках DO-178B
Чем оно отличается от обычного покрытия ветвлений и условий
программы?
1 if (req.isSsl () && (cfg.SslEnabled () || cfg.isDebug ())) {
2 ...
3 }
Марат Ахин (СПбПУ) TC 2016 176 / 359
Модифицированное покрытие ветвлений и условий
Каждое условие независимо повлияло на выполнение программы
Как это проверить?
Изменить одно условие и проверить, изменилось ли ветвление
1 if (req.isSsl () && (cfg.SslEnabled () || cfg.isDebug ())) {
2 ...
3 }
Марат Ахин (СПбПУ) TC 2016 177 / 359
Полное покрытие условий программы
Полный перебор всех возможных комбинаций условий всех
возможных ветвлений
Сколько вариантов необходимо перебрать, чтобы получить полное
комбинационное покрытие для следующего примера?
1 if (req.isSsl () && (cfg.SslEnabled () || cfg.isDebug ())) {
2 ...
3 }
Марат Ахин (СПбПУ) TC 2016 178 / 359
Покрытие путей программы
Мы требуем, чтобы все возможные пути программы были
выполнены хотя бы один раз
Как данное покрытие соотносится с полным покрытием условий?
Обычно считается самым сильным типом покрытия потока
управления
Его можно было бы использовать, если бы не...
Циклы и рекурсия
Марат Ахин (СПбПУ) TC 2016 179 / 359
Покрытие путей программы
Мы требуем, чтобы все возможные пути программы были
выполнены хотя бы один раз
Как данное покрытие соотносится с полным покрытием условий?
Обычно считается самым сильным типом покрытия потока
управления
Его можно было бы использовать, если бы не...
Циклы и рекурсия
Марат Ахин (СПбПУ) TC 2016 179 / 359
Покрытие путей программы
Мы требуем, чтобы все возможные пути программы были
выполнены хотя бы один раз
Как данное покрытие соотносится с полным покрытием условий?
Обычно считается самым сильным типом покрытия потока
управления
Его можно было бы использовать, если бы не...
Циклы и рекурсия
Марат Ахин (СПбПУ) TC 2016 179 / 359
Покрытие путей программы
450 возможных путей
Марат Ахин (СПбПУ) TC 2016 180 / 359
Покрытие путей программы
450 возможных путей
Марат Ахин (СПбПУ) TC 2016 180 / 359
Покрытие путей программы
Для борьбы с этим используют несколько подходов
Один из вариантов
Требуем, чтобы тело цикла было выполнено
0
1
k
max
Объясните, почему выбраны именно эти варианты
Марат Ахин (СПбПУ) TC 2016 181 / 359
Покрытие потока данных
Что еще можно сделать?
Можно вспомнить о том, что программы работают не просто так
Основная цель работы любой программы – работа с данными
С этой точки зрения для тестирования представляет интерес
анализ таких путей выполнения программы, на которых активно
работают с данными
Сперва вспомним несколько определений
Марат Ахин (СПбПУ) TC 2016 182 / 359
Определения и использования переменных
Определение переменной (Def)
Оператор программы, в котором значение переменной v может быть
изменено
v = 42
f(&v, ...)
scanf(fmt, &v)
Использование переменной (Use)
Оператор программы, в котором значение переменной v влияет на
выполнение программы тем или иным способом
q = v + 2
g(v, ...)
if (v != NULL) ...
Марат Ахин (СПбПУ) TC 2016 183 / 359
Определения и использования переменных
Def-Use Chain
Пара (d, u) операторов программы, для которой выполняются
следующие условия
d – определение переменной v
u – использование переменной v
между d и u существует хотя бы один путь, на котором
переменная v не переопределяется
Рассмотрим данные определения на примере
Марат Ахин (СПбПУ) TC 2016 184 / 359
Пример
Марат Ахин (СПбПУ) TC 2016 185 / 359
Покрытие потока данных
Какие варианты покрытий можно предложить с использованием этих
понятий?
Покрытие всех определений
Для каждой интересующей нас переменной v должна быть
протестирована хотя бы одна Def-Use Chain от каждого
определения v до хотя бы одного использования v
Марат Ахин (СПбПУ) TC 2016 186 / 359
All-Def Coverage
Рассмотрим следующие тесты
1 → 2 → 3 → 4 → 5 → 6
Марат Ахин (СПбПУ) TC 2016 187 / 359
Покрытие потока данных
Покрытие всех использований
Для каждой интересующей нас переменной v должна быть
протестирована хотя бы одна Def-Use Chain от каждого
определения v до каждого использования v
Является ли All-Use более сильным критерием по сравнению с All-Def?
Марат Ахин (СПбПУ) TC 2016 188 / 359
All-Use Coverage
Рассмотрим следующие тесты
1 → 2 → 3 → 4 → 5 → 6
1 → 2 → 3 → 4 → 6
1 → 3 → 4 → 5 → 6
Марат Ахин (СПбПУ) TC 2016 189 / 359
Покрытие потока данных
Покрытие всех Def-Use Chain
Для каждой интересующей нас переменной v должны быть
протестированы все возможные Def-Use Chain от каждого
определения v до каждого использования v
Как соотносится All-Def-Use-Chain с покрытием всех путей программы?
Марат Ахин (СПбПУ) TC 2016 190 / 359
Пример
Марат Ахин (СПбПУ) TC 2016 191 / 359
Пример
Марат Ахин (СПбПУ) TC 2016 192 / 359
Пример
Марат Ахин (СПбПУ) TC 2016 193 / 359
Пример
Марат Ахин (СПбПУ) TC 2016 194 / 359
Другой способ оценки полноты
Какими способами можно управлять выполнением кода?
Изменением входных данных
Изменением самого исходного кода
Как можно оценить полноту тестирования, изменяя исходный код?
Марат Ахин (СПбПУ) TC 2016 195 / 359
Идеальный тест
Идеальный тест работает только на тестируемой программе
При любом изменений он перестает проходить
В этом заключается основная идея мутационного тестирования
Марат Ахин (СПбПУ) TC 2016 196 / 359
Мутационное тестирование
Исходная программа подвергается мутации, в результате
получается набор из N мутантов
После этого имеющиеся тесты запускаются на этих мутантах
Если тест не проходит на мутанте, то говорят, что тест «убивает»
этого мутанта
Доля «убитых» мутантов показывает, насколько полно данный
набор тестов покрывает нашу программу
Марат Ахин (СПбПУ) TC 2016 197 / 359
Как сделать мутанта?
Что можно сделать с исходным кодом?
Добавить новый код
Удалить старый код
Изменить существующий код
Набор синтаксических трансформаций, изменяющих исходный код
Марат Ахин (СПбПУ) TC 2016 198 / 359
Как сделать мутанта?
1 int sumCollection (final @NotNull Collection <Integer > c) {
2 int sum = 0;
3 for (int i : c) {
4 sum += i;
5 }
6 return sum;
7 }
Как можно мутировать данный фрагмент кода?
Марат Ахин (СПбПУ) TC 2016 199 / 359
Как сделать мутанта?
Некоторые мутанты будут синтаксически некорректны
Другие мутанты будут семантически некорректны
Оставшиеся мутанты подходят для использования в мутационном
тестировании
Какие проблемы есть у мутационного тестирования?
Марат Ахин (СПбПУ) TC 2016 200 / 359
Недостатки мутационного тестирования
Данный вид тестирования практически невозможно выполнять
вручную
Количество необходимых для оценки покрытия мутантов
пропорционально объему анализируемого ПО
Даже для небольшой программы получение достаточного числа
мутантов вручную является практически невозможным
Сильно возрастают затраты на проведение тестирования
Вместо одного запуска каждого теста требуется выполнить N
запусков
Кроме того, дополнительное время тратится на генерацию
мутантов
Марат Ахин (СПбПУ) TC 2016 201 / 359
Мутационное тестирование
Марат Ахин (СПбПУ) TC 2016 202 / 359
Мутационное тестирование
Марат Ахин (СПбПУ) TC 2016 203 / 359
Мутационное тестирование
Марат Ахин (СПбПУ) TC 2016 204 / 359
Оценка тестового покрытия
Мы же уже поговорили об оценке тестового покрытия?
Оценка тестового покрытия
программы
Оценка самого тестового
покрытия
Who observes the observer? c
Марат Ахин (СПбПУ) TC 2016 205 / 359
Оценка тестового покрытия
Какая проблема есть у покрытия потока управления?
Чувствительность к изменениям в исходном коде
Марат Ахин (СПбПУ) TC 2016 206 / 359
Оценка тестового покрытия
Какая проблема есть у покрытия потока управления?
Чувствительность к изменениям в исходном коде
Марат Ахин (СПбПУ) TC 2016 206 / 359
Нестабильность тестового покрытия
1 ...
2 if (a && b && c) {
3 ...
4 }
1 bool cond = a && b && c;
2 if (cond) {
3 ...
4 }
Что будет с покрытием MC/DC?
Марат Ахин (СПбПУ) TC 2016 207 / 359
Нестабильность тестового покрытия
Чем сильнее влияют изменения в программе на тестовое
покрытие, тем более нестабильным (fragile) является тестовое
покрытие
Чем более нестабильным является тестовое покрытие, тем менее
адекватно оно оценивает качество тестирования
Что же делать?
Марат Ахин (СПбПУ) TC 2016 208 / 359
Оценка тестового покрытия
The whole is more than the sum of its parts c
Можно применить мутационное тестирование для оценки
тестового покрытия
Ограничить набор трансформаций
Посмотреть на изменение тестового покрытия для мутантов
...
PROFIT!
Марат Ахин (СПбПУ) TC 2016 209 / 359
Оценка тестового покрытия
Какая проблема есть у мутационного тестирования?
Эквивалентные мутанты
Марат Ахин (СПбПУ) TC 2016 210 / 359
Оценка тестового покрытия
Какая проблема есть у мутационного тестирования?
Эквивалентные мутанты
Марат Ахин (СПбПУ) TC 2016 210 / 359
Эквивалентные мутанты
1 int sumCollection (final @NotNull Collection <Integer > c) {
2 int sum = 0;
3 for (int i : c) {
4 sum += i;
5 }
6 return sum;
7 }
Почему эквивалентные мутанты – это плохо?
Марат Ахин (СПбПУ) TC 2016 211 / 359
Эквивалентные мутанты
Эквивалентные мутанты «зашумляют» итоговую оценку качества
тестирования
Из-за шума снижается адекватность оценки
Что же делать?
Марат Ахин (СПбПУ) TC 2016 212 / 359
Оценка тестового покрытия
The whole is more than the sum of its parts c
Можно применить тестовое покрытие для оценки мутационного
тестирования
Для каждого мутанта записывается трасса его выполнения
У эквивалентных мутантов будут похожие трассы выполнения
...
PROFIT!
Марат Ахин (СПбПУ) TC 2016 213 / 359
W.I.L.T.
Марат Ахин (СПбПУ) TC 2016 214 / 359
Тестовый оракул: что, где, когда
Software Testing 101
Марат Ахин
Санкт-Петербургский политехнический университет
2016
Марат Ахин (СПбПУ) TO 2016 215 / 359
Quiz
Марат Ахин (СПбПУ) TO 2016 216 / 359
Recap
Марат Ахин (СПбПУ) TO 2016 217 / 359
Проблемы тестирования
What’s up, Doc? (с)
Проблема тестовых входных данных
Проблема наблюдаемости
Проблема «останова»
Проблема тестового оракула
Марат Ахин (СПбПУ) TO 2016 218 / 359
Содержание
1 Прелюдия
2 Тестирование за 45 минут
3 Тестирование в процессе разработки ПО
4 Проблема тестовых входных данных
5 Проблема неявных входных данных
6 Разработка через тестирование
7 Интеграционное тестирование
8 Проблема наблюдаемости
Марат Ахин (СПбПУ) TO 2016 219 / 359
Тестовый оракул
Magic 8-ball тестирования
Марат Ахин (СПбПУ) TO 2016 220 / 359
Тестовый оракул
Марат Ахин (СПбПУ) TO 2016 221 / 359
Тестовый оракул
В чем заключается проблема тестового оракула?
Его нет!
Марат Ахин (СПбПУ) TO 2016 222 / 359
Тестовый оракул
Вид тестового оракула очень сильно зависит от того, какую
эталонную модель мы используем
kd-tree
stoi
md5sum
PDF reader
Марат Ахин (СПбПУ) TO 2016 223 / 359
Виды тестовых оракулов
Точность
vs
Полнота
Марат Ахин (СПбПУ) TO 2016 224 / 359
Точность
Способность оракула избегать ложных обнаружений
Ложные обнаружения при тестировании – лишние затраты на их
обнаружение и игнорирование
Если их будет слишком много, оракул никто не будет
использовать из-за зашумления результатов
Марат Ахин (СПбПУ) TO 2016 225 / 359
Полнота
Способность оракула находить все ошибки
Пропущенные ошибки при тестировании – дополнительные
затраты на их исправление позднее
Если оракул пропускает много ошибок, его необходимо усиливать
другими способами
Марат Ахин (СПбПУ) TO 2016 226 / 359
Виды тестовых оракулов
Варьируя используемые подходы, можно получить те или иные виды
тестовых оракулов
Слабые
Средние
Сильные
Марат Ахин (СПбПУ) TO 2016 227 / 359
Слабые оракулы
Падение
Segmentation fault
Core dump
Работают всегда
Практически ничего не говорят о причине ошибки
Марат Ахин (СПбПУ) TO 2016 228 / 359
Слабые оракулы
Сбой при работе в обычном окружении
NullPointerException
OutOfMemoryException
ClassNotFoundException
Работают при поддержке стандартной среды выполнения
Содержат определенную информацию о месте ошибки
Марат Ахин (СПбПУ) TO 2016 229 / 359
Слабые оракулы
Сбой при работе в специальном тестовом окружении
Valgrind
Предоставляют специальную среду выполнения
Позволяют весьма точно определить причину ошибок
Марат Ахин (СПбПУ) TO 2016 230 / 359
Valgrind
Фреймворк для построения средств динамического анализа
программ
Включает встроенные реализации для
Memcheck
Cachegrind
Callgrind
Helgrind
DRD
Massif
DHAT
...
Марат Ахин (СПбПУ) TO 2016 231 / 359
Слабые оракулы
Хорошая точность
Плохая полнота
Марат Ахин (СПбПУ) TO 2016 232 / 359
Средние оракулы
Assertions
Тесты
Требуют определенных усилий со стороны разработчиков
В зависимости от степени усилий, будут более или менее точно
указывать на место возникновения ошибки
Марат Ахин (СПбПУ) TO 2016 233 / 359
Средние оракулы
Хорошая точность
Средняя полнота
Марат Ахин (СПбПУ) TO 2016 234 / 359
Сильные оракулы
Эталонная реализация
Предыдущая версия программы
Формально верифицированная реализация
Автоматически сгенерированная версия
Марат Ахин (СПбПУ) TO 2016 235 / 359
Сильные оракулы
«Обратная функция»
Прямое/обратное преобразование Фурье
Архиватор/деархиватор
Кодер/декодер видео
Марат Ахин (СПбПУ) TO 2016 236 / 359
Сильные оракулы
Средняя точность
Хорошая полнота
Марат Ахин (СПбПУ) TO 2016 237 / 359
Генерация оракулов
Можно ли генерировать оракула автоматически?
Да!
Слабые оракулы
Средние оракулы
Марат Ахин (СПбПУ) TO 2016 238 / 359
Генерация оракулов
Можно ли генерировать оракула автоматически?
Да!
Слабые оракулы
Средние оракулы
Марат Ахин (СПбПУ) TO 2016 238 / 359
Генерация слабых оракулов
Все уже есть
Слабый оракул предоставляется средой выполнения
Если что-то упало, мы всегда об этом узнаем
Марат Ахин (СПбПУ) TO 2016 239 / 359
Генерация слабых оракулов
В явном виде используются весьма редко
Случайное тестирование
...
Сложно понять, где произошла ошибка
Не всегда очевидно, в чем именно заключается ошибка
Марат Ахин (СПбПУ) TO 2016 240 / 359
Генерация средних оракулов
Assertions
Тесты
Марат Ахин (СПбПУ) TO 2016 241 / 359
Генерация средних оракулов
Все уже есть
Средние оракулы разрабатываются параллельно с разработкой ПО
При возникновении проблемы мы сразу узнаем о ней
Зачем их генерировать автоматически?
Марат Ахин (СПбПУ) TO 2016 242 / 359
Генерация средних оракулов
Марат Ахин (СПбПУ) TO 2016 243 / 359
Генерация assertions
Assertions проверяют корректность внутреннего состояния
Как автоматически сгенерировать assertions?
Machine learning
Марат Ахин (СПбПУ) TO 2016 244 / 359
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)
Тестирование ПО (2016)

More Related Content

What's hot

Илья Фомин - Проблемы автоматизируемости тестирования и их решения
Илья Фомин - Проблемы автоматизируемости тестирования и их решенияИлья Фомин - Проблемы автоматизируемости тестирования и их решения
Илья Фомин - Проблемы автоматизируемости тестирования и их решения
SQALab
 
КГТУ Лекция 1: Обеспечение Качества Программного Обеспечения
КГТУ Лекция 1: Обеспечение Качества Программного ОбеспеченияКГТУ Лекция 1: Обеспечение Качества Программного Обеспечения
КГТУ Лекция 1: Обеспечение Качества Программного Обеспечения
Iosif Itkin
 
API design in java project
API design in java projectAPI design in java project
API design in java projectchashnikov
 
Testing of Embedded SW – Alternative to Classic TDD
Testing of Embedded SW – Alternative to Classic TDDTesting of Embedded SW – Alternative to Classic TDD
Testing of Embedded SW – Alternative to Classic TDDДмитрий Овечкин
 
Урок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибокУрок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибок
Tatyanazaxarova
 
Дефекты при тестировании ПО
Дефекты при тестировании ПОДефекты при тестировании ПО
Дефекты при тестировании ПО
Sergey Chuburov
 
анализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияанализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестирования
Ruslan Shevchenko
 
Илья Фофанов "Обработка ошибок в C#"
Илья Фофанов "Обработка ошибок в C#"Илья Фофанов "Обработка ошибок в C#"
Илья Фофанов "Обработка ошибок в C#"
Yulia Tsisyk
 
ПРИМЕНЕНИЕ ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ К ГЕНЕРАЦИИ ТЕСТОВ ДЛЯ АВТОМАТНЫХ ПРОГРАММ
ПРИМЕНЕНИЕ ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ К ГЕНЕРАЦИИ ТЕСТОВ ДЛЯ АВТОМАТНЫХ ПРОГРАММПРИМЕНЕНИЕ ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ К ГЕНЕРАЦИИ ТЕСТОВ ДЛЯ АВТОМАТНЫХ ПРОГРАММ
ПРИМЕНЕНИЕ ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ К ГЕНЕРАЦИИ ТЕСТОВ ДЛЯ АВТОМАТНЫХ ПРОГРАММ
ITMO University
 
ОЛЕКСАНДР ЄПІШЕВ «Мутаційне тестування: тести для тестів» Lviv QA Day 2019
ОЛЕКСАНДР ЄПІШЕВ «Мутаційне тестування: тести для тестів»  Lviv QA Day 2019ОЛЕКСАНДР ЄПІШЕВ «Мутаційне тестування: тести для тестів»  Lviv QA Day 2019
ОЛЕКСАНДР ЄПІШЕВ «Мутаційне тестування: тести для тестів» Lviv QA Day 2019
QADay
 
Что такое "Parallel Lint"?
Что такое "Parallel Lint"?Что такое "Parallel Lint"?
Что такое "Parallel Lint"?
Tatyanazaxarova
 
Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...
Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...
Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...
ScrumTrek
 
Андрей Кирпичев "Гибкая модульность инструментами АОП"
Андрей Кирпичев  "Гибкая модульность инструментами АОП"Андрей Кирпичев  "Гибкая модульность инструментами АОП"
Андрей Кирпичев "Гибкая модульность инструментами АОП"
MskDotNet Community
 
Сложности performance-тестирования / Андрей Акиньшин (JetBrains)
Сложности performance-тестирования / Андрей Акиньшин (JetBrains)Сложности performance-тестирования / Андрей Акиньшин (JetBrains)
Сложности performance-тестирования / Андрей Акиньшин (JetBrains)
Ontico
 
Security Tesint: Sql injection
Security Tesint: Sql injectionSecurity Tesint: Sql injection
Security Tesint: Sql injection
Sergey Polazhenko
 
обработка исключений в Java
обработка исключений в Javaобработка исключений в Java
обработка исключений в Javametaform
 
Вещи в Java, о которых вы (возможно) не знали
Вещи в Java, о которых вы (возможно) не зналиВещи в Java, о которых вы (возможно) не знали
Вещи в Java, о которых вы (возможно) не знали
Zheka Kozlov
 
20120309 formal semantics shilov_lecture04
20120309 formal semantics shilov_lecture0420120309 formal semantics shilov_lecture04
20120309 formal semantics shilov_lecture04Computer Science Club
 

What's hot (20)

Илья Фомин - Проблемы автоматизируемости тестирования и их решения
Илья Фомин - Проблемы автоматизируемости тестирования и их решенияИлья Фомин - Проблемы автоматизируемости тестирования и их решения
Илья Фомин - Проблемы автоматизируемости тестирования и их решения
 
КГТУ Лекция 1: Обеспечение Качества Программного Обеспечения
КГТУ Лекция 1: Обеспечение Качества Программного ОбеспеченияКГТУ Лекция 1: Обеспечение Качества Программного Обеспечения
КГТУ Лекция 1: Обеспечение Качества Программного Обеспечения
 
API design in java project
API design in java projectAPI design in java project
API design in java project
 
Testing of Embedded SW – Alternative to Classic TDD
Testing of Embedded SW – Alternative to Classic TDDTesting of Embedded SW – Alternative to Classic TDD
Testing of Embedded SW – Alternative to Classic TDD
 
Урок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибокУрок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибок
 
Дефекты при тестировании ПО
Дефекты при тестировании ПОДефекты при тестировании ПО
Дефекты при тестировании ПО
 
анализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияанализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестирования
 
Илья Фофанов "Обработка ошибок в C#"
Илья Фофанов "Обработка ошибок в C#"Илья Фофанов "Обработка ошибок в C#"
Илья Фофанов "Обработка ошибок в C#"
 
ПРИМЕНЕНИЕ ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ К ГЕНЕРАЦИИ ТЕСТОВ ДЛЯ АВТОМАТНЫХ ПРОГРАММ
ПРИМЕНЕНИЕ ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ К ГЕНЕРАЦИИ ТЕСТОВ ДЛЯ АВТОМАТНЫХ ПРОГРАММПРИМЕНЕНИЕ ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ К ГЕНЕРАЦИИ ТЕСТОВ ДЛЯ АВТОМАТНЫХ ПРОГРАММ
ПРИМЕНЕНИЕ ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ К ГЕНЕРАЦИИ ТЕСТОВ ДЛЯ АВТОМАТНЫХ ПРОГРАММ
 
ОЛЕКСАНДР ЄПІШЕВ «Мутаційне тестування: тести для тестів» Lviv QA Day 2019
ОЛЕКСАНДР ЄПІШЕВ «Мутаційне тестування: тести для тестів»  Lviv QA Day 2019ОЛЕКСАНДР ЄПІШЕВ «Мутаційне тестування: тести для тестів»  Lviv QA Day 2019
ОЛЕКСАНДР ЄПІШЕВ «Мутаційне тестування: тести для тестів» Lviv QA Day 2019
 
Что такое "Parallel Lint"?
Что такое "Parallel Lint"?Что такое "Parallel Lint"?
Что такое "Parallel Lint"?
 
Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...
Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...
Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...
 
Андрей Кирпичев "Гибкая модульность инструментами АОП"
Андрей Кирпичев  "Гибкая модульность инструментами АОП"Андрей Кирпичев  "Гибкая модульность инструментами АОП"
Андрей Кирпичев "Гибкая модульность инструментами АОП"
 
быстрое тестирование
быстрое тестированиебыстрое тестирование
быстрое тестирование
 
Сложности performance-тестирования / Андрей Акиньшин (JetBrains)
Сложности performance-тестирования / Андрей Акиньшин (JetBrains)Сложности performance-тестирования / Андрей Акиньшин (JetBrains)
Сложности performance-тестирования / Андрей Акиньшин (JetBrains)
 
Security Tesint: Sql injection
Security Tesint: Sql injectionSecurity Tesint: Sql injection
Security Tesint: Sql injection
 
обработка исключений в Java
обработка исключений в Javaобработка исключений в Java
обработка исключений в Java
 
Obzor 2013 presentation
Obzor 2013 presentationObzor 2013 presentation
Obzor 2013 presentation
 
Вещи в Java, о которых вы (возможно) не знали
Вещи в Java, о которых вы (возможно) не зналиВещи в Java, о которых вы (возможно) не знали
Вещи в Java, о которых вы (возможно) не знали
 
20120309 formal semantics shilov_lecture04
20120309 formal semantics shilov_lecture0420120309 formal semantics shilov_lecture04
20120309 formal semantics shilov_lecture04
 

Viewers also liked

Чудеса производительности
Чудеса производительностиЧудеса производительности
Чудеса производительности
Marat Akhin
 
Тестирование осень 2013 лекция 2
Тестирование осень 2013 лекция 2Тестирование осень 2013 лекция 2
Тестирование осень 2013 лекция 2Technopark
 
TestDesignReloaded(Ru)
TestDesignReloaded(Ru)TestDesignReloaded(Ru)
TestDesignReloaded(Ru)
Viktoriia Kravchenko (Paschenko)
 
Экспертные системы: лекция №2
Экспертные системы: лекция №2Экспертные системы: лекция №2
Экспертные системы: лекция №2
Laboratory of Information Science and Semantic Technologies
 
Test Design Technics
Test Design TechnicsTest Design Technics
Test Design TechnicsISsoft
 
Техники тест дизайна для черноящичного тестирования
Техники тест дизайна для черноящичного тестированияТехники тест дизайна для черноящичного тестирования
Техники тест дизайна для черноящичного тестирования
Dmytro Protsenko
 
Таблицы принятия решений
Таблицы принятия решенийТаблицы принятия решений
Таблицы принятия решений
SQALab
 
Software testing in practice
Software testing in practiceSoftware testing in practice
Software testing in practicenikolay_vasiliev
 
Domain-тестирование
Domain-тестированиеDomain-тестирование
Domain-тестирование
SPB SQA Group
 
Мастер Тест План / Тестовая Стратегия: Что это? Зачем? Как его создать?-От А ...
Мастер Тест План / Тестовая Стратегия: Что это? Зачем? Как его создать?-От А ...Мастер Тест План / Тестовая Стратегия: Что это? Зачем? Как его создать?-От А ...
Мастер Тест План / Тестовая Стратегия: Что это? Зачем? Как его создать?-От А ...
SQALab
 

Viewers also liked (11)

Black box testing
Black box testingBlack box testing
Black box testing
 
Чудеса производительности
Чудеса производительностиЧудеса производительности
Чудеса производительности
 
Тестирование осень 2013 лекция 2
Тестирование осень 2013 лекция 2Тестирование осень 2013 лекция 2
Тестирование осень 2013 лекция 2
 
TestDesignReloaded(Ru)
TestDesignReloaded(Ru)TestDesignReloaded(Ru)
TestDesignReloaded(Ru)
 
Экспертные системы: лекция №2
Экспертные системы: лекция №2Экспертные системы: лекция №2
Экспертные системы: лекция №2
 
Test Design Technics
Test Design TechnicsTest Design Technics
Test Design Technics
 
Техники тест дизайна для черноящичного тестирования
Техники тест дизайна для черноящичного тестированияТехники тест дизайна для черноящичного тестирования
Техники тест дизайна для черноящичного тестирования
 
Таблицы принятия решений
Таблицы принятия решенийТаблицы принятия решений
Таблицы принятия решений
 
Software testing in practice
Software testing in practiceSoftware testing in practice
Software testing in practice
 
Domain-тестирование
Domain-тестированиеDomain-тестирование
Domain-тестирование
 
Мастер Тест План / Тестовая Стратегия: Что это? Зачем? Как его создать?-От А ...
Мастер Тест План / Тестовая Стратегия: Что это? Зачем? Как его создать?-От А ...Мастер Тест План / Тестовая Стратегия: Что это? Зачем? Как его создать?-От А ...
Мастер Тест План / Тестовая Стратегия: Что это? Зачем? Как его создать?-От А ...
 

Similar to Тестирование ПО (2016)

Mva stf module 5 - rus
Mva stf module 5 - rusMva stf module 5 - rus
Mva stf module 5 - rus
Maxim Shaptala
 
Лекция 1 введение в тестирование ПО, основные понятия и принципы
Лекция 1 введение в тестирование ПО, основные понятия и принципыЛекция 1 введение в тестирование ПО, основные понятия и принципы
Лекция 1 введение в тестирование ПО, основные понятия и принципы
Sergey Chuburov
 
QA Fest 2016. Инна Блажко. ISTQB – What is it? Who needs it? How to prepare a...
QA Fest 2016. Инна Блажко. ISTQB – What is it? Who needs it? How to prepare a...QA Fest 2016. Инна Блажко. ISTQB – What is it? Who needs it? How to prepare a...
QA Fest 2016. Инна Блажко. ISTQB – What is it? Who needs it? How to prepare a...
QAFest
 
Инструменты для проведения конкурентного анализа программных продуктов | Вла...
Инструменты для проведения конкурентного анализа программных продуктов |  Вла...Инструменты для проведения конкурентного анализа программных продуктов |  Вла...
Инструменты для проведения конкурентного анализа программных продуктов | Вла...
Positive Hack Days
 
Алексей Петров, Mail.Ru Group, "Организация конвейера автоматизации тестирова...
Алексей Петров, Mail.Ru Group, "Организация конвейера автоматизации тестирова...Алексей Петров, Mail.Ru Group, "Организация конвейера автоматизации тестирова...
Алексей Петров, Mail.Ru Group, "Организация конвейера автоматизации тестирова...
Mail.ru Group
 
Организация конвейера автоматизации тестирования / Алексей Петров (Mail.ru Gr...
Организация конвейера автоматизации тестирования / Алексей Петров (Mail.ru Gr...Организация конвейера автоматизации тестирования / Алексей Петров (Mail.ru Gr...
Организация конвейера автоматизации тестирования / Алексей Петров (Mail.ru Gr...
Ontico
 
Автоматизация тестирования встроенного ПО
Автоматизация тестирования встроенного ПОАвтоматизация тестирования встроенного ПО
Автоматизация тестирования встроенного ПО
SQALab
 
Mva stf module 6 - rus
Mva stf module 6 - rusMva stf module 6 - rus
Mva stf module 6 - rus
Maxim Shaptala
 
Роль тестировщика в Lean. Светлана Федянина
Роль тестировщика в Lean. Светлана ФедянинаРоль тестировщика в Lean. Светлана Федянина
Роль тестировщика в Lean. Светлана Федянинаqasib
 
Автоматизация тестирования - это пот, кровь и слезы
Автоматизация тестирования - это пот, кровь и слезы Автоматизация тестирования - это пот, кровь и слезы
Автоматизация тестирования - это пот, кровь и слезы
Maxim Shulga
 
О чем никто не говорит, а Google не находит? - нюансы Severity и Priority
О чем никто не говорит, а Google не находит? - нюансы Severity и PriorityО чем никто не говорит, а Google не находит? - нюансы Severity и Priority
О чем никто не говорит, а Google не находит? - нюансы Severity и Priority
SQALab
 
Severity и Priority для неначинающих: очевидное и невероятное
Severity и Priority для неначинающих: очевидное и невероятноеSeverity и Priority для неначинающих: очевидное и невероятное
Severity и Priority для неначинающих: очевидное и невероятное
Deutsche Post
 
Физическое моделирование объекта управления
Физическое моделирование объекта управленияФизическое моделирование объекта управления
Физическое моделирование объекта управления
MATLAB
 
Mva stf module 2 - rus
Mva stf module 2 - rusMva stf module 2 - rus
Mva stf module 2 - rus
Maxim Shaptala
 
Светлана Федянина - Процесс тестирования в распределенной команде
Светлана Федянина - Процесс тестирования в распределенной командеСветлана Федянина - Процесс тестирования в распределенной команде
Светлана Федянина - Процесс тестирования в распределенной команде
SQALab
 
Процесс тестирования в распределенной команде
Процесс тестирования в распределенной командеПроцесс тестирования в распределенной команде
Процесс тестирования в распределенной команде
Svetlana Fedyanina
 
IT basics for non technical CEO (Rus)
IT basics for non technical CEO (Rus)IT basics for non technical CEO (Rus)
IT basics for non technical CEO (Rus)
Anton Karpenko (KARPOLAN)
 
Программирование как этап решения задач на компьютере
Программирование как этап решения задач на компьютереПрограммирование как этап решения задач на компьютере
Программирование как этап решения задач на компьютере
Andrey Dolinin
 

Similar to Тестирование ПО (2016) (20)

Mva stf module 5 - rus
Mva stf module 5 - rusMva stf module 5 - rus
Mva stf module 5 - rus
 
Лекция 1 введение в тестирование ПО, основные понятия и принципы
Лекция 1 введение в тестирование ПО, основные понятия и принципыЛекция 1 введение в тестирование ПО, основные понятия и принципы
Лекция 1 введение в тестирование ПО, основные понятия и принципы
 
QA Fest 2016. Инна Блажко. ISTQB – What is it? Who needs it? How to prepare a...
QA Fest 2016. Инна Блажко. ISTQB – What is it? Who needs it? How to prepare a...QA Fest 2016. Инна Блажко. ISTQB – What is it? Who needs it? How to prepare a...
QA Fest 2016. Инна Блажко. ISTQB – What is it? Who needs it? How to prepare a...
 
Инструменты для проведения конкурентного анализа программных продуктов | Вла...
Инструменты для проведения конкурентного анализа программных продуктов |  Вла...Инструменты для проведения конкурентного анализа программных продуктов |  Вла...
Инструменты для проведения конкурентного анализа программных продуктов | Вла...
 
Алексей Петров, Mail.Ru Group, "Организация конвейера автоматизации тестирова...
Алексей Петров, Mail.Ru Group, "Организация конвейера автоматизации тестирова...Алексей Петров, Mail.Ru Group, "Организация конвейера автоматизации тестирова...
Алексей Петров, Mail.Ru Group, "Организация конвейера автоматизации тестирова...
 
Организация конвейера автоматизации тестирования / Алексей Петров (Mail.ru Gr...
Организация конвейера автоматизации тестирования / Алексей Петров (Mail.ru Gr...Организация конвейера автоматизации тестирования / Алексей Петров (Mail.ru Gr...
Организация конвейера автоматизации тестирования / Алексей Петров (Mail.ru Gr...
 
Автоматизация тестирования встроенного ПО
Автоматизация тестирования встроенного ПОАвтоматизация тестирования встроенного ПО
Автоматизация тестирования встроенного ПО
 
Mva stf module 6 - rus
Mva stf module 6 - rusMva stf module 6 - rus
Mva stf module 6 - rus
 
Роль тестировщика в Lean. Светлана Федянина
Роль тестировщика в Lean. Светлана ФедянинаРоль тестировщика в Lean. Светлана Федянина
Роль тестировщика в Lean. Светлана Федянина
 
Автоматизация тестирования - это пот, кровь и слезы
Автоматизация тестирования - это пот, кровь и слезы Автоматизация тестирования - это пот, кровь и слезы
Автоматизация тестирования - это пот, кровь и слезы
 
Software Testing
Software TestingSoftware Testing
Software Testing
 
Qt tool evaluation
Qt tool evaluationQt tool evaluation
Qt tool evaluation
 
О чем никто не говорит, а Google не находит? - нюансы Severity и Priority
О чем никто не говорит, а Google не находит? - нюансы Severity и PriorityО чем никто не говорит, а Google не находит? - нюансы Severity и Priority
О чем никто не говорит, а Google не находит? - нюансы Severity и Priority
 
Severity и Priority для неначинающих: очевидное и невероятное
Severity и Priority для неначинающих: очевидное и невероятноеSeverity и Priority для неначинающих: очевидное и невероятное
Severity и Priority для неначинающих: очевидное и невероятное
 
Физическое моделирование объекта управления
Физическое моделирование объекта управленияФизическое моделирование объекта управления
Физическое моделирование объекта управления
 
Mva stf module 2 - rus
Mva stf module 2 - rusMva stf module 2 - rus
Mva stf module 2 - rus
 
Светлана Федянина - Процесс тестирования в распределенной команде
Светлана Федянина - Процесс тестирования в распределенной командеСветлана Федянина - Процесс тестирования в распределенной команде
Светлана Федянина - Процесс тестирования в распределенной команде
 
Процесс тестирования в распределенной команде
Процесс тестирования в распределенной командеПроцесс тестирования в распределенной команде
Процесс тестирования в распределенной команде
 
IT basics for non technical CEO (Rus)
IT basics for non technical CEO (Rus)IT basics for non technical CEO (Rus)
IT basics for non technical CEO (Rus)
 
Программирование как этап решения задач на компьютере
Программирование как этап решения задач на компьютереПрограммирование как этап решения задач на компьютере
Программирование как этап решения задач на компьютере
 

Тестирование ПО (2016)

  • 1. Tестирование программного обеспечения Что, зачем и почему? Software Testing 101 Марат Ахин Санкт-Петербургский политехнический университет 2016 Марат Ахин (СПбПУ) Intro 2016 1 / 359
  • 2. Содержание 1 Прелюдия Обеспечение качества ПО Тестирование ПО 2 Тестирование за 45 минут 3 Тестирование в процессе разработки ПО 4 Проблема тестовых входных данных 5 Проблема неявных входных данных 6 Разработка через тестирование 7 Интеграционное тестирование Марат Ахин (СПбПУ) Intro 2016 2 / 359
  • 3. Обеспечение качества ПО Функциональные vs нефункциональные требования Марат Ахин (СПбПУ) Intro 2016 3 / 359
  • 4. Обеспечение качества ПО Функциональные требования Адекватность Точность Интероперабельность Безопасность Нефункциональные требования Надежность Эффективность Поддерживаемость Переносимость Как можно их проверять? Марат Ахин (СПбПУ) Intro 2016 4 / 359
  • 5. Обеспечение качества ПО Марат Ахин (СПбПУ) Intro 2016 5 / 359
  • 6. Обеспечение качества ПО Thinking is hard, running is simple. (c) Запустить программу просто и это можно сделать всегда Думать о программе сложно и требует «высшего знания» Будем запускать программу, чтобы проверить, отвечает ли она предъявленным требованиям Марат Ахин (СПбПУ) Intro 2016 6 / 359
  • 7. Что такое тестирование ПО? То, чем вы будете заниматься до 80% времени Марат Ахин (СПбПУ) Intro 2016 7 / 359
  • 8. Что за вопрос лежит в основе тестирования? Работает ли это ПО правильно? НЕТ Работает ли это ПО неправильно? ДА Тестирование = Разрушение Марат Ахин (СПбПУ) Intro 2016 8 / 359
  • 9. Что за вопрос лежит в основе тестирования? Работает ли это ПО правильно? НЕТ Работает ли это ПО неправильно? ДА Тестирование = Разрушение Марат Ахин (СПбПУ) Intro 2016 8 / 359
  • 10. Что за вопрос лежит в основе тестирования? Работает ли это ПО правильно? НЕТ Работает ли это ПО неправильно? ДА Тестирование = Разрушение Марат Ахин (СПбПУ) Intro 2016 8 / 359
  • 11. Что за вопрос лежит в основе тестирования? Работает ли это ПО правильно? НЕТ Работает ли это ПО неправильно? ДА Тестирование = Разрушение Марат Ахин (СПбПУ) Intro 2016 8 / 359
  • 12. Что за вопрос лежит в основе тестирования? Работает ли это ПО правильно? НЕТ Работает ли это ПО неправильно? ДА Тестирование = Разрушение Марат Ахин (СПбПУ) Intro 2016 8 / 359
  • 13. Кому помогает тестирование? Лучший друг верификации и валидации ПО В чем разница? Верификация – «мы сделали это правильно» Валидация – «мы сделали то, что надо» Марат Ахин (СПбПУ) Intro 2016 9 / 359
  • 14. Можем ли мы что-то гарантировать при тестировании? Данное ПО никогда не упадет Потоки никогда не заблокируются Вычисления всегда выполняются корректно Временные характеристики всегда выдерживаются Мы можем дать такие гарантии лишь в самых тривиальных случаях, когда обычно все ясно и без тестирования Марат Ахин (СПбПУ) Intro 2016 10 / 359
  • 15. Можем ли мы что-то гарантировать при тестировании? Данное ПО никогда не упадет Потоки никогда не заблокируются Вычисления всегда выполняются корректно Временные характеристики всегда выдерживаются Мы можем дать такие гарантии лишь в самых тривиальных случаях, когда обычно все ясно и без тестирования Марат Ахин (СПбПУ) Intro 2016 10 / 359
  • 16. Почему тестировать сложно? Brian Kernighan «Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.» Massimo Arnoldi (feat. Kent Beck) «Unfortunately at least for me (and not only) testing goes against human nature. If you realize the pig in you, you will see that you program without tests.» Марат Ахин (СПбПУ) Intro 2016 11 / 359
  • 17. Почему тестировать нужно? Если отложить сегодняшние дела на послезавтра, у вас появятся два свободных дня! (с) Марат Ахин (СПбПУ) Intro 2016 12 / 359
  • 18. Что же делать? Марат Ахин (СПбПУ) Intro 2016 13 / 359
  • 19. Содержание 1 Прелюдия 2 Тестирование за 45 минут Тестирование ПО с точки зрения дилетанта Модель программной ошибки Модель тестирования ПО Процесс тестирования ПО 3 Тестирование в процессе разработки ПО 4 Проблема тестовых входных данных 5 Проблема неявных входных данных 6 Разработка через тестирование 7 Интеграционное тестированиеМарат Ахин (СПбПУ) Intro 2016 14 / 359
  • 20. Тестирование ПО с точки зрения дилетанта Запустили приложение Проверили результаты выполнения на предмет наличия в них ошибок aka «багов» aka «сбоев» aka «дефектов» aka «неудач» Сперва надо разобраться, а что же такое «программная ошибка»? Марат Ахин (СПбПУ) Intro 2016 15 / 359
  • 21. Модель программной ошибки FAILURE FAULT ERROR Неудача – наблюдаемое снаружи некорректное поведение программы Сбой – некорректное состояние программы из-за ошибки Ошибка – ошибка в самой программе, внесенная на этапе разработки Рассмотрим данную модель на примере Марат Ахин (СПбПУ) Intro 2016 16 / 359
  • 22. Модель программной ошибки Найдите ошибку в следующей программе на Java 1 int sumCollection (final @NotNull Collection <Integer > c) { 2 int sum = 0; 3 for (int i : c) { 4 sum += i; 5 } 6 return sum; 7 } Возможное переполнение в строке 4 Марат Ахин (СПбПУ) Intro 2016 17 / 359
  • 23. Модель программной ошибки Найдите ошибку в следующей программе на Java 1 int sumCollection (final @NotNull Collection <Integer > c) { 2 int sum = 0; 3 for (int i : c) { 4 sum += i; 5 } 6 return sum; 7 } Возможное переполнение в строке 4 Марат Ахин (СПбПУ) Intro 2016 17 / 359
  • 24. Модель программной ошибки c = {} Что будет? 1 int sumCollection (final @NotNull Collection <Integer > c) { 2 int sum = 0; 3 for (int i : c) { 4 sum += i; 5 } 6 return sum; 7 } Нет ни сбоя, ни неудачи – программа работает корректно Марат Ахин (СПбПУ) Intro 2016 18 / 359
  • 25. Модель программной ошибки c = {} Что будет? 1 int sumCollection (final @NotNull Collection <Integer > c) { 2 int sum = 0; 3 for (int i : c) { 4 sum += i; 5 } 6 return sum; 7 } Нет ни сбоя, ни неудачи – программа работает корректно Марат Ахин (СПбПУ) Intro 2016 18 / 359
  • 26. Модель программной ошибки c = {1, 2, 3, 5} Что будет? 1 int sumCollection (final @NotNull Collection <Integer > c) { 2 int sum = 0; 3 for (int i : c) { 4 sum += i; 5 } 6 return sum; 7 } Нет ни сбоя, ни неудачи – программа работает корректно Марат Ахин (СПбПУ) Intro 2016 19 / 359
  • 27. Модель программной ошибки c = {1, 2, 3, 5} Что будет? 1 int sumCollection (final @NotNull Collection <Integer > c) { 2 int sum = 0; 3 for (int i : c) { 4 sum += i; 5 } 6 return sum; 7 } Нет ни сбоя, ни неудачи – программа работает корректно Марат Ахин (СПбПУ) Intro 2016 19 / 359
  • 28. Модель программной ошибки c = {1, 2, 3, 5, Integer.MAX_VALUE, Integer.MIN_VALUE} Что будет? 1 int sumCollection (final @NotNull Collection <Integer > c) { 2 int sum = 0; 3 for (int i : c) { 4 sum += i; 5 } 6 return sum; 7 } Сбой есть – программа проходит через некорректное состояние Но неудачи нет – результат работы программы корректен Марат Ахин (СПбПУ) Intro 2016 20 / 359
  • 29. Модель программной ошибки c = {1, 2, 3, 5, Integer.MAX_VALUE, Integer.MIN_VALUE} Что будет? 1 int sumCollection (final @NotNull Collection <Integer > c) { 2 int sum = 0; 3 for (int i : c) { 4 sum += i; 5 } 6 return sum; 7 } Сбой есть – программа проходит через некорректное состояние Но неудачи нет – результат работы программы корректен Марат Ахин (СПбПУ) Intro 2016 20 / 359
  • 30. Модель программной ошибки c = {1, 2, 3, 5, Integer.MAX_VALUE} Что будет? 1 int sumCollection (final @NotNull Collection <Integer > c) { 2 int sum = 0; 3 for (int i : c) { 4 sum += i; 5 } 6 return sum; 7 } Сбой есть – программа проходит через некорректное состояние Неудача тоже есть – результат работы программы неправильный Марат Ахин (СПбПУ) Intro 2016 21 / 359
  • 31. Модель программной ошибки c = {1, 2, 3, 5, Integer.MAX_VALUE} Что будет? 1 int sumCollection (final @NotNull Collection <Integer > c) { 2 int sum = 0; 3 for (int i : c) { 4 sum += i; 5 } 6 return sum; 7 } Сбой есть – программа проходит через некорректное состояние Неудача тоже есть – результат работы программы неправильный Марат Ахин (СПбПУ) Intro 2016 21 / 359
  • 32. Что мы делали? Запускали ПО (мысленно) Сравнивали результаты работы с ожидаемыми (логически) Можно ли придумать другой способ тестирования? Марат Ахин (СПбПУ) Intro 2016 22 / 359
  • 33. Модель тестирования ПО Эталонная модель может быть представлена множеством различных способов неформальное представление о том, «как должна работать программа» формальная техническая спецификация набор тестовых примеров корректные результаты работы программы другая (априори корректная) реализация той же исходной спецификации Марат Ахин (СПбПУ) Intro 2016 23 / 359
  • 34. Процесс тестирования ПО Что может случиться? Марат Ахин (СПбПУ) Intro 2016 24 / 359
  • 35. Тест прошел A-WE-SO-ME! Марат Ахин (СПбПУ) Intro 2016 25 / 359
  • 36. Тест не прошел OH-MI-GOD! Марат Ахин (СПбПУ) Intro 2016 26 / 359
  • 37. Ошибка в ПО Все просто и понятно, да? Марат Ахин (СПбПУ) Intro 2016 27 / 359
  • 38. Ошибка в эталонной модели Некорректный тест? Ошибка в спецификации? Марат Ахин (СПбПУ) Intro 2016 28 / 359
  • 39. Ошибка в тестовом окружении Баг в тестовой библиотеке? Марат Ахин (СПбПУ) Intro 2016 29 / 359
  • 40. Ошибка в платформе Баг в ОС? Аппаратный сбой? Ошибка компилятора? Марат Ахин (СПбПУ) Intro 2016 30 / 359
  • 41. Процесс тестирования ПО Является ли данная модель самодостаточной? Марат Ахин (СПбПУ) Intro 2016 31 / 359
  • 42. Процесс тестирования ПО Откуда брать эталонную модель? Как сравнивать результаты работы программы и модели? Марат Ахин (СПбПУ) Intro 2016 32 / 359
  • 43. Процесс тестирования ПО Когда останавливать процесс тестирования? Марат Ахин (СПбПУ) Intro 2016 33 / 359
  • 44. Процесс тестирования ПО Как подобрать входные данные, чтобы: дойти до места с программной ошибкой (Reachibility) испортить состояние программы с появлением сбоя (Corruption) вызвать неудачу в работе программы (Propagation) Марат Ахин (СПбПУ) Intro 2016 34 / 359
  • 45. Проблемы тестирования What’s up, Doc? (с) Проблема тестовых входных данных Проблема наблюдаемости Проблема «останова» Проблема тестового оракула Марат Ахин (СПбПУ) Intro 2016 35 / 359
  • 46. Содержание 1 Прелюдия 2 Тестирование за 45 минут 3 Тестирование в процессе разработки ПО Модели разработки ПО Проблемы тестирования ПО 4 Проблема тестовых входных данных 5 Проблема неявных входных данных 6 Разработка через тестирование 7 Интеграционное тестирование Марат Ахин (СПбПУ) Intro 2016 36 / 359
  • 47. Модели разработки ПО Чем активнее используется тестирование в процессе разработки, тем важнее его правильное использование Марат Ахин (СПбПУ) Intro 2016 37 / 359
  • 48. Водопадная модель Строго последовательная модель разработки Тестирование выполняется над всей программой сразу Имеется хорошая эталонная модель Стоимость поиска и исправления ошибок очень высока Марат Ахин (СПбПУ) Intro 2016 38 / 359
  • 49. Инкрементальная модель Разработка проходит в несколько итераций Тестируются отдельные версии программы Имеется неплохая эталонная модель Стоимость поиска и исправления ошибок высока Марат Ахин (СПбПУ) Intro 2016 39 / 359
  • 50. Гибкая модель Все этапы разработки неразрывно связаны друг с другом Тестированию подвергаются как сама программа, так и ее компоненты Эталонная модель есть не всегда Стоимость поиска и исправления ошибок относительно низка Марат Ахин (СПбПУ) Intro 2016 40 / 359
  • 51. Проблемы тестирования ПО Разве что-то может пойти совсем плохо? Марат Ахин (СПбПУ) Intro 2016 41 / 359
  • 52. Розовые очки Марат Ахин (СПбПУ) Intro 2016 42 / 359
  • 53. Розовые очки Неправильное тестирование создает иллюзию, что все хорошо... ...тогда как на самом деле все может быть очень и очень плохо Все тесты проходят Выпускаем код в релиз ... BOOM! Марат Ахин (СПбПУ) Intro 2016 43 / 359
  • 55. Наводнение Неправильное тестирование создает иллюзию, что все плохо... ...тогда как на самом деле все вполне себе ничего Большинство тестов не проходит Садимся и исправляем ошибки ... UNREACHABLE! Марат Ахин (СПбПУ) Intro 2016 45 / 359
  • 57. Прятки Неправильное тестирование создает иллюзию, что все плохо... ...тогда как на самом деле все плохо в другом месте Некоторые тесты не проходит Садимся и ищем ошибки ... HUH? Марат Ахин (СПбПУ) Intro 2016 47 / 359
  • 58. Что же делать? Марат Ахин (СПбПУ) Intro 2016 48 / 359
  • 59. Что же делать? Марат Ахин (СПбПУ) Intro 2016 49 / 359
  • 61. Проблема тестовых входных данных Software Testing 101 Марат Ахин Санкт-Петербургский политехнический университет 2016 Марат Ахин (СПбПУ) Input 2016 51 / 359
  • 64. Проблемы тестирования What’s up, Doc? (с) Проблема тестовых входных данных Проблема наблюдаемости Проблема «останова» Проблема тестового оракула Марат Ахин (СПбПУ) Input 2016 54 / 359
  • 65. Содержание 1 Прелюдия 2 Тестирование за 45 минут 3 Тестирование в процессе разработки ПО 4 Проблема тестовых входных данных Обеспечение достижимости Входные данные Тестовые данные Классы эквивалентности 5 Проблема неявных входных данных 6 Разработка через тестирование 7 Интеграционное тестированиеМарат Ахин (СПбПУ) Input 2016 55 / 359
  • 66. Обеспечение достижимости Какими способами можно управлять выполнением кода? Изменением входных данных Изменением самого исходного кода Какой способ можно использовать для обеспечения достижимости (reachability)? Марат Ахин (СПбПУ) Input 2016 56 / 359
  • 67. Обеспечение достижимости Какими способами можно управлять выполнением кода? Изменением входных данных Изменением самого исходного кода Какой способ можно использовать для обеспечения достижимости (reachability)? Марат Ахин (СПбПУ) Input 2016 56 / 359
  • 68. Обеспечение достижимости Какими способами можно управлять выполнением кода? Изменением входных данных Изменением самого исходного кода Какой способ можно использовать для обеспечения достижимости (reachability)? Марат Ахин (СПбПУ) Input 2016 56 / 359
  • 69. Обеспечение достижимости Какими способами можно управлять выполнением кода? Изменением входных данных Изменением самого исходного кода Какой способ можно использовать для обеспечения достижимости (reachability)? Марат Ахин (СПбПУ) Input 2016 56 / 359
  • 70. Входные данные Что такое входные данные? Марат Ахин (СПбПУ) Input 2016 57 / 359
  • 71. Входные данные Файлы Фактические аргументы функций Сетевые пакеты Результаты запроса к БД Последовательность вызовов функций Конфигурация ПО Марат Ахин (СПбПУ) Input 2016 58 / 359
  • 72. Тестовые данные Почему бы просто не перебрать все возможные варианты? 1 int add(int a, int b) { ... } 18,446,744,073,709,551,616 вариантов А если у тестируемого модуля есть внутреннее состояние? Марат Ахин (СПбПУ) Input 2016 59 / 359
  • 73. Тестовые данные Марат Ахин (СПбПУ) Input 2016 60 / 359
  • 74. Классы эквивалентности Все пространство входных состояний можно разбить на множество классов эквивалентности Каждый класс эквивалентности обрабатывается тестируемым модулем одинаково с точки зрения спецификации Тестирование всех классов эквивалентности позволяет найти ошибки прямого нарушения спецификации Как найти классы эквивалентности? Марат Ахин (СПбПУ) Input 2016 61 / 359
  • 75. Ad hoc testing Тестирование методом «научного тыка» Запускаем ПО Смотрим на результаты работы ... PROFIT! Марат Ахин (СПбПУ) Input 2016 62 / 359
  • 76. Ad hoc testing А что будет, если я нажму на эту кнопочку? Если сложить два положительных числа, то... После умножения на ноль в результате должен получится ноль Если ввести очень большое число и удвоить его, то... В чем проблемы при таком подходе к тестированию? Марат Ахин (СПбПУ) Input 2016 63 / 359
  • 77. Метод свободного поиска Ad hoc testing + планирование Описываем тест-план Проверяем ПО на соответствие тест-плану ... PROFIT! Марат Ахин (СПбПУ) Input 2016 64 / 359
  • 78. Метод свободного поиска Если ввести число «42», потом нажать «+», потом ввести «1» и нажать «=», в результате должно получиться «43» Многократные нажатия на «C» не должны приводить к видимым изменениям в интерфейсе В чем проблемы при таком подходе к тестированию? Марат Ахин (СПбПУ) Input 2016 65 / 359
  • 79. Анализ граничных значений Баю баюшки баю, не ложися на краю... Находим пограничные значения входных данных Проверяем ПО вокруг выбранных пограничных значений ... PROFIT! Марат Ахин (СПбПУ) Input 2016 66 / 359
  • 80. Анализ граничных значений Если умножить любое число на «0», должен получиться «0» Деление любого числа на «0» должно приводить к выводу соответствующей ошибки Если изменить знак наибольшего представимого положительного числа, должно получиться соответствующее ему отрицательное число В чем проблемы при таком подходе к тестированию? Марат Ахин (СПбПУ) Input 2016 67 / 359
  • 82. Содержание 1 Прелюдия 2 Тестирование за 45 минут 3 Тестирование в процессе разработки ПО 4 Проблема тестовых входных данных 5 Проблема неявных входных данных Неявные входные данные Использование заглушек 6 Разработка через тестирование 7 Интеграционное тестирование Марат Ахин (СПбПУ) Input 2016 69 / 359
  • 83. Неявные входные данные Покрывает ли спецификация все множество входных данных? В некоторых случаях – да В большинстве случаев – нет Почему? Проблема заключается в том, что на тестовый модуль, кроме явных, влияет множество неявных входных данных Неявные входные данные часто не находят отражения в спецификации Марат Ахин (СПбПУ) Input 2016 70 / 359
  • 84. Неявные входные данные Текущая дата/время IP/MAC адрес Локаль пользователя Идентификаторы устройств Контекстные переключения/планирование нитей Скорость поступления IP пакетов Ритм нажатия клавиш на клавиатуре Все это – примеры неявных входных данных Марат Ахин (СПбПУ) Input 2016 71 / 359
  • 86. Robot pharmacist Марат Ахин (СПбПУ) Input 2016 73 / 359
  • 87. Как учесть неявные входные данные? Какими способами можно управлять выполнением кода? Изменением входных данных Изменением самого исходного кода Simulate and Stub Заменяем части модуля управляемыми заглушками Это позволяет сделать неявные входные данные явными Это также делает управление явными входными данными проще Марат Ахин (СПбПУ) Input 2016 74 / 359
  • 88. Использование заглушек Данный подход позволяет: имитировать возникновение редких ситуаций внести детерминизм там, где его нет Для того, чтобы можно было использовать S&S, тестируемый модуль должен разрабатываться соответствующим образом Марат Ахин (СПбПУ) Input 2016 75 / 359
  • 89. Mock-объекты Пример S&S – mock-объекты Повторяют внешний интерфейс тестируемого объекта Могут демонстрировать любое требуемое поведение Марат Ахин (СПбПУ) Input 2016 76 / 359
  • 90. Mockito 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 } Марат Ахин (СПбПУ) Input 2016 77 / 359
  • 91. Mockito Сервис аутентификации и авторизации Вход пользователя с корректными логином/паролем должен приводить к переходу его учетной записи в активное состояние Марат Ахин (СПбПУ) Input 2016 78 / 359
  • 92. Mockito 1 @Test 2 void testLoginForValidUser () { 3 IPasswordInfo passInfo = mock( IPasswordInfo .class ); 4 when(passInfo.matches(anyString ())). thenReturn(true ); 5 6 IAccount account = mock(IAccount.class ); 7 when(account. getPasswordInfo ()). thenReturn(passInfo ); 8 9 IAccountRepository repo = mock( IAccountRepository .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 } Марат Ахин (СПбПУ) Input 2016 79 / 359
  • 93. Mockito Сервис аутентификации и авторизации Три последовательные попытки входа пользователя с некорректным паролем должны приводить к блокированию его учетной записи Марат Ахин (СПбПУ) Input 2016 80 / 359
  • 94. Mockito 1 @Test 2 void testBlockOnIncorrectLogin () { 3 IPasswordInfo passInfo = mock( IPasswordInfo .class ); 4 when(passInfo.matches(anyString ())). thenReturn(false ); 5 6 IAccount account = mock(IAccount.class ); 7 when(account. getPasswordInfo ()). thenReturn(passInfo ); 8 9 IAccountRepository repo = mock( IAccountRepository .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 } Марат Ахин (СПбПУ) Input 2016 81 / 359
  • 95. Mockito 1 @Test 2 void testBlockOnIncorrectLoginPerAccount () { 3 IPasswordInfo aliceInfo = getMockedPasswordInfo (false ); 4 IPasswordInfo bobInfo = getMockedPasswordInfo (false ); 5 6 IAccount aliceAcc = getMockedAccount (aliceInfo ); 7 IAccount bobAcc = getMockedAccount (bobInfo ); 8 9 IAccountRepository repo = mock( IAccountRepository .class ); 10 when(repo.find("alice", anyString ())). thenReturn(aliceAcc ); 11 when(repo.find("bob", anyString ())). thenReturn(bobAcc ); 12 13 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"); 19 20 verify(aliceAcc , never ()). setBlocked(true ); 21 verify(bobAcc , times (1)). setBlocked(true ); 22 } Марат Ахин (СПбПУ) Input 2016 82 / 359
  • 96. Mocks = Stubs = Fakes = Dummies Разве есть разница? Dummies Объект-муляж, не обладающий собственным поведением Fakes Упрощенная реализация требуемой функциональности Stubs Тестовая заглушка, способная отвечать на внешние запросы Mocks Тестовая загрушка, способная отвечать на внешние запросы и проверять их корректность Марат Ахин (СПбПУ) Input 2016 83 / 359
  • 97. Содержание 1 Прелюдия 2 Тестирование за 45 минут 3 Тестирование в процессе разработки ПО 4 Проблема тестовых входных данных 5 Проблема неявных входных данных 6 Разработка через тестирование Test-driven development Плюсы TDD Минусы TDD 7 Интеграционное тестирование Марат Ахин (СПбПУ) Input 2016 84 / 359
  • 98. Нужны ли заглушки? А как использовать mock-объекты в процессе разработки? Для управления неявными входными данными Для управления явными входными данными А когда их следует использовать? Марат Ахин (СПбПУ) Input 2016 85 / 359
  • 99. Заглушки не нужны? Никогда! Зачем тратить время на разработку и использование заглушек? Можно просто подождать, пока не будут разработаны все компоненты Получится проще, дешевле и лучше, чем с заглушками! Марат Ахин (СПбПУ) Input 2016 86 / 359
  • 100. Заглушки не нужны? Все же будет хорошо, да? Марат Ахин (СПбПУ) Input 2016 87 / 359
  • 101. Заглушки нужны? Чем дольше итерация, тем сложнее и дороже исправление ошибок Чем быстрее будут написаны тесты для разрабатываемого компонента, тем проще найти ошибки После разработки компонента пишем для него тест Отсутствующие части системы заменяем заглушками ... PROFIT! Марат Ахин (СПбПУ) Input 2016 88 / 359
  • 102. Заглушки нужны? А давайте писать тесты еще быстрее? Марат Ахин (СПбПУ) Input 2016 89 / 359
  • 103. Test-driven development Пишем тест для компонента перед его разработкой Заменяем сам компонент заглушкой ... PROFIT??? Разве это будет работать? Марат Ахин (СПбПУ) Input 2016 90 / 359
  • 104. Test-driven development Разве это будет работать? Марат Ахин (СПбПУ) Input 2016 91 / 359
  • 105. Плюсы TDD Разработка ведется небольшими контролируемыми фрагментами В каждый момент времени разработчик думает об ограниченном фрагменте спецификации Это упрощает анализ возможного пространства входных данных Кроме того, код получается более модульным и расширяемым Марат Ахин (СПбПУ) Input 2016 92 / 359
  • 106. Плюсы TDD Минимальная цена ошибки В случае возникновения ошибки очень просто вернуть систему в рабочее состояние Практически отсутствует необходимость в отладке Крайне просто использовать метод бисекции в случае, если ошибка смогла пробраться в релиз Марат Ахин (СПбПУ) Input 2016 93 / 359
  • 107. Плюсы TDD Ошибки обнаруживаются сразу же после их появления Постоянный запуск тестов гарантирует практически моментальное обнаружение ошибки Малый размер тестов позволяет быстро найти причину ошибки Марат Ахин (СПбПУ) Input 2016 94 / 359
  • 108. Плюсы TDD Сильно упрощается рефакторинг кода Программист уверен в том, что его изменения ничего не ломают Облегчается раздельное владение кодом Марат Ахин (СПбПУ) Input 2016 95 / 359
  • 109. Почему я слышу о TDD впервые в жизни? Почему TDD не используют везде и всюду?! Марат Ахин (СПбПУ) Input 2016 96 / 359
  • 110. Минусы TDD Синдром «розовых очков» Большое количество тестов создает иллюзию бесконечной надежности системы тестирования При создании теста разработчик может сделать те же допущения, что и при разработке самого компонента Марат Ахин (СПбПУ) Input 2016 97 / 359
  • 111. Минусы TDD Поддержание тестов в актуальном состоянии При внесении изменений в интерфейсы компонентов системы необходимо соответствующим образом изменить и все тесты Большое количество тестов приводит к значительным затратам на рефакторинг тестов Марат Ахин (СПбПУ) Input 2016 98 / 359
  • 112. Минусы TDD Невозможность тестирования сложного взаимодействия нескольких компонентов Каждый тест проверяет ограниченный фрагмент функциональности системы Взаимодействие компонентов затрагивает множество аспектов системы сразу Марат Ахин (СПбПУ) Input 2016 99 / 359
  • 113. Стоит ли использовать TDD? Марат Ахин (СПбПУ) Input 2016 100 / 359
  • 114. Содержание 1 Прелюдия 2 Тестирование за 45 минут 3 Тестирование в процессе разработки ПО 4 Проблема тестовых входных данных 5 Проблема неявных входных данных 6 Разработка через тестирование 7 Интеграционное тестирование Проблема «Большого Взрыва» Нисходящее интеграционное тестирование Восходящее интеграционное тестирование Марат Ахин (СПбПУ) Input 2016 101 / 359
  • 115. Проблема «Большого Взрыва» Когда приходит время заменять заглушки на реализацию... Марат Ахин (СПбПУ) Input 2016 102 / 359
  • 116. Проблема «Большого Взрыва» Поведение реализации может (и скорее всего будет) отличаться от поведения заглушки Если заглушек было много... Марат Ахин (СПбПУ) Input 2016 103 / 359
  • 117. Проблема «Большого Взрыва» Каскадное распространение сбоев Сложность локализации ошибок Большая стоимость исправления ошибок Что мы можем сделать? Марат Ахин (СПбПУ) Input 2016 104 / 359
  • 118. Интеграционное тестирование Ускорить процесс замены заглушек на реализацию Выполнять тестирование взаимодействия постоянно, в процессе разработки Заменять заглушки на реализацию инкрементально Инкрементальное интеграционное тестирование Марат Ахин (СПбПУ) Input 2016 105 / 359
  • 120. Нисходящее интеграционное тестирование Тестирование начинается с верхних уровней системы Отсутствующие на данный момент модули заменяются «заглушками» По мере реализации новых модулей они подключаются к системе вместо «заглушек» Марат Ахин (СПбПУ) Input 2016 107 / 359
  • 121. Нисходящее интеграционное тестирование Преимущества Возможность ранней проверки корректности высокоуровневого поведения Модули могут добавляться по одному, независимо друг от друга Не требуется разработка множества драйверов Можно разрабатывать систему как в глубину, так и в ширину Марат Ахин (СПбПУ) Input 2016 108 / 359
  • 122. Нисходящее интеграционное тестирование Недостатки Отложенная проверка низкоуровневого поведения Требуется разработка «заглушек» Крайне сложно корректно сформулировать требования ко входам/выходам частичной системы Марат Ахин (СПбПУ) Input 2016 109 / 359
  • 123. Восходящее интеграционное тестирование Тестирование начинается с нижних уровней системы Отсутствующие на данный момент модули заменяются драйверами При реализации всех модулей нижнего уровня драйвер может быть заменен на соответствующий модуль Марат Ахин (СПбПУ) Input 2016 110 / 359
  • 124. Восходящее интеграционное тестирование Преимущества Возможность ранней проверки корректности низкоуровневого поведения Не требуется написание заглушек Просто определить требования ко входам/выходам модулей Марат Ахин (СПбПУ) Input 2016 111 / 359
  • 125. Восходящее интеграционное тестирование Недостатки Отложенная проверка высокоуровневого поведения Требуется разработка драйверов При замене драйвера на модуль высокого уровня может произойти «мини-Большой Взрыв» Марат Ахин (СПбПУ) Input 2016 112 / 359
  • 126. Проблемы тестирования What’s up, Doc? (с) Проблема тестовых входных данных Проблема наблюдаемости Проблема «останова» Проблема тестового оракула Марат Ахин (СПбПУ) Input 2016 113 / 359
  • 127. Обеспечение порчи внутреннего состояния Для того, чтобы обеспечить порчу внутреннего состояния (corruption), необходимо: обеспечить достижимость передать такие тестовые входные данные, которые вызывают нарушение целостности внутреннего состояния См. проблему тестовых входных данных Марат Ахин (СПбПУ) Input 2016 114 / 359
  • 129. Проблема наблюдаемости Software Testing 101 Марат Ахин Санкт-Петербургский политехнический университет 2016 Марат Ахин (СПбПУ) PP 2016 116 / 359
  • 132. Проблемы тестирования What’s up, Doc? (с) Проблема тестовых входных данных Проблема наблюдаемости Проблема «останова» Проблема тестового оракула Марат Ахин (СПбПУ) PP 2016 119 / 359
  • 133. Содержание 1 Прелюдия 2 Тестирование за 45 минут 3 Тестирование в процессе разработки ПО 4 Проблема тестовых входных данных 5 Проблема неявных входных данных 6 Разработка через тестирование 7 Интеграционное тестирование 8 Проблема наблюдаемости Обеспечение распространения сбоя Марат Ахин (СПбПУ) PP 2016 120 / 359
  • 134. Обеспечение распространения сбоя Какими способами можно управлять выполнением кода? Изменением входных данных Изменением самого исходного кода Необходимо обнаружить сбой и распространить его, сделав наблюдаемым снаружи (Propagation) Марат Ахин (СПбПУ) PP 2016 121 / 359
  • 136. Assertions Основной способ обеспечения наблюдаемости – assertions 1 private void checkInvariants () { 2 assert elements[tail] == null; 3 assert head == tail 4 ? elements[head] == null 5 : (elements[head] != null && 6 elements [( tail - 1) & (elements.length - 1)] != null ); 7 assert elements [( head - 1) & (elements.length - 1)] == null; 8 } Марат Ахин (СПбПУ) PP 2016 123 / 359
  • 137. Assertions Что такое assertion? Формула в логике первого порядка Проверяется на истинность во время выполнения программы Также может проверяться на истинность статически Допускает возможность отключения проверки истинности Марат Ахин (СПбПУ) PP 2016 124 / 359
  • 138. Что дает использование assertions? Проверка корректности внутреннего состояния Внутреннее состояние обычно недоступно снаружи (полностью или частично) При изменении состояния хочется проверить, что оно остается корректным Марат Ахин (СПбПУ) PP 2016 125 / 359
  • 139. Что дает использование assertions? Неудача происходит ближе к причине ее возникновения Чем больше задержка перед обнаружением неудачи, тем сложнее найти ее исходную причину Assertions позволяют найти неудачу практически в любой точке программы Марат Ахин (СПбПУ) PP 2016 126 / 359
  • 140. Что дает использование assertions? Явное документирование пред- и пост-условий В общем случае программист ничего не знает о контракте используемой функции Использование assertions позволяет в явном виде описать внешний контракт функции Марат Ахин (СПбПУ) PP 2016 127 / 359
  • 142. Какие проблемы связаны с assertions? Ошибки в assertions Побочные эффекты в assertions Неправильное логическое условие срабатывания Марат Ахин (СПбПУ) PP 2016 129 / 359
  • 143. Какие проблемы связаны с assertions? Влияние на производительность Проверка assertions занимает время Чем сложнее assertion, тем больше он замедляет работу программы Марат Ахин (СПбПУ) PP 2016 130 / 359
  • 144. Какие проблемы связаны с assertions? Эффект «вышибалы» Сработавший assertion превращает любую ошибку в неудачу Это полностью останавливает возможность дальнейшего тестирования Марат Ахин (СПбПУ) PP 2016 131 / 359
  • 145. Какие проблемы связаны с assertions? Сложность проверки определенных условий Некоторые просто формулируемые условия крайне сложно проверить на практике Их реализация в виде assertion является крайне затруднительной Марат Ахин (СПбПУ) PP 2016 132 / 359
  • 146. Работают ли assertions? Марат Ахин (СПбПУ) PP 2016 133 / 359
  • 147. Работают ли assertions? 1 int* ptr = malloc(sizeof(int) * 10); 2 assert(ptr); Адекватный assertion в правильном месте Марат Ахин (СПбПУ) PP 2016 134 / 359
  • 148. Работают ли assertions? 1 int* ptr = malloc(sizeof(int) * 10); 2 assert(ptr); Замена обработки ошибок на assertion Марат Ахин (СПбПУ) PP 2016 135 / 359
  • 149. Работают ли assertions? Марат Ахин (СПбПУ) PP 2016 136 / 359
  • 150. Работают ли assertions? Microsoft Office ≈ 1% Proprietary software ≈ 3% Open source software ≈ 5% Eiffel software ≈ 7% Сейчас assertions используются еще более широко Марат Ахин (СПбПУ) PP 2016 137 / 359
  • 151. Работают ли assertions?1 LLVM ≈ 500,000 SLOC ≈ 7000 assertions > 400 ошибок, относящихся к assertions 1 http://blog.regehr.org/ Марат Ахин (СПбПУ) PP 2016 138 / 359
  • 152. Работают ли assertions?1 GCC ≈ 1,000,000 SLOC ≈ 9500 assertions > 200 ошибок, относящихся к assertions 1 http://blog.regehr.org/ Марат Ахин (СПбПУ) PP 2016 138 / 359
  • 153. Работают ли assertions?2 1 assert( BlockAddrFwdRefs .empty () && ...); 2 assert(Ty == V->getType () && ...); 3 assert ((Ty == 0 || Ty == V->getType ()) && ...); 4 assert(It != ResolveConstants .end() && ...); 5 assert(isa <ConstantExpr >( UserC) && ...); 6 assert(V->getType ()-> isMetadataTy () && ...); 7 assert ((! Alignment || isPowerOf2_32 (Alignment )) && ...); 8 assert (( Record[i] == 3 || Record[i] == 4) && ...); 9 assert(Record[i] == 0 && ...); 10 assert(Record[i] == 0 && ...); 11 assert(ResultTy && ...); 12 assert(TypeList[NumRecords] == 0 && ...); 13 assert(NextBitCode == bitc :: METADATA_NAMED_NODE ); 14 assert ((CT != LandingPadInst :: Catch 15 || !isa <ArrayType >(Val ->getType ())) && ...); 16 assert ((CT != LandingPadInst :: Filter 17 || isa <ArrayType >(Val ->getType ())) && ...); 18 assert(DFII != DeferredFunctionInfo .end () && ...); 19 assert( DeferredFunctionInfo .count(F) && ...); 20 assert(M == TheModule && ...); 2 http://blog.regehr.org/ Марат Ахин (СПбПУ) PP 2016 139 / 359
  • 155. Журналирование Журналирование (logging) Запись хода выполнения программы в том или ином виде В зависимости от необходимости журнал может быть более или менее детализированным По журналу выполнения при необходимости возможно восстановить причину возникшей ошибки Марат Ахин (СПбПУ) PP 2016 141 / 359
  • 156. Журналирование Журналирование для пользователя Высокоуровневые сообщения Как можно меньше «мусора» Чем проще и понятнее формат сообщений, тем лучше Журналирование для программиста Низкоуровневые сообщения Допустим любой шум Никаких ограничений на формат сообщений Марат Ахин (СПбПУ) PP 2016 142 / 359
  • 157. Как вести журнал? 1 Result :: Ptr processBatchJob (Job :: Ptr job) { 2 // do the heavy lifting ... 3 } Как записать ход выполнения программы? Марат Ахин (СПбПУ) PP 2016 143 / 359
  • 158. Как вести журнал? 1 Result :: Ptr ThreadedProcessor :: processBatchJob (Job:: Ptr job) { 2 log () << "Start of: " << job << endl; 3 // do the heavy lifting ... 4 log () << "End of: " << job << endl; 5 } Ручная вставка журналирующих вызовов Марат Ахин (СПбПУ) PP 2016 144 / 359
  • 159. Как вести журнал? 1 aspect ProcessTracer { 2 advice call("% %Processor :: process %(%)") : before () { 3 log () << "Start of: " << * JoinedPoint ::arg <0 >() << endl; 4 } 5 advice call("% %Processor :: process %(%)") : after () { 6 log () << "End of: " << *JoinedPoint ::arg <0 >() << endl; 7 } 8 }; Журналирующие аспекты / интерсепторы Марат Ахин (СПбПУ) PP 2016 145 / 359
  • 160. Как вести журнал? Logging as a Service Марат Ахин (СПбПУ) PP 2016 146 / 359
  • 161. Основная проблема журналирования INFO [http -thread -pool -8080(5)] Received token: e6749451 TRACE [http -thread -pool -8080(5)] Calling: AuthStorageBean . getAuthData TRACE [http -thread -pool -8080(5)] Called: AuthStorageBean .getAuthData -> 2.0708E-5 INFO [http -thread -pool -8080(5)] Authentication data found: AuthData { authToken:e6749451 userId :1 firstName: lastName:Admin patrName: role:ru.korus.tmis.core.entity.model. Role[id=1] spec: } TRACE [http -thread -pool -8080(5)] Calling: AuthStorageBean . getAuthDateTime TRACE [http -thread -pool -8080(5)] Called: AuthStorageBean . getAuthDateTime -> 1.9825E-5 INFO [http -thread -pool -8080(5)] Token is valid TRACE [http -thread -pool -8080(5)] attempting to get session; create = false; session is null = true; session has id = false TRACE [http -thread -pool -8080(5)] Authentication attempt received for token [ru.korus.tmis .core.auth. TmisShiroToken@37bd2b6 ] DEBUG [http -thread -pool -8080(5)] Performing credentials equality check for tokenCredentials of type [java.lang.String and accountCredentials of type [java.lang .String] DEBUG [http -thread -pool -8080(5)] Both credentials arguments can be easily converted to byte arrays. Performing array equals comparison DEBUG [http -thread -pool -8080(5)] Authentication successful for token [ru.korus.tmis.core. auth. TmisShiroToken@37bd2b6 ]. Returned account [(admin ,ru.korus.tmis.core.entity. model.Role[id =1])] DEBUG [http -thread -pool -8080(5)] No SecurityManager available in subject context map. Falling back to SecurityUtils . getSecurityManager () lookup. Too much data! Марат Ахин (СПбПУ) PP 2016 147 / 359
  • 162. Основная проблема журналирования Чем больше мы хотим узнать о ходе выполнения программы, тем больше мы должны журналировать Чем больше мы журналируем, тем сложнее разобраться в журнале Чем сложнее разобраться в журнале, тем меньше мы знаем о ходе выполнения программы Марат Ахин (СПбПУ) PP 2016 148 / 359
  • 163. Ограничение размера журнала Необходимо ограничивать размер записываемых данных Марат Ахин (СПбПУ) PP 2016 149 / 359
  • 164. Уровни журналирования Сообщения пишутся в журнал с определенным уровнем В дальнейшем возможно фильтровать сообщения по уровням Error / Warning / Info / Debug / Trace Марат Ахин (СПбПУ) PP 2016 150 / 359
  • 165. Домены журналирования Домены ортогональны уровням журналирования В зависимости от типа сообщения пишутся в разные домены Database / Network / UI / Configuration / ... Марат Ахин (СПбПУ) PP 2016 151 / 359
  • 166. Стохастическое журналирование В случае, если какие-то события встречаются очень часто, достаточно записывать лишь их часть 1 if (_ok == true) { 2 _logger.log( Level.WARNING , "Server seen down: " + _addr , e ); 3 } else if (Math.random () < 0.1) { 4 _logger.log( Level.WARNING , "Server seen down: " + _addr ); 5 } Марат Ахин (СПбПУ) PP 2016 152 / 359
  • 167. Сессионное журналирование Часто работа ПО разбита на набор слабо связанных сессий Каждая сессия может журналироваться независимо от других 1 try { 2 // logging ... 3 } catch (Exception ex) { 4 ctx.logging. dumpCurrentSession (); 5 throw; 6 } finally { 7 ctx.logging.reset (); 8 } Марат Ахин (СПбПУ) PP 2016 153 / 359
  • 168. Структурированное журналирование Вместо простого текста журнал ведется в определенном формате Структурированный формат облегчает поиск и анализ по журналу 1 { 2 "session_id": "e6749451", 3 "event": " method_call", 4 "class_name": " AuthStorageBean ", 5 "method_name ": "getAuthData " 6 } Марат Ахин (СПбПУ) PP 2016 154 / 359
  • 170. Полнота тестирования ПО Software Testing 101 Марат Ахин Санкт-Петербургский политехнический университет 2016 Марат Ахин (СПбПУ) TC 2016 156 / 359
  • 173. Проблемы тестирования What’s up, Doc? (с) Проблема тестовых входных данных Проблема наблюдаемости Проблема «останова» Проблема тестового оракула Марат Ахин (СПбПУ) TC 2016 159 / 359
  • 174. Содержание 1 Прелюдия 2 Тестирование за 45 минут 3 Тестирование в процессе разработки ПО 4 Проблема тестовых входных данных 5 Проблема неявных входных данных 6 Разработка через тестирование 7 Интеграционное тестирование 8 Проблема наблюдаемости Марат Ахин (СПбПУ) TC 2016 160 / 359
  • 175. Проблема «останова» в тестировании Проблема останова По заданному алгоритму и входным данным определить, завершится ли за конечное время его выполнение При чем здесь тестирование?! Марат Ахин (СПбПУ) TC 2016 161 / 359
  • 176. Проблема «останова» в тестировании Алгоритм ⇔ процесс тестирования Входные данные ⇔ тестируемая программа В подавляющем большинстве случаев процесс тестирования является бесконечным Марат Ахин (СПбПУ) TC 2016 162 / 359
  • 177. Проблема «останова» в тестировании Мы не можем позволить себе тестировать бесконечное время Слишком долго Слишком дорого Слишком странно Что же делать? Марат Ахин (СПбПУ) TC 2016 163 / 359
  • 178. Проблема «останова» в тестировании Останавливать процесс тестирования «вручную» Когда? У нас кончилось время и/или деньги на тестирование Мы протестировали ПО достаточно хорошо Марат Ахин (СПбПУ) TC 2016 164 / 359
  • 179. Проблема «останова» в тестировании Проблема «останова» в тестировании По заданному набору тестов и программе определить, протестировали ли мы ее достаточно хорошо Что такое – достаточно хорошо? Марат Ахин (СПбПУ) TC 2016 165 / 359
  • 180. Тестовое покрытие Мы протестировали программу достаточно хорошо, когда мы нашли большую часть ошибок в программе Чтобы найти ошибку, необходимо обеспечить выполнение трех основных свойств Обеспечение достижимости (reachability) и порчи (corruption) требует, чтобы мы выполнили определенный участок кода с определенными входными данными Качество тестирования можно оценить через тестовое покрытие Марат Ахин (СПбПУ) TC 2016 166 / 359
  • 181. Виды тестового покрытия Выделяют два основных вида покрытия Покрытие потока управления Покрытие потока данных Они работают с такими понятиями, как граф потока управления (CFG) и граф потока данных (DFG) Надеюсь, что все знают, что такое CFG и DFG? Марат Ахин (СПбПУ) TC 2016 167 / 359
  • 182. Покрытие потока управления Как мы можем покрыть данный CFG? По узлам По дугам По условиям По путям ... Марат Ахин (СПбПУ) TC 2016 168 / 359
  • 183. Покрытие операторов программы Каждый узел CFG был пройден в процессе тестирования хотя бы один раз Самый слабый способ оценки тестового покрытия Сколько тестов требуется для того, чтобы обеспечить полное покрытие операторов программы для следующего примера? Марат Ахин (СПбПУ) TC 2016 169 / 359
  • 184. Покрытие ветвлений программы Каждая ветка программы была пройдена хотя бы один раз Несколько более сильный способ оценки покрытия Сколько тестов требуется для того, чтобы обеспечить полное покрытие ветвлений программы для следующего примера? Марат Ахин (СПбПУ) TC 2016 170 / 359
  • 185. Покрытие ветвлений программы Как соотносятся между собой покрытия операторов и ветвлений? 1 Никак 2 Покрытие операторов включает покрытие ветвлений 3 Покрытие ветвлений включает покрытие операторов Марат Ахин (СПбПУ) TC 2016 171 / 359
  • 186. Покрытие ветвлений программы Никак Почему покрытие ветвлений не включает в себя покрытие операторов? Потому что в программе может присутствовать «мертвый код» Потому что в программе могут вообще отсутствовать ветвления Марат Ахин (СПбПУ) TC 2016 172 / 359
  • 187. Покрытие условий программы Каждое ветвление может выполняться по различным причинам При покрытии условий программы мы требуем, чтобы все условия ветвлений хотя бы один раз приняли значение true и false 1 if (req.isSsl () && (cfg.SslEnabled () || cfg.isDebug ())) { 2 ... 3 } Как соотносятся между собой покрытия ветвлений и условий? Марат Ахин (СПбПУ) TC 2016 173 / 359
  • 188. Покрытие условий программы Никак Разные комбинации условий могут приводить к выбору одного и того же ветвления 1 if (req. isLocalhost () || cfg.isDebug () || cfg.isDevMode ()) { 2 ... 3 } Марат Ахин (СПбПУ) TC 2016 174 / 359
  • 189. Покрытие ветвлений и условий программы Комбинация соответствующих покрытий Полностью их покрывает Можно ли предложить что-то более сильное? 1 if (req.isSsl () && (cfg.SslEnabled () || cfg.isDebug ())) { 2 ... 3 } Марат Ахин (СПбПУ) TC 2016 175 / 359
  • 190. Модифицированное покрытие ветвлений и условий Также известное как MC/DC Является одним из обязательных условий при тестировании ПО на уровень A в рамках DO-178B Чем оно отличается от обычного покрытия ветвлений и условий программы? 1 if (req.isSsl () && (cfg.SslEnabled () || cfg.isDebug ())) { 2 ... 3 } Марат Ахин (СПбПУ) TC 2016 176 / 359
  • 191. Модифицированное покрытие ветвлений и условий Каждое условие независимо повлияло на выполнение программы Как это проверить? Изменить одно условие и проверить, изменилось ли ветвление 1 if (req.isSsl () && (cfg.SslEnabled () || cfg.isDebug ())) { 2 ... 3 } Марат Ахин (СПбПУ) TC 2016 177 / 359
  • 192. Полное покрытие условий программы Полный перебор всех возможных комбинаций условий всех возможных ветвлений Сколько вариантов необходимо перебрать, чтобы получить полное комбинационное покрытие для следующего примера? 1 if (req.isSsl () && (cfg.SslEnabled () || cfg.isDebug ())) { 2 ... 3 } Марат Ахин (СПбПУ) TC 2016 178 / 359
  • 193. Покрытие путей программы Мы требуем, чтобы все возможные пути программы были выполнены хотя бы один раз Как данное покрытие соотносится с полным покрытием условий? Обычно считается самым сильным типом покрытия потока управления Его можно было бы использовать, если бы не... Циклы и рекурсия Марат Ахин (СПбПУ) TC 2016 179 / 359
  • 194. Покрытие путей программы Мы требуем, чтобы все возможные пути программы были выполнены хотя бы один раз Как данное покрытие соотносится с полным покрытием условий? Обычно считается самым сильным типом покрытия потока управления Его можно было бы использовать, если бы не... Циклы и рекурсия Марат Ахин (СПбПУ) TC 2016 179 / 359
  • 195. Покрытие путей программы Мы требуем, чтобы все возможные пути программы были выполнены хотя бы один раз Как данное покрытие соотносится с полным покрытием условий? Обычно считается самым сильным типом покрытия потока управления Его можно было бы использовать, если бы не... Циклы и рекурсия Марат Ахин (СПбПУ) TC 2016 179 / 359
  • 196. Покрытие путей программы 450 возможных путей Марат Ахин (СПбПУ) TC 2016 180 / 359
  • 197. Покрытие путей программы 450 возможных путей Марат Ахин (СПбПУ) TC 2016 180 / 359
  • 198. Покрытие путей программы Для борьбы с этим используют несколько подходов Один из вариантов Требуем, чтобы тело цикла было выполнено 0 1 k max Объясните, почему выбраны именно эти варианты Марат Ахин (СПбПУ) TC 2016 181 / 359
  • 199. Покрытие потока данных Что еще можно сделать? Можно вспомнить о том, что программы работают не просто так Основная цель работы любой программы – работа с данными С этой точки зрения для тестирования представляет интерес анализ таких путей выполнения программы, на которых активно работают с данными Сперва вспомним несколько определений Марат Ахин (СПбПУ) TC 2016 182 / 359
  • 200. Определения и использования переменных Определение переменной (Def) Оператор программы, в котором значение переменной v может быть изменено v = 42 f(&v, ...) scanf(fmt, &v) Использование переменной (Use) Оператор программы, в котором значение переменной v влияет на выполнение программы тем или иным способом q = v + 2 g(v, ...) if (v != NULL) ... Марат Ахин (СПбПУ) TC 2016 183 / 359
  • 201. Определения и использования переменных Def-Use Chain Пара (d, u) операторов программы, для которой выполняются следующие условия d – определение переменной v u – использование переменной v между d и u существует хотя бы один путь, на котором переменная v не переопределяется Рассмотрим данные определения на примере Марат Ахин (СПбПУ) TC 2016 184 / 359
  • 203. Покрытие потока данных Какие варианты покрытий можно предложить с использованием этих понятий? Покрытие всех определений Для каждой интересующей нас переменной v должна быть протестирована хотя бы одна Def-Use Chain от каждого определения v до хотя бы одного использования v Марат Ахин (СПбПУ) TC 2016 186 / 359
  • 204. All-Def Coverage Рассмотрим следующие тесты 1 → 2 → 3 → 4 → 5 → 6 Марат Ахин (СПбПУ) TC 2016 187 / 359
  • 205. Покрытие потока данных Покрытие всех использований Для каждой интересующей нас переменной v должна быть протестирована хотя бы одна Def-Use Chain от каждого определения v до каждого использования v Является ли All-Use более сильным критерием по сравнению с All-Def? Марат Ахин (СПбПУ) TC 2016 188 / 359
  • 206. All-Use Coverage Рассмотрим следующие тесты 1 → 2 → 3 → 4 → 5 → 6 1 → 2 → 3 → 4 → 6 1 → 3 → 4 → 5 → 6 Марат Ахин (СПбПУ) TC 2016 189 / 359
  • 207. Покрытие потока данных Покрытие всех Def-Use Chain Для каждой интересующей нас переменной v должны быть протестированы все возможные Def-Use Chain от каждого определения v до каждого использования v Как соотносится All-Def-Use-Chain с покрытием всех путей программы? Марат Ахин (СПбПУ) TC 2016 190 / 359
  • 212. Другой способ оценки полноты Какими способами можно управлять выполнением кода? Изменением входных данных Изменением самого исходного кода Как можно оценить полноту тестирования, изменяя исходный код? Марат Ахин (СПбПУ) TC 2016 195 / 359
  • 213. Идеальный тест Идеальный тест работает только на тестируемой программе При любом изменений он перестает проходить В этом заключается основная идея мутационного тестирования Марат Ахин (СПбПУ) TC 2016 196 / 359
  • 214. Мутационное тестирование Исходная программа подвергается мутации, в результате получается набор из N мутантов После этого имеющиеся тесты запускаются на этих мутантах Если тест не проходит на мутанте, то говорят, что тест «убивает» этого мутанта Доля «убитых» мутантов показывает, насколько полно данный набор тестов покрывает нашу программу Марат Ахин (СПбПУ) TC 2016 197 / 359
  • 215. Как сделать мутанта? Что можно сделать с исходным кодом? Добавить новый код Удалить старый код Изменить существующий код Набор синтаксических трансформаций, изменяющих исходный код Марат Ахин (СПбПУ) TC 2016 198 / 359
  • 216. Как сделать мутанта? 1 int sumCollection (final @NotNull Collection <Integer > c) { 2 int sum = 0; 3 for (int i : c) { 4 sum += i; 5 } 6 return sum; 7 } Как можно мутировать данный фрагмент кода? Марат Ахин (СПбПУ) TC 2016 199 / 359
  • 217. Как сделать мутанта? Некоторые мутанты будут синтаксически некорректны Другие мутанты будут семантически некорректны Оставшиеся мутанты подходят для использования в мутационном тестировании Какие проблемы есть у мутационного тестирования? Марат Ахин (СПбПУ) TC 2016 200 / 359
  • 218. Недостатки мутационного тестирования Данный вид тестирования практически невозможно выполнять вручную Количество необходимых для оценки покрытия мутантов пропорционально объему анализируемого ПО Даже для небольшой программы получение достаточного числа мутантов вручную является практически невозможным Сильно возрастают затраты на проведение тестирования Вместо одного запуска каждого теста требуется выполнить N запусков Кроме того, дополнительное время тратится на генерацию мутантов Марат Ахин (СПбПУ) TC 2016 201 / 359
  • 222. Оценка тестового покрытия Мы же уже поговорили об оценке тестового покрытия? Оценка тестового покрытия программы Оценка самого тестового покрытия Who observes the observer? c Марат Ахин (СПбПУ) TC 2016 205 / 359
  • 223. Оценка тестового покрытия Какая проблема есть у покрытия потока управления? Чувствительность к изменениям в исходном коде Марат Ахин (СПбПУ) TC 2016 206 / 359
  • 224. Оценка тестового покрытия Какая проблема есть у покрытия потока управления? Чувствительность к изменениям в исходном коде Марат Ахин (СПбПУ) TC 2016 206 / 359
  • 225. Нестабильность тестового покрытия 1 ... 2 if (a && b && c) { 3 ... 4 } 1 bool cond = a && b && c; 2 if (cond) { 3 ... 4 } Что будет с покрытием MC/DC? Марат Ахин (СПбПУ) TC 2016 207 / 359
  • 226. Нестабильность тестового покрытия Чем сильнее влияют изменения в программе на тестовое покрытие, тем более нестабильным (fragile) является тестовое покрытие Чем более нестабильным является тестовое покрытие, тем менее адекватно оно оценивает качество тестирования Что же делать? Марат Ахин (СПбПУ) TC 2016 208 / 359
  • 227. Оценка тестового покрытия The whole is more than the sum of its parts c Можно применить мутационное тестирование для оценки тестового покрытия Ограничить набор трансформаций Посмотреть на изменение тестового покрытия для мутантов ... PROFIT! Марат Ахин (СПбПУ) TC 2016 209 / 359
  • 228. Оценка тестового покрытия Какая проблема есть у мутационного тестирования? Эквивалентные мутанты Марат Ахин (СПбПУ) TC 2016 210 / 359
  • 229. Оценка тестового покрытия Какая проблема есть у мутационного тестирования? Эквивалентные мутанты Марат Ахин (СПбПУ) TC 2016 210 / 359
  • 230. Эквивалентные мутанты 1 int sumCollection (final @NotNull Collection <Integer > c) { 2 int sum = 0; 3 for (int i : c) { 4 sum += i; 5 } 6 return sum; 7 } Почему эквивалентные мутанты – это плохо? Марат Ахин (СПбПУ) TC 2016 211 / 359
  • 231. Эквивалентные мутанты Эквивалентные мутанты «зашумляют» итоговую оценку качества тестирования Из-за шума снижается адекватность оценки Что же делать? Марат Ахин (СПбПУ) TC 2016 212 / 359
  • 232. Оценка тестового покрытия The whole is more than the sum of its parts c Можно применить тестовое покрытие для оценки мутационного тестирования Для каждого мутанта записывается трасса его выполнения У эквивалентных мутантов будут похожие трассы выполнения ... PROFIT! Марат Ахин (СПбПУ) TC 2016 213 / 359
  • 234. Тестовый оракул: что, где, когда Software Testing 101 Марат Ахин Санкт-Петербургский политехнический университет 2016 Марат Ахин (СПбПУ) TO 2016 215 / 359
  • 237. Проблемы тестирования What’s up, Doc? (с) Проблема тестовых входных данных Проблема наблюдаемости Проблема «останова» Проблема тестового оракула Марат Ахин (СПбПУ) TO 2016 218 / 359
  • 238. Содержание 1 Прелюдия 2 Тестирование за 45 минут 3 Тестирование в процессе разработки ПО 4 Проблема тестовых входных данных 5 Проблема неявных входных данных 6 Разработка через тестирование 7 Интеграционное тестирование 8 Проблема наблюдаемости Марат Ахин (СПбПУ) TO 2016 219 / 359
  • 239. Тестовый оракул Magic 8-ball тестирования Марат Ахин (СПбПУ) TO 2016 220 / 359
  • 240. Тестовый оракул Марат Ахин (СПбПУ) TO 2016 221 / 359
  • 241. Тестовый оракул В чем заключается проблема тестового оракула? Его нет! Марат Ахин (СПбПУ) TO 2016 222 / 359
  • 242. Тестовый оракул Вид тестового оракула очень сильно зависит от того, какую эталонную модель мы используем kd-tree stoi md5sum PDF reader Марат Ахин (СПбПУ) TO 2016 223 / 359
  • 244. Точность Способность оракула избегать ложных обнаружений Ложные обнаружения при тестировании – лишние затраты на их обнаружение и игнорирование Если их будет слишком много, оракул никто не будет использовать из-за зашумления результатов Марат Ахин (СПбПУ) TO 2016 225 / 359
  • 245. Полнота Способность оракула находить все ошибки Пропущенные ошибки при тестировании – дополнительные затраты на их исправление позднее Если оракул пропускает много ошибок, его необходимо усиливать другими способами Марат Ахин (СПбПУ) TO 2016 226 / 359
  • 246. Виды тестовых оракулов Варьируя используемые подходы, можно получить те или иные виды тестовых оракулов Слабые Средние Сильные Марат Ахин (СПбПУ) TO 2016 227 / 359
  • 247. Слабые оракулы Падение Segmentation fault Core dump Работают всегда Практически ничего не говорят о причине ошибки Марат Ахин (СПбПУ) TO 2016 228 / 359
  • 248. Слабые оракулы Сбой при работе в обычном окружении NullPointerException OutOfMemoryException ClassNotFoundException Работают при поддержке стандартной среды выполнения Содержат определенную информацию о месте ошибки Марат Ахин (СПбПУ) TO 2016 229 / 359
  • 249. Слабые оракулы Сбой при работе в специальном тестовом окружении Valgrind Предоставляют специальную среду выполнения Позволяют весьма точно определить причину ошибок Марат Ахин (СПбПУ) TO 2016 230 / 359
  • 250. Valgrind Фреймворк для построения средств динамического анализа программ Включает встроенные реализации для Memcheck Cachegrind Callgrind Helgrind DRD Massif DHAT ... Марат Ахин (СПбПУ) TO 2016 231 / 359
  • 251. Слабые оракулы Хорошая точность Плохая полнота Марат Ахин (СПбПУ) TO 2016 232 / 359
  • 252. Средние оракулы Assertions Тесты Требуют определенных усилий со стороны разработчиков В зависимости от степени усилий, будут более или менее точно указывать на место возникновения ошибки Марат Ахин (СПбПУ) TO 2016 233 / 359
  • 253. Средние оракулы Хорошая точность Средняя полнота Марат Ахин (СПбПУ) TO 2016 234 / 359
  • 254. Сильные оракулы Эталонная реализация Предыдущая версия программы Формально верифицированная реализация Автоматически сгенерированная версия Марат Ахин (СПбПУ) TO 2016 235 / 359
  • 255. Сильные оракулы «Обратная функция» Прямое/обратное преобразование Фурье Архиватор/деархиватор Кодер/декодер видео Марат Ахин (СПбПУ) TO 2016 236 / 359
  • 256. Сильные оракулы Средняя точность Хорошая полнота Марат Ахин (СПбПУ) TO 2016 237 / 359
  • 257. Генерация оракулов Можно ли генерировать оракула автоматически? Да! Слабые оракулы Средние оракулы Марат Ахин (СПбПУ) TO 2016 238 / 359
  • 258. Генерация оракулов Можно ли генерировать оракула автоматически? Да! Слабые оракулы Средние оракулы Марат Ахин (СПбПУ) TO 2016 238 / 359
  • 259. Генерация слабых оракулов Все уже есть Слабый оракул предоставляется средой выполнения Если что-то упало, мы всегда об этом узнаем Марат Ахин (СПбПУ) TO 2016 239 / 359
  • 260. Генерация слабых оракулов В явном виде используются весьма редко Случайное тестирование ... Сложно понять, где произошла ошибка Не всегда очевидно, в чем именно заключается ошибка Марат Ахин (СПбПУ) TO 2016 240 / 359
  • 262. Генерация средних оракулов Все уже есть Средние оракулы разрабатываются параллельно с разработкой ПО При возникновении проблемы мы сразу узнаем о ней Зачем их генерировать автоматически? Марат Ахин (СПбПУ) TO 2016 242 / 359
  • 263. Генерация средних оракулов Марат Ахин (СПбПУ) TO 2016 243 / 359
  • 264. Генерация assertions Assertions проверяют корректность внутреннего состояния Как автоматически сгенерировать assertions? Machine learning Марат Ахин (СПбПУ) TO 2016 244 / 359