Технологии тестирования ИСП РАН В. Кулямин
Определение тестирования IEEE 610: Оценка соответствия системы требованиям к ней на основе результатов наблюдения за ее работой в специально подготовленных ситуациях Система в ходе тестирования должна работать Нужно готовить специальные ситуации – тесты Оценивается соответствие – ищем ошибки Нужна общая оценка – ищем все ошибки
Как происходит тестирование Воздействуем на тестируемую систему Наблюдаем ее реакцию Проверяем, такая ли реакция должна быть Повторяем, пока не исчерпаются все существенно различные ситуации
«Обычное» тестирование 1. Придумываем ситуацию 2. Оформляем ее в виде сценария взаимодействия теста с системой 3. Понимаем, как должна система вести себя в его рамках 4. Дополняем сценарий проверкой правильности Получается тестовый вариант (test case) 5. Оцениваем достаточность имеющегося набора ситуаций: достаточно – конец, нет – goto 1
Пример uint gcd (uint a, uint b) { int t; if(b > a) { t = a; a = b; b = t; } while(b > 0) { t = b; b = a%b; a = t; } return a; } gcd ( 2, 1 ) == 1 ? gcd ( 3, 2 ) == 1 ? gcd ( 4, 2 ) == 2 ? gcd ( 175, 15 ) == 5 ?
Другой пример Ограниченная очередь размера 3 1.В начале – пуста 2.put(X) 3.Y = take() 4.assert (Y == X) ? 1.В начале – полна 2.put(X) 3.assert (exception)
Зачем нужны модели? Распознавание ошибки – ментальная модель правильной работы Math.abs( ) = Полнота набора ситуаций – ментальная модель всех важных ситуаций Управление построением тестов – ментальная модель устройства тестовых воздействий При тестировании на основе моделей модели выделяются явно и заранее
Тестирование на основе моделей Систематичность Строгость ( формальность) Абстрактность Автоматизация Быстрая подготовка тестов (часто до тестируемой системы) Сложность Повышенные требования к разработчикам тестов Образование Абстрактное мышление Умение программировать Трудность интеграции в обычную разработку
Тестируемая система Тестовые оракулы Тестовый оракул Модель Тестовые воздействия ?
Оценка полноты тестирования Тестируемая система Метрика полноты Модель Тестовые воздействия ? 73%
Управление построением тестов Тестируемая система Метрика полноты Модель Тестовые воздействия Тестовые воздействия генерируются целенаправленно – для увеличения полноты тестирования
Пример использования моделей uint gcd (uint a, uint b) gcd ( 2, 1 ) == gcd ( 3, 2 ) == gcd ( 4, 2 ) == gcd ( 175, 15 ) == a%gcd(a, b) == 0 ? b%gcd(a, b) == 0 ? for(int i=gcd(a,b)+1; iab>a b>0b>0
Другой пример Ограниченная очередь размера 3 [X] [Y] [X, X] [X, Y] [Y, X] [Y, Y] [X, X, X] [X, X, Y] [X, Y, X] [X, Y, Y] [Y, X, X] [Y, X, Y] [Y, Y, X] [Y, Y, Y]
Что надо сделать? При выполнении тестов Обеспечение полноты Построение набора воздействий Построение каждого воздействия Применение набора воздействий Получение результатов Проверка корректности результатов Диагностика ошибок Оценка полноты тестирования При сопровождении тестов Удобство разработки Удобство использования Удобство сопровождения Переиспользование x.a = -1 x.b = x.c = x Тестируемая система f(x) g(x) f(y) h(x,y)f(x) ?
UniTESK – модели Описание требований Структура данных – простые структуры, грамматики Поведение – контрактные спецификации Параллелизм – аксиома простого параллелизма Критерии полноты Варианты в рамках грамматик Варианты в рамках контракта Построение тестов Генераторы данных по грамматикам Построение конечных автоматов, обеспечивающих полноту покрытия вариантов контракта, их автоматический обход
Грамматики BNF Генерация корректных данных – покрытие всех альтернатив, итераций на заданную глубину Генерация некорректных данных – покрытие всех неправильных в данном контексте терминалов Контекстные условия Нацеленная генерация – ссылочная целостность, единственность в данном контексте Фильтрация Описание абстрактного синтаксиса
Абстрактный синтаксис и тесты Описание абстрактного синтаксиса Набор базовых блоков модели Тестовые программы Итератор комбинаций Привязка базовых блоков if(…)…else … for(…;…;…)
Проверка корректности Тестовая программа == ? Тестируемый компилятор Эталон
Пример: простые выражения Test Expression BinaryExpr op : {+,-,*,/} Variable id : string Constant value : int stmts 1..* left 1 right 1 Statement var 1 expr 1 x i = Expr xixi 17Expr 1 + Expr 2
Генерация данных по описанию абстрактного синтаксиса Демонстрация
Контрактные спецификации Тестируемая система разбивается на компоненты Каждый компонент имеет внутренние данные и набор операций Поведение операции определяется ее контрактом Предусловие описывает область определения операции sqrt(x): pre x 0 Постусловие описывает ограничения на правильные результаты операции sqrt(x): post result*result == x Инварианты компонента описывают условия целостности его данных Triangle: double x,y,z : x+y>z & x+z>y & y+z>x
Пример specification class ClientManager { specification Client addClient ( String name ) { post { if ( name == null || clients.containsKey(name) ) { branch "Client cannot be created"; return addClient == null && clients.equals( pre clients.clone() ); } else { branch "Client can be created"; HashMap oldClients = (HashMap)clients.clone(); oldClients.remove(name); return addClient != null && addClient.name.equals(name) && addClient.parent == null && addClient.children.isEmpty() && clients.get(name) == addClient && oldClients.equals( pre clients.clone() ); }
Метрики полноты тестирования post { if ( f(a, b) || g(a) ) … else if( h(a, c) && !g(b) ) … else … } !f(a, b) && !g(a) && !h(a, c) || !f(a, b) && !g(a) && g(b)
Построение конечного автомата состояния параметры область определения операции цели тестирования
Неявное описание автомата
Построение одного воздействия текущее состояние параметры состояния
Картина в целом Тестируемая система Модель поведения Описание автомата Метрика полноты Генерация тестовой последовательности на лету Проверка одного воздействия
Тестирование компонентов на основе контрактов Демонстрация
Описание асинхронных систем Интерфейс компонента состоит из операций и событий События тоже описываются при помощи контракта Постусловие события определяет корректность его наступления и изменения состояния компонента Sent: post pre mails.size() != 0 && mails.size() == pre mails.size()-1
Аксиома простого параллелизма ~
Тестирование асинхронности s 11 Тестируемая система s 21 s 12 s 31 Используется мультипоследовательность воздействий Воздействия и реакции образуют частично упорядоченное множество r 12 r 22 r 11 r 21 Время Время
Проверка корректности Аксиома простого параллелизма
Применение UniTESK Разработка тестового набора для ядра ОС телефонной станции Nortel Networks Реализации IPv6 Microsoft Research Мобильный IPv6 (в Windows CE 4.1) Октет2002 Оптимизаторы компиляторов Intel Стандарт AVS-IPMP 2004 Тестовый набор для IPsec 2004-… Тестовый набор для Linux Standard Base … Компоненты биллинговой системы и EAI 2005-… Тестовый набор для ОС ос2000 (НИИСИ) Пилотные проекты ГосНИИАС2003 Компоненты TinyOS2003 Компоненты CRM-системы (Luxoft)2004 Оптимизатор трансляции граф. моделей2005
Область применимости Тестируемые интерфейсы должны быть четко определены Сложность интерфейса Наблюдаемая сложность состояния Компиляторы Компонентные системы Протоколы Информационные системы Web-приложения
Литература 1. И. Б. Бурдонов, А. С. Косачев, В. В. Кулямин. Использование конечных автоматов для тестирования программ. Программирование, 26(2):61-73, I. Bourdonov, A. Kossatchev, V. Kuliamin, A. Petrenko. UniTesK Test Suite Architecture. Proc. of FME 2002, LNCS 2391, pp , Springer-Verlag, В.В.Кулямин, А.К.Петренко, А.С.Косачев, И.Б.Бурдонов. Подход UniTesK к разработке тестов. Программирование, 29(6):25-43, A. Kossatchev, A. Petrenko, S. Zelenov, S. Zelenova. Using Model-Based Approach for Automated Testing of Optimizing Compilers. Proc. Intl. Workshop on Program Undestanding, Gorno-Altaisk, А. В. Баранцев и др. Подход UniTesK к разработке тестов: достижения и перспективы. Труды ИСП РАН, т. 5, с , С. Зеленов, С. Зеленова, А. Косачев, А. Петренко. Генерация тестов для компиляторов и других процессоров формальных текстов. Программирование, 29(2): , V. Kuliamin, A. Petrenko. Applying Model Based Testing in Different Contexts. Proc. of seminar on Perspectives of Model Based Testing, Dagstuhl, Germany, September V. Kuliamin, N. Pakoulin, A. Petrenko. Practical Approach to Specification and Conformance Testing of Distributed Network Applications. Proc. of 2-nd International Service Availability Symposium, LNCS 3694, pp , Springer-Verlag, 2005
Контакты Группа RedVerst Сайт: Сайт UniTESK: Телефон:(8-495) Факс:(8-095) Докладчик Сайт:
Спасибо за внимание!