Тестирование черного ящика. Б. Бейзер (2004) (1186170), страница 29
Текст из файла (страница 29)
В обоих случаях графа имеет реальное значение. Таким же образом значение ноль — реальное значение, в то время как пусто не имеет какого-либо значения. Это означает — ие определено. Рассмотрим оператор присваивания; 1Г х > О ТНЕМ сзн: = джо. Мы знаем, что делать с сзн, когда х > О, ио вдруг х <= О? Есть две альтернативы: либо у переменной сзи иет значения, и оиа здесь же и создается, либо имеется другое, заранее ' Я начал писать эту книгу в 1992 году.
Я должен был неправ щ гь эти числа н! 993, 1994 и, наконеп, еще раэ в 1995 году. Однако, в отличие от нас, я не мог испольэовать гимвольггущ перемен ггув для этик чисел. Было бы намного проще, если бы я мог так поступить. Если я пропустил несколько обновлений, я уверен, что вы сообщите мне об этом, — но надеккь, что ны простите меня. 5.3. Отношения и модель 123 1: !Е статус налогоплательщика = холост ТНЕН отнечена графа 1.
60ТО ба 2: !Е статус налогоплательщика - женат заполнено совиестно ТНЕН отнечЕна графа 2: ЮТО ба 3: !Е статус налогоплательщика = женат заполнено раздельно ТНЕН отиечена графа 3: БОТО ба 4 !Р статус налогоппательщина - доновладепец ТНЕН отнечена графа 4. ЮТО ба 5 !Е статус налогоплательщика - вдовец ТНЕИ отмечена графа 5. БОТО ба Этот псевдокод не является неоднозначным в том случае, если мы знаем, что предшествуюшее состояние всех граф «не отмечена».
Поскольку мы не можем быть уверены в этом в случае кода, содержашего ошибки, более предпочтительная модель могла бы выглядеть следуюшим образом: 1: !Е статус = холост ТНЕН графа 1: = отиечена: ЮТО ба ЕЕ5Е графа 1 не отиечена 2: !Е статус = иен совы ТНЕН графа 2 = отмечена: БОТО ба Е!5Е графа 2.- не отмечена 3 !Г статус - иЕн раздельнО ТНЕН графа 3 - отмечена; ЮТО ба Е!5Е ~рафа 3:- не отнечена 4 !Г статус - доновпадепец ТНЕН графа 4: = отмечена, 60ТО ба ЕЕ5Е графа 4; = не отмечена 5: !Е статус = вдовец ТНЕН графа 5: - отмечена: 60ТО ба ЕЕ5Е графа 5:- не отмечена Программисты могут возразить, что этот код нехорош, так как он неоправданно сложен, что само по себе делает код более уязвимым для ошибок, и, кроме того, он не структурирован.
Все это правда, но ведь это не код. Это всего лишь модель, в которой мы пытаемся сделать ситуацию как можно более однозначной. Вот модель потока данных для этих действий. О О. О 1. О. 1 вход статус графа 1 графа 1. б выбор. !Е статус = неженат выбрать отиечена ЕЕ5Е выбрать не отмечена рассчитанное где-то в другом месте графа потока данных значение для сэн. Первый случай не представляет проблемы. Мы моделируем его так; 1Е х > 0 ТНЕМ сэи: джо ЕЕБЕ сэи:- пусто. Второй случай тоже не сложен. Он должен быть смоделирован так:1Г х > 0 ТНЕМ сэн: джо ЕЕ5Е сэн: - старое значение сэн.
Нам сноване нужно сомнительное 1Г-ТНЕМ. Возможно, проблема возникнет, если переменная сэн определена в более чем одном месте. Какое значение нам следует использовать для случая ПОМЬ? Это— хороший вопрос, не имеютций простого ответа. Тут возможны варианты, поскольку в случае неоднозначности не бывает очевидного ответа. Конструкция 1Е-ТНЕМ однозначна в графе потока управления, потому что графы потока управления имеют подразумеваемое упорядочение (упорядоченную последовательность). Следовательно, обычно имеется подразумеваемое (предшествуюшее) значение для такой ситуации.
В графах потока данных, в которых нет подразумеваемого упорядочения, значение становится неоднозначным. Вот почему следует избегать использования 1Г-ТНЕМ в подобных моделях. Но заметьте, что неоднозначность в модели увеличивает вероятность ошибок программирования. В качестве примера использования 1Е-ТНЕМ рассмотрим, как бы мы могли смоделировать строки с 1-й по 5-ю в форме 1040.
Здесь приведен псевдокод для этих строк. 124 Глава 5 ° Тестирование потоков данных графа 2: графа 2: графа 3: выбор: 1Е статус- иен совы выбрать отиечена Е(5Е выбрать не отмечена выбор. 1Е статус = иен раздельно выбрать отиечена ЕЕ5Е выбрат~ не о~мечена выбор. !Е статус = вомовпапепец выбрать отмечена Е(5Е выбрать не отиечена выбрать отиечена ЕЕ5Е выбрать не отиечена выбор !Е статус - вловец выбрать отиечена Е(5Е выбрать не отмечена ПРО4ОПЩЕННЕ ИОЛЕЛИ графа 4: графа 3. графа 5. графа 4; отмечена: графа 1 графа 2: графа 3: графа 5. графа 4 34 3: 34: вход $6350 34.5: 34: вход $3175 графа 5: 6: не отнечена: графа 1: графа 2: графа 3 графа 4: графа 5: Модель может показаться сложной, ио зто ие так, потому что определено всего пять различных выходов (по одному иа каждую графу).
В тестируемом программиом обеспечении, в котором реализуется зтот процесс, мы должны убедиться ие только в том, что правильная графа отмечена, ио и в том, что все остальные графы остались иеотмечеииыми и отмечено ие больше одной графы. Заметьте, что если вход статус иалогоплателыцика ие является одним из пяти правильных вариантов, тогда все графы останутся иеотмечеииыми. Селектор СА5Е.
Структура Селектора СА5Е в графах потока данных — обобщение структуры 1Е-Т>(Е>>-ЕЕ5Е. Модель потока данных для строки 34 такова: 34.1: 34: вход $3800 (холост, бебцсттоп (возврат).- $3800) 34.2: 34, вход $5600 (домовладелец. бебцсттоп (возврат) - $5600) (щенат совместная леипарация. бебцсттоп (возврат): - $6350) 34.4: 34: вход $6350 (вдовец. бебцсттоп (возврат): - $6,350) (иенат заполнено раздельно, бебцсттол (возврат): - $31757 статус 34: вход статус напогоппательщима (управляющая входящая связь вля сепеитора 34) 34: выбор статус налогоплательщнма.
холост 34 1 вомовлапелец 34 2 совнестно 34 3 ввовец 34 4 раздельно 34.5 Строка 34 иллюстрирует работу узла СА5Е. Я предпочитаю использовать перемеииую статус налогоплательщика для моделирования предиката выбора, потому что зто тот способ, который используется в инструкциях ВНС. Обладая ииформацией, какая графа была отмечена в строках с 1-й по б-ю, я бы создал в строках с 1-й по 5-ю модели переменную ноиер графы, значение которой устанавливалось бы 5.3.
Отношения и модель 125 соответствующим той графе, которая отмечалась, и затем использовал бы значение нокер графи для управления предикатом выбора в строке 34. Так же как и в случае конструкции 1г -ТНЩ здесь возможна неоднозначность. Что произойдет, если ни одна из граф (строки 1-5) не будет отмечена? Что произойдет, если в строках с 1 по 5 отмечено более одной графы? 5.3.3. Короткие замечания и упрощенные методы Не забудьте, что мы имеем дело с моделями, а не с программным обеспечением. Следовательно, закладывайте в модель как можно больше деталей из тех, что вам нужны, но не все, что вам известны. Ваши модели потока данных, используемые при разработке тестов, должны иметь различные степени детализации по аналогии с диаграммами потока данных, используемыми в проектировании.
Например, имея дело с файлом, вы могли бы извлечь пользу от наличия нескольких уровней детализации (и нескольких различных моделей потока данных). Уровень файла. Рассмотрите весь файл как один объект данных, с которым обрашаются как с единым целым. Сконцентрируйтесь на операциях, которые применяются к целому файлу, и на операциях между файлами, например, открыть, закрыть, копировать, сравнить, переименовать, удалить, переместить, переслать, объединить, извлечь, создать. Уровень записи. Тесты, которые вы проделали па уровне файла (если они успешно пройдены), гарантируют, что вы работаете с правильным файлом.
Сконцентрируйтесь на получении правильной записи в модели для уровня записи. Проводимые операции аналогичны операциям на уровне файла: добавить запись, удалить запись, копировать запись, найти запись, извлечь, сравнить, переместить. Уровень поля. Рассмотрите индивидуальные поля в записи. Здесь может быть несколько уровней.
Например, одно из полей может являться массивом. Рассмотрите следующие операции: вставить поле, удалить поле, изменить значение поля, копировать значение, сосчитать число полей. Уровень обработки. Обычно его можно совместить с уровнем поля, но это не всегда стоит делать, если операции с полями либо обработка данных достаточно сложны. Модель обработки сама по себе может быть создана на нескольких различных уровнях детализации. Группы данных. В ряде случаев (требования приложения или способ программирования) вы, может быть, захотите сгруппировать те объекты данных, которые обрабатываются схожим образом, даже если они не связаны в контексте данного приложения. Это поможет вам создать многократно используемые модели. То есть одна и та же модель может быть использована для нескольких различных, возможно, не связанных, частей приложения.
Возможность повторного использования — признак хорошего программирования и хорошего дизайна тестов. Качественное проектирование программного обеспечения упрошает задачу моделирования, поскольку разработчики создают иерархический набор потоков данных, структура которого отражена в структуре разбиения процесса обработки. 126 Глава 5 ° Тестирование потоков данных Когда вы, как об этом говорилось выше, разделяете модель на уровни, вам, возможно, придется «создать» новые объекты данных, которых нет в спецификациях. Определите их так точно, как если бы вы занимались программированием, задайте их атрибуты, определения и так далее. После определения, такая псевдопеременная становится переменной при использовании в модели потока данных более высокого уровня.
При создании и использовании таких упрощенных методов вы не программируете и не меняете технические требования — вы закладываете фундамент, необходимый для создания высокочувствительного теста. Если приложение сложно организовано, приготовьтесь к тому, что тесты будут, подобно ему, обладать сложной структурой. Если программное обеспечение выигрывает при использовании иерархической структуры, разбиения и многократно используемых компонентов, то выиграет и тестовый комплект. Большинство методов, использование которых оправдано при проектировании программы, окупаются при разработке тестов. Вы могли бы раскритиковать такой подход к организации разработки тестов, сказав: «Ни приложение, ни программное обеспечение не всегда бывает структурировано должным образом, Предполагая хорошую структуру тестируемой системы прн проектировании тестов, вы можете упустить из виду возможность выявления ошибок, являющихся следствием плохой структуры, — например, ошибок, проистекающих из смешения уровней файла, поля, записи данных с их обработкой».