Тестирование черного ящика. Б. Бейзер (2004) (1186170), страница 58
Текст из файла (страница 58)
В идеале они являются полнофункциональными, хотя и специализированными языками программирования, имеющими формальные спецификации (зачастую эквиваленты БНФ). Некоммерческие, или узкоспециализированные' продукты, тоже весьма часто используют макроязыки, но, как правило, они не столь явно определены или реализованы в виде коммерческого (горизонтального) пакета. Подобные языки, если они являются частью приложения, обязательно должны пройти синтаксическое тестирование.
Связь. Все системы связи имеют встроенный язык программирования. Это язык, описывающий формат посланий. Вы можете не догадываться о существовании подобного языка, например, в телефонии, но он есть. Телефонные коммутаторы используют особый язык для связи друг с другом. Кроме того, соответствующие локальные, междугородние и международные номера телефона имеют сильно формализованный синтаксис, называемый планом номера. Любое послание, использующееся для связи, должно иметь формат (то есть синтаксис), который должен быть проанализирован. Язык запросов базы данных. Любая база данных имеет командный язык, используемый для того, чтобы определить, что надо искать и что надо из нее извлечь.
Самые простые языки предлагают только один ключевой параметр. В более совершенных системах существует поиск с использованием булевой алгебры, основанный на определяемых пользователем параметрах, которые мы интерпретируем как предикаты. Подобные предикаты, очевидно, обладают формальными синтаксисом и семантикой, и, следовательно, должны быть проверены с помощью синтаксического тестирования.
Компиляторы и генерируемые синтаксические анализаторы. Существует один тип продуктов, в котором не стоит использовать синтаксическое тестирование и особенно грязное синтаксическое тестирование. Это современные компиляторы. Это может показаться странным и неверным, но это соответствует моей установке, гласящей, что тестировшик никогда не должен повторять тесты, выполненные ранее другими. Современные компиляторы, разумеется, имекзт синтаксические анализаторы.
Но зти синтаксические анализаторы генерируются полностью автоматически, с использованием генератора синтаксического анализатора, которому задается формальное описание, наподобие БНФ. Лексические анализаторы также генерируются ' Программы, ирсдиазиачеииые лля широкого круга пользователей, такие как текстовые редакторы. злсктроииые таблицы и базы лаииых, называются горизоитальиыми пакетами.
Пакеты, сиециализироваииыс лля какоомто одного рола деятельиости и обеспечивающие большинство иеобходимых для этой дсятсльиости фуикций (иаиримср, лля туристических агситов, цветоводов или аптекарей), иаэмвэются вертикальными оакстэми. 232 Глава 8 ° Синтаксическое тестирование автоматически на основе формальных спецификаций. Наиболее известные инструменты для этих целей — это ЕЕХ и УАСС 1МАЯ090~. Несмотря на то, что первое время они в большинстве случаев использовались исключительно для генерации лексических и синтаксических анализаторов в компиляторах, сейчас они и им подобные программы все чаше используются для генерации лексических и синтаксических анализаторов в командных языках программного обеспечения. Это очень хорошо, поскольку генерируемые лексические и синтаксические анализаторы необычайно надежны.
С точки зрения тестировшика применение синтаксического тестирования здесь неперспективно, поскольку даже полностью автоматизированное, оно не сможет сломать подобные лексические и синтаксические анализаторы. Прежде чем потратить массу времени и сил на синтаксическое тестирование (даже автоматизированное), оцените, что это за приложение и как оно реализовано. Если в нем используется или проектируется генератор лексического и синтаксического анализатора, то вероятность успешного применения синтаксического тестирования у вас довольно мала. Такие ошибки здесь не проходят. Единственное, что тут остается проверить, — это семантику, что, как вы видели, часто делается другими методами, такими как тестирование доменов.
8.5.2. Предположения об ошибках Предположения об ошибках в синтаксическом тестировании удобнее всего формулировать для абстрактного синтаксического анализатора, вне зависимости от того, явный он или скрытый. Ниже приведены примеры. 1. Неполный синтаксис. Разумные с точки зрения выполняемости команды не принимаются, а если и принимаются, то выполняются неверно, так как синтаксический анализатор не может обработать подобную строку. Вследствие этого интерпретация команд происходит бессистемно, как правило, неверно и ведет к сбоям, или потере данных.
2. Непоследовательный синтаксис. Синтаксис, сильно зависящий от контекста, ведущий к непредсказуемому и непоследовательному синтаксическому анализу, и, как следствие, к ошибкам в интерпретации. 3. Ошибочное отклонение и ошибочное принятие. Ошибки в синтаксическом анализаторе, ведущие к отклонению корректных с точки зрения выполняемости команд и принятию команд, содержащих синтаксические ошибки. 4.
Синтаксическое/семантическое несоответствие. Ошибки в синтаксическом анализаторе, ведущие к отклонению или некорректной модификации значений полей. Например, целые числа от 0 до 999 должны приниматься, однако реализация требует наличия ведущего ноля, в результате чего отклоняются хорошие числа, такие как 7 и 19. 5. Лексические ошибки и ошибки в алфавите. Некорректные лексические преобразования, ведущие, скажем, к интерпретации содержания полей как 8.5. Рассмотрение приложений 233 разделителей.
Например, строки должны помешаться в кавычки, но не предусмотрена возможность обработки строк, содержащих кавычки, или перевод строки интерпретируется как конец поля, но невозможно ввести текст, включающий перевод строки. 8.5.3. Ограничения и предостережения При проведении синтаксического тестирования мы сталкиваемся с двумя серьезными проблемами: психологической и методологическои. "!'ак как автоматизация проектирования достаточно проста, то после описания синтаксиса в БНФ число автоматически генерируемых тестов может измеряться сотням и тысячами. Однако в случае генерации синтаксических анализаторов эффективность таких тестов не превышает эффективность перебора всех итераций при проверке цикла.
Методологический аспект заключается в существовании мнения (ничем не оправданного) об эффективности того, что я называю игрой в «Эрудита» на клавиатуре, Рахманинов-тестированием или обезьяньим тестированием. Оно представляет собой беспорядочный ввод с клавиатуры предположительно произвольных строк, до тех пор пока что-либо не сломается — этот миф обычно дополняется наличием хитрого хакера, барабанящего по кнопкам. Ранее программное обеспечение для РС, а также большинство любительских программ действительно могло быть сломано при таком тестировании, но для современного профессионального программного обеспечения такие случаи — редкость. Тем не менее, миф об эффективности деятельности хитрого хакера, творящего темные дела за клавиатурой, жив в общественном сознании и в сознании людей, несведущих в технике тестирования.
Мне встречались менеджеры по разработке программного обеспечения, искренне верящие, что обезьянье тестирование — это единственное тестирование, необходимое продукту. Но что такое синтаксическое тестирование, если не полностью формализованное, научное обезьянье тестирование? В таком случае большим заблуждением будет считать, что синтаксическое тестирование недостаточно надежно. 8.5.4. Автоматизация и инструментальные средства Возможно, наиболее привлекательная сторона синтаксического тестирования— зто простота, с которой разработка теста может быть полностьк> автоматизирована.
Возможно, из-за простоты автоматизации этот метод поддерживают коммерческие инструменты, такие как (Т) 1ЮЕ194, РОЯТ94]. И даже в отсутствие коммерческих инструментов проектирование языка тестов, воспринимающего БНФ-спецификацию, соответствующего интерпретатора тестового языка и генератора чистых/грязных тестов не является сложной задачей. Вы определяете свой метаязык, как если бы он был оГ>ычным языком, и затем используете лексический анализатор и генератор синтаксического анализатора, наподобие 1.ЕХ или >'АСС, чтобы они сделали ббльщую часть работы. Разумеется, вы проверяете и сам свой генератор, используя его для генерации тестов.
У меня есть несколько неплохих генераторов, построенных для себя. Разработка каждого из них заняла триместр у одного хорошего (но не гениального) студента, проходящего курс обучения языку программирования, который включал в себя изучение ЕЕХ и'>'АСС, 234 Глава 8 ° Синтаксическое тестирование Я оцениваю скорее нижний предел требуемых трудозатрат, поскольку во множестве приложений работа с коммерческими инструментами, такими как Т, усложняется тем, что вам необходимо принимать в расчет специальные входные интерфейсы, автоматизацию выполнения теста, специфику платформ н тому подобные вещи.
Это особенно характерно для случаев, когда входные данные не вводятся с клавиатуры обычным способом (например, при передаче телекоммуникационных сигналов), а должны быть интегрированы глубоко внутрь приложения. 8.6. Резюме Синтаксическое тестирование представляет собой мощное, легко автоматизируемое средство, предназначенное для тестирования лексических и синтаксических анализаторов командного процессора в командно-управляемых приложениях. Синтаксическое тестирование начинается с определения синтаксиса путем задания формального метаязыка, среди которых наиболее популярен БНФ.