3. 3
О чем поговорим
• Необходимость надежности ПО
• Тестирование и его недостатки
• Что такое верификация
• Формальное определение
• Инструменты Runtime Verification
• Практическое применение
5. 5
Важность проверки ПО
• Разработчики тратят от 50%
до 70% времени тестируя и
проверяя код
• Тем не менее, низкая
надежность – все еще
основная проблема ПО
• Недавнее исследование
показывает, что баги
отнимают от 60 миллиардов
долларов ежегодно
6. 6
Что у нас есть: тестирование
Тестирование – это проверка подмножества сценариев
использования продукта.
Тестирование может обнаружить ошибки, но не может
доказать их отсутствие.
Большинство программ могут принимать
неограниченное множество входных данных.
8. 8
Верификация во время выполнения
(Runtime Verification)
Runtime verification – техники верификации, которые
позволяют проверить, удовлетворяет ли выполнение (a
run) системы определенному условию корректности
(correctness property).
9. 9
Прогон и выполнение
Выполнение – возможно, бесконечная
последовательность состояний системы.
Прогон – конечный префикс выполнения (trace).
Монитор проверяет, удовлетворяет ли прогон
определенному условию корректности.
11. 11
Testing Runtime Verification
Удовлетворяет ли входным/выходным данным? Удовлетворяет ли система монитору?
Входные/выходные данные задаются вручную Монитор генерируется из условий корректности
Проблема: создание входных/выходных данных Проблема: генерация монитора
Проверяется текущее выполнение Проверяется текущее выполнение
Сравнение
12. 13
Кому нужен Runtime Verification?
• Когда цена ошибки высока (ракеты, самолеты,
процессоры, безопасность, репутация)
• Когда некая информация доступна только во время
выполнения
• Когда поведение приложения сильно зависит от
окружения
• Для доказательства корректности системы (ИИ?)
13. 14
Шаг 1. Написать спецификацию
Для этого есть языки: LTL (Linear Temporal Logic), SALT и др.
Это регулярные языки, но включающие еще и время:
14. 15
Шаг 1. Написать спецификацию
Открыто соединение, данные переданы, соединение закрыто.
15. 16
Шаг 1. Написать спецификацию
Открыто соединение, данные переданы, соединение закрыто,
или выполнена отмена в любое время.
16. 18
Шаг 2. Определить события (jUnitrv)
private static Event con_open = returned ( dataService , ”connect");
private static Event data = called ( dataService , ”transmit_data");
private static Event con_close = called ( dataService , "disconnect");
private static Event reset = called ( dataService , ”reset");
@Test
@Monitors ({”transmitData"})
public void test1 () {
// ...
}