это основной инструмент при создании
Компиляторы[,,] - это основной инструмент при создании программного обеспечения, поэтому их надежность особенно важна. Наряду с другими методами верификации и валидации для компиляторов, тестирование попрежнему остается важным элементом в семье этих методов. Необходимость автоматизации тестирования компиляторов также представляется очевидной, поскольку реальные объемы добротных наборов тестов и сложность анализа результатов весьма велики.
Подход UniTesK [] является методологий построения надежного и качественного ПО на основе использования моделей этого ПО. UniTesK использует модельный подход в следующих целях:
-
для построения критериев правильности реализации ПО,
-
для построения критериев полноты и эффективности проверки качества ПО,
-
для построения входных тестовых данных и процедур анализа результатов целевого ПО.
В узком смысле UniTesK предлагает рассматривать модели как инструмент для построения тестов целевого ПО. При этом процесс разработки теста и собственно тестирования распадается на следующие фазы:
-
Построение абстрактной модели или спецификации поведения целевой системы.
-
Извлечение тестового оракула (т.е. процедуры анализа результата целевой системы) из спецификации.
-
Разбиение пространства входных данных целевой системы на домены,
-
Проектирование критерия тестового покрытия в терминах абстрактной модели.
-
Интеграция сгенерированных и вручную написанных компонентов тестовой системы.
-
Пропуск тестов, включающий
-
анализ результатов целевой системы при помощи оракулов;
-
измерение тестового покрытия в терминах модели/спецификации или в терминах реализации.
Основные достоинства этого подхода состоят в следующем:
-
Спецификации и модели обычно строятся на основе функциональных требований к системе, и часто структура спецификаций следует структуре требований, что позволяет явным образом связать требования к системе с результатами тестирования и метриками тестового покрытия.
-
Спецификации и модели, а значит и тесты, могут разрабатываться до завершения реализации целевой системы, что сокращает общее время разработки ПО.
-
Спецификации и модели обычно компактнее и проще реализации, что упрощает ре-юз и сопровождение как самих моделей, так и тестов, которые строятся на их основе.
-
Достижение исчерпывающего покрытия в соответствии с критериями, определенными на спецификациях и моделях, как правило, обеспечивает уровень покрытия реализации, сравнимый с уровнем, достигаемым при традиционном тестировании, но за счет существенно меньших трудозатрат.
Подход UniTesK прошел апробацию в проектах, свзяаннных с тестированием как действующего, так и вновь создаваемого ПО [,,].
Целевое ПО в этих проектах принадлежало к различным классам систем, предоставляющих процедурный интерфейс:
-
ядра операционных систем,
-
телекоммуникационные протоколы,
-
серверы,
-
run-time поддержка компиляторов и отладчиков.
Следуя общей схеме процесса UniTesK, описанной выше, удалось полностью автоматизировать работы фаз 2, 3, 5, 6. Фаза 1 выполняется вручную, фаза 4 - полуавтоматически.
Перенос опыта и инструментов UniTesK на тестирование компиляторов вскрыл ряд проблем. В этой статье мы опишем применение этого подхода к тестированию оптимизирующих модулей в компиляторах.
Главная проблема здесь заключается в том, что нет эффективного способа создавать для оптимизатора такие спецификации, из которых можно было бы извлекать эффективные оракулы. Поэтому в предлагаемом подходе мы используем лишь следующие фазы процесса UniTesK:
-
Построение абстрактной модели входных данных целевой системы.
-
Проектирование критерия тестового покрытия в терминах абстрактной модели.
-
Интеграция сгенерированных и вручную написанных компонентов тестовой системы.
-
Пропуск тестов, включающий
-
анализ результатов целевой системы при помощи оракулов;
-
измерение тестового покрытия в терминах модели/спецификации или в терминах реализации.
В рамках предлагаемого подхода оракул проверяет только сохранение семантики программы во время оптимизации. Для этого в качестве тестовых воздействий на оптимизатор берутся такие программы, семантика которых полностью представляется их трассой. Такое свойство тестов позволяет свести задачу проверки сохранения семантики к сравнению трассы с некоторой эталонной трассой.
Итак, суть подхода такова:
-
Построить для тестируемого оптимизатора представительное множество тестовых воздействий следующим образом:
-
построить абстрактную модель входных данных оптимизатора;
-
в терминах абстрактной модели сформулировать критерий покрытия этих входных данных;
-
перебрать соответствующие тестовые воздействия;
-
Протестировать оптимизатор следующим образом:
-
пропустить тесты через компилятор при активированном тестируемом оптимизаторе;
-
вынести вердикт относительно сохранения семантики тестов после оптимизации.
В следующих разделах статьи описываются детали процесса тестирования оптимизаторов в соответствии с предлагаемым подходом.В конце приводятся экспериментальные данные по применению методологии, обсуждаются область применимости и ограничения этого подхода и приводится обзор близких работ.
Предварительный вариант настоящей статьи был доложен на международном семинаре ``Понимание программ''[].
Все публикации раздела