Разделы портала

Онлайн-тренинги

.
Интервью с Виктором Куляминым о научных исследованиях в области тестирования
04.10.2009 20:31

Я обещал немного приоткрыть завесу, которая разделяет мир промышленного тестирования и мир научных исследований в этой области, и вот наконец я делаю в этом направлении первый шаг. Сегодня мы публикуем интервью с Виктором Куляминым, старшим научным сотрудником ИСП РАН, автором многочисленных публикаций о тестировании на основе моделей, членом программного комитета ряда научных конференций по тестированию и программной инженерии, преподавателем ВМК МГУ, читающим студентам среди прочих курс лекций по тестированию. Вот вопросы, которые мы задали Виктору:

  • Что вообще можно исследовать в области тестирования программного обеспечения?
  • Какая польза от подобных исследований для коммерческой разработки ПО?
  • Почему бизнес ничего не знает об исследованиях в тестировании ПО?
  • Есть ли разница между подходами к тестированию ПО в бизнесе и науке?
  • Каковы последние наиболее важные достижения в науке о тестировании?
  • Можно ли в числе этих достижений упомянуть test driven development?
  • Где можно найти информацию об исследовательских работах в области тестирования?

Ниже более подробная биографическая информация о Викторе и его ответы на наши вопросы.

Виктор Кулямин окончил мехмат МГУ в 1995 году, аспирантуру мехмата в 1998 году, там же защитил диссертацию кандидата физико-математических наук в 2000 году.
В 1997-1998 гг. работал в Argussoft Co. в качестве разработчика пользовательской документации, проектировщика баз данных, системного аналитика.
С 1998 года работает в Институте системного программирования РАН, в настоящее время в должности старшего научного сотрудника.
С 2008 года является преподавателем кафедры системного программирования ВМК МГУ, доцент. С 2004 года читает на ВМК МГУ спецкурсы по программной инженерии и тестированию.
Имеет около 50 публикаций по следующим темам: методы тестирования на основе моделей, методы верификации ПО, анализ требований к ПО, образование в области программной инженерии.
Личная страничка Виктора содержит множество его публикаций, презентаций с различных конференций, а также конспекты лекций.

Что вообще можно исследовать в области тестирования программного обеспечения?

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

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

Каким образом можно выбрать исчезающе малый по сравнению с общим числом всех мыслимых ситуаций набор тестов, чтобы находить с его помощью важные ошибки и уверенно судить о качестве ПО? Это, собственно, и есть основная проблема тестирования. В большинстве случаев она более-менее успешно решается, несмотря на «загадочность» происходящего. Исследователям важно понять, почему, из-за каких особенностей устройства ПО или применяемых техник тестирования, это становится возможным.

Какая польза от подобных исследований для коммерческой разработки ПО?

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

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

Почему бизнес ничего не знает об исследованиях в тестировании ПО?

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

Самые большие фирмы — Microsoft, IBM, HP, Intel. и пр. — уже давно содержат собственные исследовательские подразделения, куда приглашают наиболее заметных ученых, и где разрабатываются новые технологии и инструменты, интегрирующие идеи, появляющиеся в исследовательском сообществе, с практическими нуждами таких компаний. Можно посмотреть хотя бы на деятельность Microsoft Research — http://research.microsoft.com/en-us/um/redmond/groups/rise/ — в последние несколько лет они очень активно ведут исследования в области тестирования и обеспечения качества ПО.

Есть ли разница между подходами к тестированию ПО в бизнесе и науке?

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

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

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

Каковы последние наиболее важные достижения в науке о тестировании?

На такой вопрос можно ответить только субъективно, поэтому расскажу о том, что мне кажется наиболее важным, хотя и не только мне.

В последние 20 лет появилось довольно много работ по так называемому тестированию на основе моделей. От обычного тестирования оно отличается, фактически, более четкой постановкой задачи — имея заданные модели, описывающие, во-первых, правильное поведение тестируемой системы, и, во-вторых, структуру возможных ситуаций при ее работе и оценку их важности, построить набор тестов, проверяющих правильность работы системы в наиболее важных ситуациях. Откуда берутся такие модели, по сути, не важно, хотя именно их создание и есть самая трудная задача. Большая часть практически значимых исследовательских результатов за последние 10 лет связана именно с тестированием на основе моделей. В повседневную практику коммерческой разработки ПО этот подход еще не вошел, хотя он уже используется при создании телекоммуникационных систем и системного ПО, а сейчас начинает понемногу внедряется и в разработку прикладного ПО некоторых видов. В этой области уже есть достаточно зрелые и мощные инструменты, например, SpecExplorer у Microsoft Research, Conformic Qtronic, LERIOS от SmartTesting, UniTESK, к разработке которого причастны и я, и Алексей Баранцев. Несмотря на значительные достижения, в этом направлении еще есть куда развиваться.

Более свежие исследования, проводимые в последние 3-5 лет, нацелены на интеграцию тестирования с техниками формальной верификации ПО, т.е. со строгой проверкой выполнения тех или иных свойств программ, в основном, при помощи автоматического анализа кода. Эти идеи пока лишь очень редко находят применения в бизнес-проектах, хотя у них большие перспективы. В той же Microsoft Research многие исследовательские проекты (SLAM, Pex, SAGE) связаны с этой темой.

Можно назвать еще одно направление, появившееся в последние 5-10 лет — расширяемые каркасы для автоматизации тестирования. Предком таких каркасов является JUnit — вообще-то, SUnit, сделанный Беком еще раньше на Smalltalk, но об этом мало кто помнит, поэтому лучше отталкиваться от наиболее известного представителя этого семейства инструментов. Дальше появились такие инструменты, как TestNG и NModel, имеющие гораздо больше функций при почти той же простоте использования, и на этом, я думаю, развитие не остановится.

Можно ли в числе этих достижений упомянуть test driven development?

Да, автоматизация тестирования сейчас нередко ассоциируется с test driven development, разработкой на основе тестов. Однако, как говорит само название, это прежде всего метод разработки ПО, а не его тестирования. Он, конечно, внес весьма значимый вклад в программную инженерию в целом, при его использовании качество ПО существенно повышается. Однако, с точки зрения тестирования для оценки качества программ и поиска ошибок в них, тесты, сделанные перед разработкой, бесполезны. Все ошибки, обнаруживаемые ими, были фактически устранены заранее. Но это не значит, что в полученной программе нет других, иногда тоже достаточно значимых ошибок. Только искать их нужно уже на основе каких-то других идей, а не тех, которыми руководствовались при создании предварительных тестов.

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

Где можно найти информацию об исследовательских работах в области тестирования?

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

Наиболее известные исследовательские конференции — TESTCOM/FATES, ISSTA, QSIC, MBT, недавно организованная ICST, более общие ISSRE, ICSE.

Из журналов, для доступа к которым, правда, нужна подписка, можно упомянуть IEEE Software, IEEE Transactions on Software Engineering, ACM Computing Surveys, ACM Transactions on Software Engineering and Methodology, Journal of Systems and Software, и т.д.

Исследовательских групп в области тестирования довольно много, я их перечислять не решусь. Если кому действительно интересно и не жалко времени, потраченного на просмотр десятков сайтов, можно заглянуть на страничку Tao Xie http://people.engr.ncsu.edu/txie/ — он собрал там огромное количество ссылок на журналы, конференции, сайты лабораторий или ученых, на отдельные статьи, не только по тестированию. Часть из этих ссылок уже не работает, но в целом они дают достаточно адекватное представление о текущем состоянии исследований в области тестирования ПО.