3. Приведите примеры некоторых программных структур, обсу-ждаемых в предыдущих главах, которые можно рас-
сматривать в качестве шаблонов проектирования.
4. Какую роль, как надеются исследователи, будут играть структуры в процессе создания программного обеспечения в
будущем?
6.5. ТЕСТИРОВАНИЕ
В разделе 4.6 рассматривались методы верификации алгоритмов в строгом математическом смысле. Однако было сде-
лано заключение, что большая часть создаваемого сегодня программного обеспечения "верифицируется" посредством тести-
рования. К сожалению, тестирование в лучшем случае можно расценивать как неточную науку. Выполнив тестирование, мы
не можем утверждать, что некоторая часть программы правильна, если не были выполнены все проверки, исчерпывающие
возможные сценарии. Но даже для простой структуры цикла, содержащей единственную инструкцию if-then-else, существу-
ет более 1000 различных пересекающихся путей выполнения, если цикл повторяется всего лишь десять раз. Следовательно,
проверить все возможные пути выполнения в сложной программе – просто невыполнимая задача.
С другой стороны, создатели программного обеспечения разработали методы тестирования программ, повышающие ве-
роятность обнаружения существующих в них ошибок. Один из таких методов основан на наблюдении, что ошибки в про-
граммном обеспечении имеют тенденцию к группированию. (Это часто называют принципом Парето, в честь Вильфредо
Парето (Vilfredo Pareto), который заметил, что малая часть населения Италии контролирует большую часть богатств этой
страны.) Как показывает опыт, в крупной системе программного обеспечения всегда существует определенное число моду-
лей, являющихся более проблематичными, чем остальные. Следовательно, обнаружив эти модули и проверив их более тща-
тельно, можно выявить большую часть существующих в системе ошибок, даже если все остальные модули будут протести-
рованы обычным, менее тщательным образом. Задача, таким образом, заключается в обнаружении таких проблематичных
модулей.
Еще один метод, называемый тестированием основных путей, состоит в разработке набора контрольных данных, гаран-
тирующего, что каждая инструкция в программе будет выполнена хотя бы один раз. Для подготовки таких наборов были
разработаны методы, построенные на основе математической теории графов. Поэтому, хотя и нельзя будет утверждать, что
все возможные пути выполнения в системе программного обеспечения будут проверены, можно гарантировать, что в про-
цессе тестирования каждая инструкция в программном коде системы будет выполнена, как минимум, один раз.
Методы, основанные на принципе Парето, и способ тестирования основных путей предполагают знание внутренней
структуры тестируемого программного обеспечения. Следовательно, они относятся к категории тестирования по принципу
"прозрачного ящика", при котором подразумевается, что внутреннее устройство программного обеспечения известно тести-
рующему. В противоположность этому, при тестировании по принципу "черного ящика" выполняемая проверка не может
основываться на знании внутренней структуры тестируемого программного обеспечения. Короче говоря, тестирование по
принципу "черного ящика" выполняется с точки зрения пользователя системы. В этом случае анализируется не то, как имен-
но программа функционирует при решении задачи, а исключительно то, насколько правильно она работает в смысле точно-
сти достигнутых результатов и скорости ее выполнения.
Один из методов, который обычно относится к концепции тестирования по принципу "черного ящика", именуется ана-
лизом граничных условий. Этот метод заключается в определении граничных условий, указанных в спецификации про-
граммного обеспечения, с последующей проверкой функционирования программы при этих условиях. Например, если пред-
полагается, что в программе допускается введение исходных значений только из конкретно заданного диапазона, то работу
программы следует проверить при вводе наименьшего и наибольшего значений из допустимого диапазона. Если же про-
граммное обеспечение должно координировать множество различных действий, то его работу следует проверять с использо-
ванием множества действий, имеющих максимальные требования к системе.
Therac-25. Необходимость жестких требований к качеству проектных работ подтверждается проблемами, возникшими при ис-
пользовании Therac-25, – системы радиационной терапии, включающей управляемый компьютером ускоритель электронов. Эта сис-
тема применялась медиками в середине 80-х гг. XX в. Недостатки, присущие этому проекту, вызвали шесть случаев передозировки
радиационного облучения, три из которых привели к смертельному исходу. К недостаткам системы можно отнести неудачный про-
ект интерфейса пользователя, позволявший оператору начинать облучение до того, как машине будет задана соответствующая дози-
ровка, а также плохую координацию взаимодействия аппаратного и программного обеспечения, вызвавшую снижение необходимого
уровня безопасности. Более подробно познакомиться с данным вопросом можно в форуме Risks на Web-узле http: //catless.ncl.as.uk/,
посвященном вопросам возникновения рисков.
Еще одним методом тестирования по принципу "черного ящика" является применение избыточности. В данном случае
две системы для выполнения одной и той же задачи разрабатываются независимо различными группами или даже компа-
ниями. Затем обе системы проверяют путем задания им одинаковых данных и сравнения результатов. Ошибки проявляются при
расхождении в полученных результатах. Такие методы часто применяются в космических исследовательских системах.
Следующим методом тестирования по принципу "черного ящика" является метод "упрощенных версий", который все
шире используется разработчиками программных средств, предназначенных для рынка персональных компьютеров. Он за-
ключается в представлении части предполагаемой аудитории предварительной версии программного обеспечения, называе-
мой бета-версией. Основная задача – изучить, как программное обеспечение функционирует в реальных условиях, перед тем
как конечная версия продукта будет утверждена и выпущена на рынок.
Достоинства подобного тестирования опытного образца превышают рамки традиционного обнаружения ошибок. Полу-
чение отзывов потребителей (как положительных, так и отрицательных) может существенно помочь в уточнении рыночных
стратегий. Более того, раннее распространение бета-версий программного обеспечения помогает другим производителям
программного обеспечения в разработке совместимых продуктов. Например, распространение бета-версии новой операци-
онной системы ускорит разработку совместимых с ней обслуживающих программ, в результате окончательная версия опе-
рационной системы окажется на полке магазина сразу в окружении сопутствующих программных продуктов. Наконец, су-
ществование бета-версий программного обеспечения помогает создать на рынке атмосферу предвкушения, которая повыша-
ет популярность продукта, а значит, и увеличивает объем его продаж.