Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тестирование программного обеспечения. Фундамен...docx
Скачиваний:
3
Добавлен:
01.05.2025
Размер:
936 Кб
Скачать
☆

Глава 2: Желаемое и действительное в жизни тестировщика

43

Нельзя проверить каждую возможную последовательность выполнения команд программы

При каждом сеансе работы программы можно отследить последователь­ность выполнения ее операторов от запуска до завершения. Последователь­ности могут отличаться фрагментами кода или их порядком. Для примера давайте снова обратимся к программе из первой главы. Ее можно запустить и немедленно остановить нажатием <Ctrl+C> — это первый путь. Можно запустить программу, ввести два числа, посмотреть на сумму и только после этого нажать <Ctrl+C> — вот вам второй путь. В третий раз можно ввести цифру, а затем нажать <BackSpace>.

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

• Система запускается в состоянии 1. Это ее основное состояние, и она возвращается в него при каждой возможности.

• Из состояния 1 она всегда переходит в состояние 2.

• Из состояния 2 она может перейти в состояние 3 или 5.

• Из состояния 3 она может перейти в состояние 4 или 5.

• Из состояния 4 она межет перейти в состояние 3, 5 или 6.

• Из состояния 5 она может перейти в состояние 1, 4 или 6.

• Из состояния 6 она может перейти в состояние 3 или 5.

Всего шесть состояний — ну что тут тестировать? Но так кажется лишь на первый взгляд. На деле же команда тестирования обнаружила, что, если система, прежде чем добраться до состояния 6, тридцать раз перейдет из состояния 4 в состояние 5, произойдет сбой. Как вы думаете, сколько для нахождения этой ошибки понадобится поверить различных последователь­ностей выполнения, если не предположить ее существование заранее?

Ошибка эта была найдена в телефонной системе РВХ. В состоянии 1 телефон молчит. Когда телефон звонит (состояние 2), то либо его владелец поднимает трубку (состояние 3 — соединение), либо звонящий вешает трубку (состояние 5 — отключение). Ответив на звонок, владелец телефо­на может нажать кнопку Hold (состояние 4) или повесить трубку (состоя­ние 5). Пока звонящий ждет у телефона (или повесит трубку), владелец может ответить на другой звонок (состояние 6 — ожидание переключения на ждущую линию). Когда владелец повесит трубку, прекратив и текущий, и ожидающий разговоры, телефон вернется в состояние 1.

44 Часть I: Основы

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

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

Большинство программ несравнимо сложнее этого примера со стеком и шестью состояниями. И когда мы говорим, что невозможно проследить все пути выполнения программного кода, — это лишь одно из многих “невоз­можно” в работе специалиста по тестированию. Поэтому профессионалы тестирования полагаются на эвристические стратегии, которые позволяют не наверняка, но зато с наибольшей вероятностью локализовать и выявить ошибки программы, и в первую очередь наиболее существенные.

Какое огромное количество путей выполнения существует в любой, даже самой простенькой программе, продемонстрировал в 1976 году Май­ерс (Myers). Он описал программу из сотни строк, допускавшую 1018 воз­можных путей выполнения. Для сравнения он заметил, что наша вселенная существует меньше времени — 4*1017 секунд.

В 1979 году Майерс описал еще более простую программу. В ней был цикл и несколько операторов №. В большинстве языков программирования для ее реализации понадобилось бы не больше 20 строк кода. Путей выполнения у этой программы 100 триллионов. Самому быстрому тестировщику понадобится для их проверки миллион лет.

Программы Майерса просты. Да, они были специально составлены таким образом, чтобы допускать множество последовательностей выполне­ния, но, если для программы из двух десятков строк возможны 100 трил­лионов путей, сколько же их возможно для текстового редактора из 5 тыс. строк, простой электронной таблицы из 20 тыс. строк или настольной издательской системы из 400 тыс. строк? Слишком много. И не только для тестировщика, но даже для автоматизирующей его работу программы.

Очень важно понимать, что, как и в случае со входными данными, программа не будет протестирована полностью, если не будет проверен