Автоматическая генерация базовых тестов для программных интерфейсов библиотек на основе заголовочных файлов Владимир Рубанов, Андрей Пономаренко Институт системного программирования РАН Институт системного программирования РАН Тестируем библиотеки и модули Институт системного программирования РАН 2 / 15 Какие тесты нужны? 1. Глубокие тесты – вызывают каждую целевую функцию и их цепочки сотни раз с различными параметрами и в различных внутренних состояниях целевой системы. Тщательно контролируется корректность результатов работы. 2. Средние тесты – вызывают целевые функции в нескольких основных сценариях использования. Контролируются основные результаты работы. 3. Базовые тесты – каждая функция вызывается хотя бы один раз с некоторым корректным набором параметров. Контролируется отсутствие грубых ошибок. Институт системного программирования РАН 3 / 15 Технологии автоматизации: какой ценой? 1. Глубокие тесты – тяжеловесные технологии, например model based на основе конечных автоматов (UniTESK) Высокая удельная стоимость разработки тестов в расчете на одну целевую функцию. 2. Средние тесты – классические unit тесты (CUnit, TET, T2C) Средняя удельная стоимость разработки тестов в расчете на одну целевую функцию. 3. Базовые тесты – ? Целесообразно при низкой стоимости создания тестов. Институт системного программирования РАН 4 / 15 Базовая идея генерации базовых тестов Институт системного программирования РАН 5 / 15 Базовая идея+ Институт системного программирования РАН 6 / 15 Построение цепочки инициализации F () F1 (S1) 10 G1 (I1) “test str” Target (P1, P2, P3) S1 = F () P1 = F1 (S1) I1 = 10 P2 = G1 (I1) P3 = “test string” Res = Target (P1, P2, P3) CHECK (Res != error) Дерево инициализации вызова Базовый тест Институт системного программирования РАН 7 / 15 Дополнительная информация (опциональная) • как правильно инициализировать библиотеку • как получить корректное значение определенного типа данных • каким должно быть корректное значение определенного параметра функции • какие проверки можно сделать для возвращаемых значений определенного типа Институт системного программирования РАН 8 / 15 Специальные конструкции в описании дополнительной информации • $(type) – создание объекта данного типа void create_QProxyModel(QProxyModel* Obj) { Obj->setSourceModel($(QItemModel*)); } • $[function] – вызов данной функции с корректными параметрами xmlListPtr create_filled_list() { xmlListPtr l = $[xmlListCreate]; int num = 100; xmlListPushBack(l,&num); return l; } Институт системного программирования РАН 9 / 15 Характеристика технологии • Даже без задания дополнительной информации получаются вполне работоспособные тесты, которые могут обнаруживать ошибки. • Введение дополнительной информации позволяет значительно повысить качество тестирования, при этом такая информация автоматически повторно используется в сотнях и тысячах тестов. • Получаемые тесты могут служить готовой базой для разработки более глубоких тестов. Институт системного программирования РАН 10 / 15 Примеры использования (1) • Официальные тестовые наборы Linux Foundation: • libxml2 • Qt3 • Qt4 • ALSA • Официальный тестовый набор rpm5 • Десятки upstream применений в качестве дополнительного шага контроля качества. Институт системного программирования РАН 11 / 15 Примеры использования (2) Институт системного программирования РАН 12 / 15 Примеры использования (3) Институт системного программирования РАН 13 / 15 Распространение API Sanity Autotest 1. Лицензия GPL 2. Домашняя страница проекта: • http://ispras.linux-foundation.org/index.php/ API_Sanity_Autotest 3. Принят в репозитории: • • • • • Alt Linux Arch Linux Debian FreeBSD … Институт системного программирования РАН 14 / 15 Ссылки • API Sanity Autotest http://ispras.linux-foundation.org/index.php/ API_Sanity_Autotest • Центр верификации OC Linux http://linuxtesting.org • Институт системного программирования РАН http://ispras.ru Докладчик • Владимир Рубанов, к.ф.-м.н., зав. сектором операционных систем ИСП РАН, руководитель Центра верификации ОС Linux • [email protected] Институт системного программирования РАН 15 / 15