Санкт-Петербургский государственный политехнический университет
Институт информационных технологий и управления
Кафедра компьютерных систем и программных технологий

АВТОМАТИЗИРОВАННЫЙ СИНТЕЗ ТЕСТОВ
ДЛЯ JAVA-ПРОГРАММ НА ОСНОВЕ
АНАЛИЗА ПРОГРАММ И УЧЕТА КОНТРАКТОВ
Владимир ИЦЫКСОН, Алефтина АНДРИАНОВА
Кафедра компьютерных систем и программных технологий,
СПбГПУ

Кострома, 10-12 октября 2013
2

Введение

Автоматизированный синтез тестов для Java-программ

12.10.2013
Тенденции в области разработки ПО
3






рост сложности программных систем
сокращение времени разработки
смещение технологических решений в программную
область
проникновение программно-управляемых систем, в
критически важные области человеческой жизни:
медицину, армию, авиацию, космос, финансовую сферу

качество ПО становится ниже
важность ПО становится выше
Автоматизированный синтез тестов для Java-программ

12.10.2013
Методы повышения качества ПО
4


Статические
 дедуктивная

верификация
 проверка на модели (model checking)
 статический анализ


Динамические
 тестирование
 динамический анализ
 профилирование

Автоматизированный синтез тестов для Java-программ

12.10.2013
Методы повышения качества ПО
5


Статические методы
+ анализ свойств всей программы (всех путей выполнения)
+ гарантирование определенных свойств программы
- низкая производительность
- сложность реализации



Динамические методы
+ простота реализации
+ высокая точность (отсутствие ложных обнаружений)
- низкая полнота (отсутствие гарантий)

использование гибридных подходов, сочетающих
достоинства статических и динамических методов
Автоматизированный синтез тестов для Java-программ

12.10.2013
Гибридный подход
6


Статические методы
анализ программы
 анализ моделей и спецификаций
 синтез тестов




Динамические методы
запуск тестов
 анализ результатов


Автоматизированный синтез тестов для Java-программ

12.10.2013
Контрактное программирование (DbC)
7


предложено Б. Мейером в 1985 г.



позволяет описать частичную спецификацию
(контракт) метода/функции, задающую


предусловия – требования к входным параметрам
метода



предусловия – свойства, гарантированно
выполняющиеся после завершения метода



инварианты – свойства класса, сохраняющиеся после
выполнения методов
Автоматизированный синтез тестов для Java-программ

12.10.2013
Постановка задачи
8


Разработка технологии автоматического синтеза
модульных тестов, обеспечивающей покрытие
всех¹ путей выполнения программы с помощью
статического анализа
структуры программы
 спецификаций, заданных в форме контрактов




Разработка прототипа системы автоматического
синтеза модульных тестов для программ на языке
Java

Автоматизированный синтез тестов для Java-программ

12.10.2013
9

Предлагаемый подход

Автоматизированный синтез тестов для Java-программ

12.10.2013
Предлагаемый подход
10


Совмещение
классических подходов:


тестирование «черного
ящика»



тестирование «белого
ящика»

Автоматизированный синтез тестов для Java-программ

12.10.2013
Общая структура подхода
11

Автоматизированный синтез тестов для Java-программ

12.10.2013
Предлагаемый подход. Этапы
12











формирование модели программы (метода)
формирование списка путей выполнения метода
преобразование путей в цепочки утверждений
анализ контрактов и дополнение утверждений
составляющими контрактов: предусловиями метода
и инвариантами класса
разрешение системы утверждений относительно
аргументов метода
формирование экземпляра теста на основе решения
системы утверждений
формирование тестового оракула на основе
постусловий метода и инвариантов класса
Автоматизированный синтез тестов для Java-программ

12.10.2013
Построение модели программы
13

Построение
поведенческой
модели

Построение
структурной
модели

Автоматизированный синтез тестов для Java-программ

12.10.2013
Извлечение путей исполнения
14


Анализ графа потока управления:


Анализ узлов, влияющих на поток
управления:








ветвления (if)
конструкции мультиветвления (switch)
циклы (do, while, do-while)

Коллекционирование условий ветвления
Коллекционирование операторов пути

Результат:


список операторов и условий, которые
должны выполниться, чтобы данный путь
был пройден
Автоматизированный синтез тестов для Java-программ

12.10.2013
Формирование системы утверждений. 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




преобразование путей в форму однократного
статического присваивания (SSA)
преобразование операторов к трехоперандной
форме
введение временных переменных
 введение дополнительных узлов в путь




преобразование условий в соответствующие
утверждения

Автоматизированный синтез тестов для Java-программ

12.10.2013
Формирование системы утверждений
17




Для каждого пути имеем систему
логических утверждений
Для форсирования прохождения тестом
пути необходимо решить обратную
задачу:




при каких значениях аргументов метода
система утверждений разрешима?

Если такие значения аргументов
найдены, то их использование в тесте
форсирует выполнение искомого пути
Автоматизированный синтез тестов для Java-программ

12.10.2013
Решение системы утверждений
18

Построенная система утверждений выражена в терминах
логики первого порядка и относится к классу Satisfiability Modulo
Theories (SMT)
 В общем случае разрешение SMT-формулы – NP-полная
задача
 Существуют эффективные SMT-решатели (SMT-солверы):





Z3, CVC, MathSAT, OpenSMT, MiniSMT и т.п.

Входные данные для SMT-решателей представляются в
формате SMT-LIB

Автоматизированный синтез тестов для Java-программ

12.10.2013
Решение системы утверждений
19






Преобразование системы утверждений в формат
SMT-LIB (конкретнее – SMT-LIB 2.0)
Запуск SMT-решателя для решения системы
утверждений
Интерпретация результатов работы SMTрешателя




получение набора значений аргументов метода

Генерация скелета теста

Автоматизированный синтез тестов для Java-программ

12.10.2013
Учет контрактов
20




Построенные тесты обеспечивают прохождение
программой соответствующих путей исполнения
Значения аргументов расположены в области
допустимых значений произвольно (особенность
SMT-решателей)




Как следствие – сгенерированные значения могут
нарушать контракты методов (предусловия) или
инварианты классов

Решение:


Расширяем систему утверждений предусловиями
методов и инвариантами классов
Автоматизированный синтез тестов для Java-программ

12.10.2013
Учет контрактов
21




Постусловия методов содержат информацию о проверке
корректности выполнения методом своих функций
Постусловия и инварианты классов могут быть учтены
путем преобразования их в тестовый оракул


тривиальная задача, так как контракты представляются в форме
утверждений логики первого порядка
Предусловия

Сокращение ОДЗ

Инварианты
Постусловия

Генерация тестовых оракулов

Автоматизированный синтез тестов для Java-программ

12.10.2013
Резюме
22







Для каждого класса эквивалентности
сгенерирован тест
Заготовка тестового оракула сформирована на
основе постусловий и инвариантов
Обеспечено покрытие всех путей (*)
Что делать, если требуется сгенерировать
несколько тестов для одного класса
эквивалентности?

Автоматизированный синтез тестов для Java-программ

12.10.2013
Формирование множественных тестов
23








ОДЗ аргументов делятся на интервалы в
соответствии с какой-либо эвристикой
В систему утверждений добавляются условия
нахождения аргументов в рассчитанных
интервалах
SMT-решатель запускается повторно с новыми
системами утверждений
Могут использоваться различные эвристики
 Реализовано

равномерное заполнение тестами

ОДЗ
Автоматизированный синтез тестов для Java-программ

12.10.2013
24

Реализация

Автоматизированный синтез тестов для Java-программ

12.10.2013
Выбранные технологии
25






Целевой язык программирования – Java
Система задания контрактов – CoFoJa
SMT-решатель – Z3 от Microsoft Research
Технология модульного тестирования – JUnit

Автоматизированный синтез тестов для Java-программ

12.10.2013
26

Архитектура инструментальной
системы генерации тестов

Автоматизированный синтез тестов для Java-программ

12.10.2013
Особенности реализации
27










Язык реализации – Java
Построение структурной модели – Java Compiler Tree
API
Анализ контрактов в формате CoFoJa с помощью
процессоров аннотаций
Синтез системы утверждений в формате SMT-LIB 2.0
Запуск внешнего SMT-решателя Z3 через внешний
процесс
Синтез тестов в формате JUnit

Автоматизированный синтез тестов для Java-программ

12.10.2013
28

Экспериментальные исследования

Автоматизированный синтез тестов для Java-программ

12.10.2013
Пример №1. Оракулы и множественные
тесты
29

Автоматизированный синтез тестов для Java-программ

12.10.2013
Пример №2. Нелинейные функции
30

Автоматизированный синтез тестов для Java-программ

12.10.2013
Пример №3. Логические операции и
несколько аргументов метода
31

Автоматизированный синтез тестов для Java-программ

12.10.2013
Пример №4. Циклы
32

Автоматизированный синтез тестов для Java-программ

12.10.2013
Ограничения текущей реализации
33

Ограничения на мощность контрактов
 Ограниченный набор поддерживаемых
типов данных: int, boolean, float, double
 Неполная поддержка всех конструкций
языка Java
 Простая обработка циклов
 Отсутствие поддержки рекурсии
 …


Автоматизированный синтез тестов для Java-программ

12.10.2013
34

Состояние исследований в мире

Автоматизированный синтез тестов для Java-программ

12.10.2013
Состояние исследований в мире
35


Microsoft Research Pex
Целевые языки C и C#
 Извлечение путей исполнения
 Использование Z3-решателя для синтеза тестов




AutoTest Framework
Целевой язык Eiffel
 Случайная генерация тестов и генерация на основе
отказов
 Использование контрактов для


для формирования оракулов
 Для ограничения ОДЗ




… (Symstra, KUnit, Kiasan, UnitMeister,…)
Автоматизированный синтез тестов для Java-программ

12.10.2013
36

Заключение

Автоматизированный синтез тестов для Java-программ

12.10.2013
Заключение
37










Разработана технология синтеза модульных тестов для
программ на языке Java, обеспечивающая покрытие путей
Разработанные методы с помощью применения SMT-солвера
генерируют параметры модульных тестов, форсирующие
реализацию заданных путей исполнения
Учет контрактов методов позволяет с одной стороны с
помощью постусловий частично автоматизировать синтез
тестовых оракулов, а с другой – с помощью предусловий и
инвариантов ограничивать множество генерируемых значений
аргументов тестируемой функции
Реализован программный прототип и проведено его
экспериментальное исследование на наборе тестовых
примеров
Анализ полученных результатов тестирования показал полную
работоспособность предложенных методов с учетом заданных
требований и ограничений
Автоматизированный синтез тестов для Java-программ

12.10.2013
Направления дальнейших исследований
38






Совершенствование анализатора (прототипа) с
целью обеспечения анализа более широкого
класса Java-программ
Разработка новых алгоритмов генерации
множественных тестов, наиболее эффективно
распределяющих значения переменных по
области определения
Расширение на другие языки программирования

Автоматизированный синтез тестов для Java-программ

12.10.2013
СПАСИБО ЗА ВНИМАНИЕ!

TMPA-2013 Itsykson: Java Program Analysis

  • 1.
    Санкт-Петербургский государственный политехническийуниверситет Институт информационных технологий и управления Кафедра компьютерных систем и программных технологий АВТОМАТИЗИРОВАННЫЙ СИНТЕЗ ТЕСТОВ ДЛЯ JAVA-ПРОГРАММ НА ОСНОВЕ АНАЛИЗА ПРОГРАММ И УЧЕТА КОНТРАКТОВ Владимир ИЦЫКСОН, Алефтина АНДРИАНОВА Кафедра компьютерных систем и программных технологий, СПбГПУ Кострома, 10-12 октября 2013
  • 2.
  • 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
  • 9.
  • 10.
    Предлагаемый подход 10  Совмещение классических подходов:  тестирование«черного ящика»  тестирование «белого ящика» Автоматизированный синтез тестов для Java-программ 12.10.2013
  • 11.
    Общая структура подхода 11 Автоматизированныйсинтез тестов для Java-программ 12.10.2013
  • 12.
    Предлагаемый подход. Этапы 12        формированиемодели программы (метода) формирование списка путей выполнения метода преобразование путей в цепочки утверждений анализ контрактов и дополнение утверждений составляющими контрактов: предусловиями метода и инвариантами класса разрешение системы утверждений относительно аргументов метода формирование экземпляра теста на основе решения системы утверждений формирование тестового оракула на основе постусловий метода и инвариантов класса Автоматизированный синтез тестов для Java-программ 12.10.2013
  • 13.
  • 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
  • 24.
  • 25.
    Выбранные технологии 25     Целевой языкпрограммирования – Java Система задания контрактов – CoFoJa SMT-решатель – Z3 от Microsoft Research Технология модульного тестирования – JUnit Автоматизированный синтез тестов для Java-программ 12.10.2013
  • 26.
    26 Архитектура инструментальной системы генерациитестов Автоматизированный синтез тестов для Java-программ 12.10.2013
  • 27.
    Особенности реализации 27       Язык реализации– Java Построение структурной модели – Java Compiler Tree API Анализ контрактов в формате CoFoJa с помощью процессоров аннотаций Синтез системы утверждений в формате SMT-LIB 2.0 Запуск внешнего SMT-решателя Z3 через внешний процесс Синтез тестов в формате JUnit Автоматизированный синтез тестов для Java-программ 12.10.2013
  • 28.
  • 29.
    Пример №1. Оракулыи множественные тесты 29 Автоматизированный синтез тестов для Java-программ 12.10.2013
  • 30.
    Пример №2. Нелинейныефункции 30 Автоматизированный синтез тестов для Java-программ 12.10.2013
  • 31.
    Пример №3. Логическиеоперации и несколько аргументов метода 31 Автоматизированный синтез тестов для Java-программ 12.10.2013
  • 32.
    Пример №4. Циклы 32 Автоматизированныйсинтез тестов для Java-программ 12.10.2013
  • 33.
    Ограничения текущей реализации 33 Ограниченияна мощность контрактов  Ограниченный набор поддерживаемых типов данных: int, boolean, float, double  Неполная поддержка всех конструкций языка Java  Простая обработка циклов  Отсутствие поддержки рекурсии  …  Автоматизированный синтез тестов для Java-программ 12.10.2013
  • 34.
    34 Состояние исследований вмире Автоматизированный синтез тестов для Java-программ 12.10.2013
  • 35.
    Состояние исследований вмире 35  Microsoft Research Pex Целевые языки C и C#  Извлечение путей исполнения  Использование Z3-решателя для синтеза тестов   AutoTest Framework Целевой язык Eiffel  Случайная генерация тестов и генерация на основе отказов  Использование контрактов для  для формирования оракулов  Для ограничения ОДЗ   … (Symstra, KUnit, Kiasan, UnitMeister,…) Автоматизированный синтез тестов для Java-программ 12.10.2013
  • 36.
  • 37.
    Заключение 37      Разработана технология синтезамодульных тестов для программ на языке Java, обеспечивающая покрытие путей Разработанные методы с помощью применения SMT-солвера генерируют параметры модульных тестов, форсирующие реализацию заданных путей исполнения Учет контрактов методов позволяет с одной стороны с помощью постусловий частично автоматизировать синтез тестовых оракулов, а с другой – с помощью предусловий и инвариантов ограничивать множество генерируемых значений аргументов тестируемой функции Реализован программный прототип и проведено его экспериментальное исследование на наборе тестовых примеров Анализ полученных результатов тестирования показал полную работоспособность предложенных методов с учетом заданных требований и ограничений Автоматизированный синтез тестов для Java-программ 12.10.2013
  • 38.
    Направления дальнейших исследований 38    Совершенствованиеанализатора (прототипа) с целью обеспечения анализа более широкого класса Java-программ Разработка новых алгоритмов генерации множественных тестов, наиболее эффективно распределяющих значения переменных по области определения Расширение на другие языки программирования Автоматизированный синтез тестов для Java-программ 12.10.2013
  • 39.