КГТУ Лекция 1: Обеспечение Качества Программного ОбеспеченияIosif Itkin
Курс Лекций:
Обеспечение Качества Программного Обеспечения
Вводная Лекция: Основные Принципы
Максим Рудовский, Инновационные Трейдинговые Системы
Иосиф Иткин, Exactpro Systems
анализ кода: от проверки стиля до автоматического тестированияRuslan Shevchenko
Рассказ о истории и использовании в реальной жизни инструментов анализа кода на основе JavaChecker и TermWare
Сопустствующий текст: http://datacenter.gradsoft.ua/files/articles/OSDN2011/
В любой программе разработчики сталкиваются с необходимостью обработки ошибок. Основной механизм работы с ошибками в .NET Framework — это исключения. Мы поговорим о преимуществах и недостатках их использования. Вы узнаете, используются ли исключения для обработки ошибок в программном обеспечении марсохода NASA, а также о том, какие способы обработки исключений имеются в нашем распоряжении. Также обсудим, можно ли не использовать исключения для обработки ошибочных ситуаций. Приходите, будет интересно.
Moscow .Net Meetup #3
13 октября 2016
ПРИМЕНЕНИЕ ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ К ГЕНЕРАЦИИ ТЕСТОВ ДЛЯ АВТОМАТНЫХ ПРОГРАММITMO University
Описан подход к автоматизации тестирования автоматных программ. Для формализации требований спецификации к модели и объектам управления предлагается использовать контракты. Тест описывается как последовательность переходов в модели. Для автоматизации процесса создания кода теста предложен генетический алгоритм, который позволяет находить значения переменных, удовлетворяющие условиям на переходах.
Статья рассказывает о новом направлении в развитии статических анализаторов кода - верификации параллельных программ. В статье рассказывается о нескольких статических анализаторах, которые могут претендовать на звание "Parallel Lint".
Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...ScrumTrek
Автоматизация бизнес-процессов часто подразумевает интеграцию большого количества IT систем. При производстве такого ПО серьезной проблемой является сбор и анализ логов систем. Эта проблема актуальная и для системы FORIS, которая поддерживает бизнес МТС.
Мы разберем проблемы, которые подтолкнули к разработке системы Central Logging, обозначим решение этих проблем, узнаем, какое отношение имеет игра пинг-понг к разработке программного обеспечения, а так же, как Central Logging помогла нам меньше играть в пинг-понг и больше времени тратить на разработку новых задач для заказчика.
На встрече мы поговорим о том, как не бояться изменений и как быть к ним готовым. Дадим определение АОП. Рассмотрим проблемы, хорошо решаемые инструментами АОП. Построим модульную систему, применяя АОП. Сравним динамический и статический подходы в АОП. Дадим рекомендации по применению АОП.
Вас ждет река теории впадающая в море практики.
Сложности performance-тестирования / Андрей Акиньшин (JetBrains)Ontico
HighLoad++ 2017
Зал «Пекин+Шанхай», 7 ноября, 11:00
Тезисы:
http://www.highload.ru/2017/abstracts/3009.html
Если вас волнует производительность вашего приложения, то рано или поздно у вас могут появиться мысли о том, чтобы написать тесты на эту самую производительность. К сожалению, внедрить такие тесты в процесс разработки намного сложнее, чем может показаться на первый взгляд.
В этом докладе мы будем разговаривать про типичные проблемы тестирования производительности и возможные подходы к их решению.
КГТУ Лекция 1: Обеспечение Качества Программного ОбеспеченияIosif Itkin
Курс Лекций:
Обеспечение Качества Программного Обеспечения
Вводная Лекция: Основные Принципы
Максим Рудовский, Инновационные Трейдинговые Системы
Иосиф Иткин, Exactpro Systems
анализ кода: от проверки стиля до автоматического тестированияRuslan Shevchenko
Рассказ о истории и использовании в реальной жизни инструментов анализа кода на основе JavaChecker и TermWare
Сопустствующий текст: http://datacenter.gradsoft.ua/files/articles/OSDN2011/
В любой программе разработчики сталкиваются с необходимостью обработки ошибок. Основной механизм работы с ошибками в .NET Framework — это исключения. Мы поговорим о преимуществах и недостатках их использования. Вы узнаете, используются ли исключения для обработки ошибок в программном обеспечении марсохода NASA, а также о том, какие способы обработки исключений имеются в нашем распоряжении. Также обсудим, можно ли не использовать исключения для обработки ошибочных ситуаций. Приходите, будет интересно.
Moscow .Net Meetup #3
13 октября 2016
ПРИМЕНЕНИЕ ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ К ГЕНЕРАЦИИ ТЕСТОВ ДЛЯ АВТОМАТНЫХ ПРОГРАММITMO University
Описан подход к автоматизации тестирования автоматных программ. Для формализации требований спецификации к модели и объектам управления предлагается использовать контракты. Тест описывается как последовательность переходов в модели. Для автоматизации процесса создания кода теста предложен генетический алгоритм, который позволяет находить значения переменных, удовлетворяющие условиям на переходах.
Статья рассказывает о новом направлении в развитии статических анализаторов кода - верификации параллельных программ. В статье рассказывается о нескольких статических анализаторах, которые могут претендовать на звание "Parallel Lint".
Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...ScrumTrek
Автоматизация бизнес-процессов часто подразумевает интеграцию большого количества IT систем. При производстве такого ПО серьезной проблемой является сбор и анализ логов систем. Эта проблема актуальная и для системы FORIS, которая поддерживает бизнес МТС.
Мы разберем проблемы, которые подтолкнули к разработке системы Central Logging, обозначим решение этих проблем, узнаем, какое отношение имеет игра пинг-понг к разработке программного обеспечения, а так же, как Central Logging помогла нам меньше играть в пинг-понг и больше времени тратить на разработку новых задач для заказчика.
На встрече мы поговорим о том, как не бояться изменений и как быть к ним готовым. Дадим определение АОП. Рассмотрим проблемы, хорошо решаемые инструментами АОП. Построим модульную систему, применяя АОП. Сравним динамический и статический подходы в АОП. Дадим рекомендации по применению АОП.
Вас ждет река теории впадающая в море практики.
Сложности performance-тестирования / Андрей Акиньшин (JetBrains)Ontico
HighLoad++ 2017
Зал «Пекин+Шанхай», 7 ноября, 11:00
Тезисы:
http://www.highload.ru/2017/abstracts/3009.html
Если вас волнует производительность вашего приложения, то рано или поздно у вас могут появиться мысли о том, чтобы написать тесты на эту самую производительность. К сожалению, внедрить такие тесты в процесс разработки намного сложнее, чем может показаться на первый взгляд.
В этом докладе мы будем разговаривать про типичные проблемы тестирования производительности и возможные подходы к их решению.
Техники тест дизайна для черноящичного тестированияDmytro Protsenko
Разобрано на пальцах несколько техник из книги Lee Copeland "A Practitioner's Guide to Software Test Design". Все что касается BlackBox Testing - cгруппированo в три раздела. Oбъяснены секреты магии Pairwise, почему тестирование областей определения переворачивает самолеты и дана краткая инструкция, как вернуть деньги за билет, если в связи с предыдущим пунктом, вы передумали лететь.
Domain-тестирование – формальное название методики тестирования, за которым скрывается банальная работа с классами эквивалентности. Впрочем, не такая уж и банальная. Даже в популярной литературе по тестированию часто упоминают только о существовании классов эквивалентности и о том, что с их граничными значениями работать очень полезно.
Мы знакомимся с основами этой методики, когда делаем первые шаги в тестировании, и больше никогда о ней не задумываемся, наивно считая, что она попала в нашу зону неосознанной компетентности и мы всегда используем ее правильно. А так ли это?
Инструменты для проведения конкурентного анализа программных продуктов | Вла...Positive Hack Days
1. Что такое конкурентный анализ (КА) программных продуктов?
2. Методика и этапы КА.
3. Сложности реализации различных этапов КА.
4. Инструменты для автоматизации КА.
Алексей Петров, Mail.Ru Group, "Организация конвейера автоматизации тестирова...Mail.ru Group
Доклад о том, с чего начать выстраивать конвейер автоматизации тестирования. Как не утопить автоматизацию в мнимых штампах и стереотипах, построив по-настоящему эффективный процесс автоматизации тестирования.
Поделюсь опытом и расскажу:
- о том, с чего начать автоматизацию тестирования;
- о том, что делает автоматизированные тесты выгодными;
- как научить "зарабатывать" автотесты;
- о том, как превратить точечное написание автоматизирвоанных тестов в стройный конвейер с отлаженными процессами;
- о популярных ошибках и заблуждениях автоматизации тестирования и о том, как их избегать;
- о сопутствующих инструментах и лайфхаках из практики.
Доклад содержит полезные советы, как для тех, кто только думает внедрить автоматизацию тестирования, так и для тех, кто уже вовсю автоматизирует, но сталкивается с проблемами их эффективной работы или желает сделать автотесты еще более полезными.
Организация конвейера автоматизации тестирования / Алексей Петров (Mail.ru Gr...Ontico
Представить себе современную разработку программного обеспечения без процедур обеспечения качества и, в частности, тестирования, уже невозможно. Краеугольным камнем построения эффективного тестирования все чаще становятся автоматизированные регрессионные тесты. Именно они позволяют в нарастающем как снежный ком объеме тестов не погрязнуть в монотонном ручном тестировании, требующем все больше и больше ресурсов.
Но несмотря на кажущуюся простоту автоматизации тестирования, за годы работы мне приходилось регулярно сталкиваться с проблемами и сложностями построения стабильного процесса автоматизации тестирования. Поэтому в своем докладе я поделюсь опытом и расскажу:
- о том, с чего начать автоматизацию тестирования;
- о том, что делает автоматизированные тесты выгодными;
- как научить "зарабатывать" автотесты;
- о том, как превратить точечное написание автоматизирвоанных тестов в стройный конвейер с отлаженными процессами;
- о популярных ошибках и заблуждениях автоматизации тестирования и о том, как их избегать;
- о сопутствующих инструментах и лайфхаках из практики.
Доклад содержит полезные советы, как для тех, кто только думает внедрить автоматизацию тестирования, так и для тех, кто уже вовсю автоматизирует, но сталкивается с проблемами их эффективной работы или желает сделать автотесты еще более полезными.
Доклад посвящен различным способам построения математического описания ОУ с точностью достаточной для разработки алгоритмов управления. Мы продемонстрируем как построить модель, имея математическое описание и данные экспериментов, снятые с объекта. Покажем как совместить имеющиеся модели и эксперименты для повышения точности.
Программирование как этап решения задач на компьютере
Тестирование ПО (2016)
1. Tестирование программного обеспечения
Что, зачем и почему?
Software Testing 101
Марат Ахин
Санкт-Петербургский политехнический университет
2016
Марат Ахин (СПбПУ) Intro 2016 1 / 359
2. Содержание
1 Прелюдия
Обеспечение качества ПО
Тестирование ПО
2 Тестирование за 45 минут
3 Тестирование в процессе разработки ПО
4 Проблема тестовых входных данных
5 Проблема неявных входных данных
6 Разработка через тестирование
7 Интеграционное тестирование
Марат Ахин (СПбПУ) Intro 2016 2 / 359
4. Обеспечение качества ПО
Функциональные требования
Адекватность
Точность
Интероперабельность
Безопасность
Нефункциональные требования
Надежность
Эффективность
Поддерживаемость
Переносимость
Как можно их проверять?
Марат Ахин (СПбПУ) Intro 2016 4 / 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
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
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
53. Розовые очки
Неправильное тестирование создает иллюзию, что все хорошо...
...тогда как на самом деле все может быть очень и очень плохо
Все тесты проходят
Выпускаем код в релиз
...
BOOM!
Марат Ахин (СПбПУ) Intro 2016 43 / 359
55. Наводнение
Неправильное тестирование создает иллюзию, что все плохо...
...тогда как на самом деле все вполне себе ничего
Большинство тестов не проходит
Садимся и исправляем ошибки
...
UNREACHABLE!
Марат Ахин (СПбПУ) Intro 2016 45 / 359
57. Прятки
Неправильное тестирование создает иллюзию, что все плохо...
...тогда как на самом деле все плохо в другом месте
Некоторые тесты не проходит
Садимся и ищем ошибки
...
HUH?
Марат Ахин (СПбПУ) Intro 2016 47 / 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
71. Входные данные
Файлы
Фактические аргументы функций
Сетевые пакеты
Результаты запроса к БД
Последовательность вызовов функций
Конфигурация ПО
Марат Ахин (СПбПУ) Input 2016 58 / 359
72. Тестовые данные
Почему бы просто не перебрать все возможные варианты?
1 int add(int a, int b) { ... }
18,446,744,073,709,551,616 вариантов
А если у тестируемого модуля есть внутреннее состояние?
Марат Ахин (СПбПУ) Input 2016 59 / 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
87. Как учесть неявные входные данные?
Какими способами можно управлять выполнением кода?
Изменением входных данных
Изменением самого исходного кода
Simulate and Stub
Заменяем части модуля управляемыми заглушками
Это позволяет сделать неявные входные данные явными
Это также делает управление явными входными данными проще
Марат Ахин (СПбПУ) Input 2016 74 / 359
88. Использование заглушек
Данный подход позволяет:
имитировать возникновение редких ситуаций
внести детерминизм там, где его нет
Для того, чтобы можно было использовать S&S, тестируемый
модуль должен разрабатываться соответствующим образом
Марат Ахин (СПбПУ) Input 2016 75 / 359
89. Mock-объекты
Пример S&S – mock-объекты
Повторяют внешний интерфейс тестируемого объекта
Могут демонстрировать любое требуемое поведение
Марат Ахин (СПбПУ) Input 2016 76 / 359
91. Mockito
Сервис аутентификации и авторизации
Вход пользователя с корректными логином/паролем должен
приводить к переходу его учетной записи в активное состояние
Марат Ахин (СПбПУ) Input 2016 78 / 359
93. Mockito
Сервис аутентификации и авторизации
Три последовательные попытки входа пользователя с
некорректным паролем должны приводить к блокированию его
учетной записи
Марат Ахин (СПбПУ) Input 2016 80 / 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
101. Заглушки нужны?
Чем дольше итерация, тем сложнее и дороже исправление ошибок
Чем быстрее будут написаны тесты для разрабатываемого
компонента, тем проще найти ошибки
После разработки компонента пишем для него тест
Отсутствующие части системы заменяем заглушками
...
PROFIT!
Марат Ахин (СПбПУ) Input 2016 88 / 359
103. Test-driven development
Пишем тест для компонента перед его разработкой
Заменяем сам компонент заглушкой
...
PROFIT???
Разве это будет работать?
Марат Ахин (СПбПУ) Input 2016 90 / 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
114. Содержание
1 Прелюдия
2 Тестирование за 45 минут
3 Тестирование в процессе разработки ПО
4 Проблема тестовых входных данных
5 Проблема неявных входных данных
6 Разработка через тестирование
7 Интеграционное тестирование
Проблема «Большого Взрыва»
Нисходящее интеграционное тестирование
Восходящее интеграционное тестирование
Марат Ахин (СПбПУ) Input 2016 101 / 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
125. Восходящее интеграционное тестирование
Недостатки
Отложенная проверка высокоуровневого поведения
Требуется разработка драйверов
При замене драйвера на модуль высокого уровня может
произойти «мини-Большой Взрыв»
Марат Ахин (СПбПУ) Input 2016 112 / 359
126. Проблемы тестирования
What’s up, Doc? (с)
Проблема тестовых входных данных
Проблема наблюдаемости
Проблема «останова»
Проблема тестового оракула
Марат Ахин (СПбПУ) Input 2016 113 / 359
127. Обеспечение порчи внутреннего состояния
Для того, чтобы обеспечить порчу внутреннего состояния
(corruption), необходимо:
обеспечить достижимость
передать такие тестовые входные данные, которые вызывают
нарушение целостности внутреннего состояния
См. проблему тестовых входных данных
Марат Ахин (СПбПУ) Input 2016 114 / 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
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
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
155. Журналирование
Журналирование (logging)
Запись хода выполнения программы в том или ином виде
В зависимости от необходимости журнал может быть более или
менее детализированным
По журналу выполнения при необходимости возможно
восстановить причину возникшей ошибки
Марат Ахин (СПбПУ) PP 2016 141 / 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
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
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
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
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
205. Покрытие потока данных
Покрытие всех использований
Для каждой интересующей нас переменной v должна быть
протестирована хотя бы одна Def-Use Chain от каждого
определения v до каждого использования v
Является ли All-Use более сильным критерием по сравнению с All-Def?
Марат Ахин (СПбПУ) TC 2016 188 / 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
237. Проблемы тестирования
What’s up, Doc? (с)
Проблема тестовых входных данных
Проблема наблюдаемости
Проблема «останова»
Проблема тестового оракула
Марат Ахин (СПбПУ) TO 2016 218 / 359
238. Содержание
1 Прелюдия
2 Тестирование за 45 минут
3 Тестирование в процессе разработки ПО
4 Проблема тестовых входных данных
5 Проблема неявных входных данных
6 Разработка через тестирование
7 Интеграционное тестирование
8 Проблема наблюдаемости
Марат Ахин (СПбПУ) TO 2016 219 / 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
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
252. Средние оракулы
Assertions
Тесты
Требуют определенных усилий со стороны разработчиков
В зависимости от степени усилий, будут более или менее точно
указывать на место возникновения ошибки
Марат Ахин (СПбПУ) TO 2016 233 / 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
264. Генерация assertions
Assertions проверяют корректность внутреннего состояния
Как автоматически сгенерировать assertions?
Machine learning
Марат Ахин (СПбПУ) TO 2016 244 / 359