Анализ зависимостей между тестами, покрытием кода и плотностью ошибок

Создать новую статью

20.09.2010 06:00


Информация об авторе.

Бригинец Василий Петрович,  студент 5 курса Института Космических и Информационных Технологий Сибирского Федерального Университета. Обучение ведется по специальности 230102.65 - Автоматизированные системы обработки информации и управления на кафедре Системы Искусственного Интеллекта.

В рамках летней школы 2010 года проходил стажировку вместе с Кудинкиным Алексеем в Новосибирском офисе Интел под руководством Ильи Черного, Александра Фенстера и Василия Куркова. Менеджером выступил Виталий Саяпин.

Во время летней школы победил  в конкурсе «Летняя Атомосфера». В данный момент зарегистрирован на участие в XI Открытой Всесибирской олимпиаде по программированию  им. И. В. Поттосина.

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

Аннотация

В статье рассматривается возможность установления зависимости между тестами, ежедневно тестирующими программный продукт Intel® Compiler, покрытием исходного кода компилятора и плотностью найденных ими ошибок.

Было проведено исследование эффективности тестирований на различных платформах, разработана композитная система статистического анализа данных о тестировании компилятора и последующего исследования покрытия кодов компилятора и написано несколько Perl-скриптов, облегчающих работу с историческими данными.

Введение

Тестовая база программного продукта Intel® Compiler содержит десятки тысяч тестов, которые 24 часа в сутки 7 дней в неделю исполняются для проверки качества текущей версии компилятора. Поддержание такой тестовой системы требует огромного количества оборудования и работы большой команды специалистов по качеству компилятора. Оптимизация тестового набора может существенно сократить необходимые ресурсы и улучшить качество тестирования компилятора.

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

Планировалось проанализировать данные тестирования компилятора за последние несколько лет. На основе выполненного анализа выявить зависимости между тестами, обнаруживающими одни и те же ошибки и проверяющими одни и те же строки исходных кодов компилятора. После этого предложить минимальные наборы тестов, достаточные для тестирования компилятора с определенными вероятностями обнаружения ошибок. Кроме того, необходимо было выделить участки исходного кода компилятора, имеющие недостаточное покрытие тестами и высокую плотность появления ошибок.

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

Выбор используемых технологий и инструментов входил в состав задач.

Основная часть

Для анализа данных была спроектирована и реализована система обработки и визуализации данных о связи между ошибками и тестами, между ошибками и исходными кодами компилятора, тестами и исходными кодами компилятора, тестов друг с другом.

В качестве косвенной метрики для оценки эффективности отдельно взятого тестирования было выбрано общее количество, а также количество уникальных для каждого тестирования трекеров (tracks - идентификатор найденной ошибки).

Решение поставленных задач осуществлялось с использованием интерпретируемого языка Perl, как удобного средства работы с регулярными выражениями и большими объёмами текстовой информации.

Общую схему решения задач можно представить в следующем виде:

Схема решения задач

Рисунок 1 - Схема решения задач

На первом этапе(I) осуществляется синтаксический анализ текстовых файлов, содержащих информацию о падениях тестов в течение тестового прогона некоторой сборки компилятора.

Структура базы исторических данных

Рисунок 2 - Структура базы исторических данных

На втором (II) этапе осуществляется процесс анализа обработанных на первом этапе исторических данных.  Здесь происходит поиск тестов, которые ни разу не падали, выявление зависимостей между падавшими хоть раз тестами и многое другое.

На третьем (III) этапе производится вывод полученной информации в удобном для дальнейшего анализа виде:

1) В текстовом виде:
текстовый вид

2) В табличном виде:
табличный вид

3) В виде графиков и диаграмм:
представление в виде диаграм
представление в виде таблиц

Итак, была разработана композитная система статистического анализа исторических данных о тестировании компилятора. Система с помощью нетривиальной эвристики выявляет коррелированность тестовых падений.

Три разных теста, падающих одновременно

Рисунок 3 - Три разных теста, падающих одновременно

Далее, попарно сравнивается покрытие кодов компилятора отобранными "сильно коррелированными" парами тестов.

Сравнение покрытия кода

Рисунок 4 - Сравнение покрытия кода

Если большая часть покрываемых каждым из тестов строк кода компилятора совпадают, очевидно, что один из тестов в какой-то мере избыточен.

Для более удобного определения покрытия тестами исходных кодов компилятора был написан специальный Perl-скрипт. В результате работы такого Perl-скрипта получаются файлы, в которых указывается тесты, которые попадали на ту или иную строку исходного кода компилятора. Их количество и название соответствует файлам исходных кодов компилятора.

Пример файла с указанием попавших тестов в ту или иную строку кода компилятора

Рисунок 5 - Пример файла с указанием попавших тестов в ту или иную строку кода компилятора


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

Для примера был написан Perl-скрипт, который выдает процентное соотношение пересечений между тестами.

Пример вывода Perl-скрипта

Рисунок 6 - Пример вывода Perl-скрипта

С помощью этой информации можно определить, какие тесты покрывают одни и те же строки исходного кода компилятора.

Пересечение покрытия тестами исходных кодов компилятора

Рисунок 7 - Пересечение покрытия тестами исходных кодов компилятора

В конце летней практики были подготовлены рекомендации о том какие тесты следует перенести из ежедневного тестирования в еженедельные, какие следует перенести в промоушн (promotion) тестирование (тестирование, осуществляемое разработчиками компилятора).  В этом помог написанный Perl-скрипт, с помощью которого были вычислены тесты, составляющие основу. При использовании только этих тестов могли быть найдены все ошибки за все время тестирований (но это не значит, что только они будут находить все ошибки в будущем). Такие тесты были рекомендованы для использования на всех тестирования (ежедневных, промоушн и т.п.) и на всех платформах (windows, linux, mac).

Пример выделения основных тестов

Рисунок 8 - Пример выделения основных тестов

Также для команды специалистов по качеству компилятора было полезным увидеть статистику по падениям, которая позволяет понять, какие тесты наиболее полезны, на какой платформе лучше работает тест и тому подобное.

Пример статистических данных

Рисунок 9 - Пример статистических данных

Выполняющий это Perl-скрипт универсален. При запуске необходимо только указать директорию с необходимыми для анализа файлами и будет сгенерирована такого рода статистика в удобном excel-формате.

Заключение

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

Во время стажировки был осуществлен небольшой поиск аналогичных задач, и, как выяснилось, отдаленно похожие работы существуют, но использовать  их в нашем случае было невозможно. Поэтому выполненной работе аналогов пока нет.

Все поставленные задачи были выполнены к концу летней стажировки. Несмотря на специфику задач и уникальность исторических данных, написанные Perl-скрипты могут пригодиться и в других работах. К примеру, можно использовать код, работающий с excel документами в любых других Perl-скриптах. Но  самое главное - было получено одобрение и признание необходимости проделанной работы коллегами по команде Intel/SSG/ICL/QA.

Список использованных материалов/литературы

Для решения задач, как уже было сказано выше, использовался интерпретируемый язык Perl. Интерпретатором этого языка был выбран ActivePerl.  Также в работе использовалась утилита codecov, входящая в состав компилятора Интел.

При обучении программированию на perl очень помог ментор Александр Фенстер и книга «Perl: Библиотека программиста» Т.Кристиансена.

Также была использована книга «Методы Анализа Данных» Рубана А.И. и методическое пособие для студентов «Теория принятия решений» Лапко А.В..