Tools & Methods of Program Analysis (TMPA-2013)
Andrianova, А., Itsykson, V., St. Petersburg State Polytechnic University
Automated Test Synthesis for Java Programs Based on Program Analysis and Contract Inventory
BDD. The Outer Limits. Iosif Itkin at Youcon (in Russian)
TMPA-2013 Itsykson: Java Program Analysis
1. Санкт-Петербургский государственный политехнический университет
Институт информационных технологий и управления
Кафедра компьютерных систем и программных технологий
АВТОМАТИЗИРОВАННЫЙ СИНТЕЗ ТЕСТОВ
ДЛЯ JAVA-ПРОГРАММ НА ОСНОВЕ
АНАЛИЗА ПРОГРАММ И УЧЕТА КОНТРАКТОВ
Владимир ИЦЫКСОН, Алефтина АНДРИАНОВА
Кафедра компьютерных систем и программных технологий,
СПбГПУ
Кострома, 10-12 октября 2013
3. Тенденции в области разработки ПО
3
рост сложности программных систем
сокращение времени разработки
смещение технологических решений в программную
область
проникновение программно-управляемых систем, в
критически важные области человеческой жизни:
медицину, армию, авиацию, космос, финансовую сферу
качество ПО становится ниже
важность ПО становится выше
Автоматизированный синтез тестов для Java-программ
12.10.2013
4. Методы повышения качества ПО
4
Статические
дедуктивная
верификация
проверка на модели (model checking)
статический анализ
Динамические
тестирование
динамический анализ
профилирование
Автоматизированный синтез тестов для Java-программ
12.10.2013
5. Методы повышения качества ПО
5
Статические методы
+ анализ свойств всей программы (всех путей выполнения)
+ гарантирование определенных свойств программы
- низкая производительность
- сложность реализации
Динамические методы
+ простота реализации
+ высокая точность (отсутствие ложных обнаружений)
- низкая полнота (отсутствие гарантий)
использование гибридных подходов, сочетающих
достоинства статических и динамических методов
Автоматизированный синтез тестов для Java-программ
12.10.2013
6. Гибридный подход
6
Статические методы
анализ программы
анализ моделей и спецификаций
синтез тестов
Динамические методы
запуск тестов
анализ результатов
Автоматизированный синтез тестов для Java-программ
12.10.2013
7. Контрактное программирование (DbC)
7
предложено Б. Мейером в 1985 г.
позволяет описать частичную спецификацию
(контракт) метода/функции, задающую
предусловия – требования к входным параметрам
метода
предусловия – свойства, гарантированно
выполняющиеся после завершения метода
инварианты – свойства класса, сохраняющиеся после
выполнения методов
Автоматизированный синтез тестов для Java-программ
12.10.2013
8. Постановка задачи
8
Разработка технологии автоматического синтеза
модульных тестов, обеспечивающей покрытие
всех¹ путей выполнения программы с помощью
статического анализа
структуры программы
спецификаций, заданных в форме контрактов
Разработка прототипа системы автоматического
синтеза модульных тестов для программ на языке
Java
Автоматизированный синтез тестов для Java-программ
12.10.2013
12. Предлагаемый подход. Этапы
12
формирование модели программы (метода)
формирование списка путей выполнения метода
преобразование путей в цепочки утверждений
анализ контрактов и дополнение утверждений
составляющими контрактов: предусловиями метода
и инвариантами класса
разрешение системы утверждений относительно
аргументов метода
формирование экземпляра теста на основе решения
системы утверждений
формирование тестового оракула на основе
постусловий метода и инвариантов класса
Автоматизированный синтез тестов для Java-программ
12.10.2013
14. Извлечение путей исполнения
14
Анализ графа потока управления:
Анализ узлов, влияющих на поток
управления:
ветвления (if)
конструкции мультиветвления (switch)
циклы (do, while, do-while)
Коллекционирование условий ветвления
Коллекционирование операторов пути
Результат:
список операторов и условий, которые
должны выполниться, чтобы данный путь
был пройден
Автоматизированный синтез тестов для Java-программ
12.10.2013
15. Формирование системы утверждений. SSA
15
x = 10;
y = 20;
if (z > 5) {
x = x + y;
}
Решение –
преобразование
пути в вид
однократного
статического
присваивания (SSA)
1:
2:
3:
4:
x=10
y=20
z>5
x=x+y
1:
2:
3:
4:
x1=10
y1=20
z1>5
x2=x1+y1
Автоматизированный синтез тестов для Java-программ
12.10.2013
16. Формирование системы утверждений
16
преобразование путей в форму однократного
статического присваивания (SSA)
преобразование операторов к трехоперандной
форме
введение временных переменных
введение дополнительных узлов в путь
преобразование условий в соответствующие
утверждения
Автоматизированный синтез тестов для Java-программ
12.10.2013
17. Формирование системы утверждений
17
Для каждого пути имеем систему
логических утверждений
Для форсирования прохождения тестом
пути необходимо решить обратную
задачу:
при каких значениях аргументов метода
система утверждений разрешима?
Если такие значения аргументов
найдены, то их использование в тесте
форсирует выполнение искомого пути
Автоматизированный синтез тестов для Java-программ
12.10.2013
18. Решение системы утверждений
18
Построенная система утверждений выражена в терминах
логики первого порядка и относится к классу Satisfiability Modulo
Theories (SMT)
В общем случае разрешение SMT-формулы – NP-полная
задача
Существуют эффективные SMT-решатели (SMT-солверы):
Z3, CVC, MathSAT, OpenSMT, MiniSMT и т.п.
Входные данные для SMT-решателей представляются в
формате SMT-LIB
Автоматизированный синтез тестов для Java-программ
12.10.2013
19. Решение системы утверждений
19
Преобразование системы утверждений в формат
SMT-LIB (конкретнее – SMT-LIB 2.0)
Запуск SMT-решателя для решения системы
утверждений
Интерпретация результатов работы SMTрешателя
получение набора значений аргументов метода
Генерация скелета теста
Автоматизированный синтез тестов для Java-программ
12.10.2013
20. Учет контрактов
20
Построенные тесты обеспечивают прохождение
программой соответствующих путей исполнения
Значения аргументов расположены в области
допустимых значений произвольно (особенность
SMT-решателей)
Как следствие – сгенерированные значения могут
нарушать контракты методов (предусловия) или
инварианты классов
Решение:
Расширяем систему утверждений предусловиями
методов и инвариантами классов
Автоматизированный синтез тестов для Java-программ
12.10.2013
21. Учет контрактов
21
Постусловия методов содержат информацию о проверке
корректности выполнения методом своих функций
Постусловия и инварианты классов могут быть учтены
путем преобразования их в тестовый оракул
тривиальная задача, так как контракты представляются в форме
утверждений логики первого порядка
Предусловия
Сокращение ОДЗ
Инварианты
Постусловия
Генерация тестовых оракулов
Автоматизированный синтез тестов для Java-программ
12.10.2013
22. Резюме
22
Для каждого класса эквивалентности
сгенерирован тест
Заготовка тестового оракула сформирована на
основе постусловий и инвариантов
Обеспечено покрытие всех путей (*)
Что делать, если требуется сгенерировать
несколько тестов для одного класса
эквивалентности?
Автоматизированный синтез тестов для Java-программ
12.10.2013
23. Формирование множественных тестов
23
ОДЗ аргументов делятся на интервалы в
соответствии с какой-либо эвристикой
В систему утверждений добавляются условия
нахождения аргументов в рассчитанных
интервалах
SMT-решатель запускается повторно с новыми
системами утверждений
Могут использоваться различные эвристики
Реализовано
равномерное заполнение тестами
ОДЗ
Автоматизированный синтез тестов для Java-программ
12.10.2013
25. Выбранные технологии
25
Целевой язык программирования – Java
Система задания контрактов – CoFoJa
SMT-решатель – Z3 от Microsoft Research
Технология модульного тестирования – JUnit
Автоматизированный синтез тестов для Java-программ
12.10.2013
27. Особенности реализации
27
Язык реализации – Java
Построение структурной модели – Java Compiler Tree
API
Анализ контрактов в формате CoFoJa с помощью
процессоров аннотаций
Синтез системы утверждений в формате SMT-LIB 2.0
Запуск внешнего SMT-решателя Z3 через внешний
процесс
Синтез тестов в формате JUnit
Автоматизированный синтез тестов для Java-программ
12.10.2013
33. Ограничения текущей реализации
33
Ограничения на мощность контрактов
Ограниченный набор поддерживаемых
типов данных: int, boolean, float, double
Неполная поддержка всех конструкций
языка Java
Простая обработка циклов
Отсутствие поддержки рекурсии
…
Автоматизированный синтез тестов для Java-программ
12.10.2013
35. Состояние исследований в мире
35
Microsoft Research Pex
Целевые языки C и C#
Извлечение путей исполнения
Использование Z3-решателя для синтеза тестов
AutoTest Framework
Целевой язык Eiffel
Случайная генерация тестов и генерация на основе
отказов
Использование контрактов для
для формирования оракулов
Для ограничения ОДЗ
… (Symstra, KUnit, Kiasan, UnitMeister,…)
Автоматизированный синтез тестов для Java-программ
12.10.2013
37. Заключение
37
Разработана технология синтеза модульных тестов для
программ на языке Java, обеспечивающая покрытие путей
Разработанные методы с помощью применения SMT-солвера
генерируют параметры модульных тестов, форсирующие
реализацию заданных путей исполнения
Учет контрактов методов позволяет с одной стороны с
помощью постусловий частично автоматизировать синтез
тестовых оракулов, а с другой – с помощью предусловий и
инвариантов ограничивать множество генерируемых значений
аргументов тестируемой функции
Реализован программный прототип и проведено его
экспериментальное исследование на наборе тестовых
примеров
Анализ полученных результатов тестирования показал полную
работоспособность предложенных методов с учетом заданных
требований и ограничений
Автоматизированный синтез тестов для Java-программ
12.10.2013
38. Направления дальнейших исследований
38
Совершенствование анализатора (прототипа) с
целью обеспечения анализа более широкого
класса Java-программ
Разработка новых алгоритмов генерации
множественных тестов, наиболее эффективно
распределяющих значения переменных по
области определения
Расширение на другие языки программирования
Автоматизированный синтез тестов для Java-программ
12.10.2013