maran program engineering (Маран Программная инженерия), страница 28
Описание файла
PDF-файл из архива "Маран Программная инженерия", который расположен в категории "". Всё это находится в предмете "программная инженерия" из 4 семестр, которые можно найти в файловом архиве НИУ «МЭИ» . Не смотря на прямую связь этого архива с НИУ «МЭИ» , его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 28 страницы из PDF
Выбор. Простое условие (рис. 6.3).x=3.4;z=x*y;if ( z>7.2) n++;elsem++;y=z*n.Цикломатическая сложность равна2.Рис. 6.3Пример 3. Выбор. Сложное условие.Сложному условию на графе управления соответствует столько вершин,сколько в нем элементарных условий (рис. 6.4).k=4;if(2.3<=x && x<=6.4) z=5.2;else z=-5.2;y=z+k.Цикломатическая сложность 7 – 6 + 2=3.Рис. 6.4169Любой повтор (цикл) может быть реализован через выбор. Поэтому и составление графа управления аналогично случаю с выбором. При цикле с предусловием вершина выбора предшествует телу цикла, при цикле с постусловием — тело цикла предшествует выбору.
Вершина(ы) выбора в обоих случаяходинаковая: оператору цикла поставим в соответствие столько вершин графа,сколько условий продолжения (прерывания) цикла. for (inti=0; i<25; i++) {….}одна вершина. while (i<=25 &&n!=0) две вершины.Вернемся к тестированию. Для тестирования «белого ящика» необходимопропускать столько тестов, сколько путей имеется на графе управления. Дляциклов с предусловием это означает, что должен быть проверен случай, когдацикл вообще не запускается. Для цикла с постусловием такой случай исключен.При этом возникают следующие сложности.1. При высокой сложности логики программы (большое количество условных операторов) количество путей может достигнуть астрономическихвеличин.
В таком случае рекомендуется разделить программу на части,каждая часть с одним входом и одним выходом, и протестировать этичасти в отдельности.2. Возможно наличие противоречивых путей: невозможно подбирать данные для их прохода. Элементарный пример:if ( x>5.2)n++;if (x< -1.5) m--.Очевидно, что если x>5.2, то он никак не может удовлетворять условиюx< -1.5. Поэтому не существует значения x, при котором будут выполнены какn++;, так и m--;. Это обстоятельство уменьшает объем тестирования.Рекомендуем читателю составить граф управления для программы решения рассмотренной при обсуждении метода «черного ящика» задачи поискасуммы.
Имеются ли там нереализуемые пути?Возникает важный вопрос: как на практике использовать предложенныедва подхода к тестированию? Можно рекомендовать следующую последовательность действий, получится подход, называемый иногда тестированием «серого ящика»:1. На основе спецификации программы составим тесты методами«черного ящика».
Допустим, получили N тестов.2. Пусть на графе управления существует M путей.Возможны следующие случаи:1. N=M и составленные тесты обеспечивают прохождение всех путейпо меньшей мере по одному разу. Все хорошо!2. N=M, но обеспечивается прохождение лишь K путей (K<M). Еслиоставшиеся М-К путей противоречивые, то два или более теста будут пройдены по одному и тому же пути. Если это так и должнобыть, то можно, в принципе, уменьшить количество тестов, новполне возможно, что этого не стоит делать! Если так не должнобыть (два теста пройдут по одному пути, но на самом деле они разные) — значит в программе ошибка!1703.
N=M, но обеспечивается прохождение лишь K путей (K<M), средиоставшихся М-К путей имеются реальные, то не все протестированои количество тестов надо увеличить.4. N<M. Если оставшиеся М-N путей противоречивые, то все хорошо,можем приступить к тестированию, но если это не так, то придетсясоставить и для них тесты.5. M<N, значит, два или более теста пройдут по одному и тому же пути. Если так и должно быть, то некоторые случаи будут протестированы повторно.
Если нет, то два разных случая пройдут по одному и тому же пути и в программе ошибка6.2.3. Метод функциональных диаграммДругое название этого метода: метод причинно-следственных связей. Названный метод весьма эффективен, если результат зависит от сочетания входных условий. Кроме составления тестов применение этого метода позволяетпроверить спецификацию программы и выявить случаи неопределенности инеоднозначности.
Правда, составление функциональной диаграммы и ее анализдля задач реальной размерности весьма трудоемки и трудно поддаются автоматизации. В основе функциональной диаграммы лежит и/или граф. На этом графе вершинам соответствуют события, вершина принимает значение 0 или 1 взависимости от того, событие имеет место или нет. Проиллюстрируем это нарис. 6.5.Рис. 6.5Событие a имеет место, когда имеет место b, и наоборот. Событие c имеет место, если d не имеет место, и наоборот.
Событие w имеет место, если имеют место p и q (количество аргументов можно увеличить) и т. д. На диаграммемогут быть заданы дополнительные условия (рис. 6.6). Если a, то b, обратноеневерно; если вместо R писать M, то это означает: если a, то НЕ b. E означает,что c и d не могут одновременно иметь значения 1, но могут одновременноиметь значение 0. I означает, что, по меньшей мере, одно из e, f или g должно171иметь значение 1.
O требует, чтобы в любой момент одно и только одно из p, qили r имело значение 1.RacbIfgpOcqEdrРис. 6.6Рассмотрим простой пример. При отправлении сотрудника в командировку начальник должен определить, ехать ему на поезде или самолете. Если расстояние не больше 400 км, то на поезде. Если расстояние от 401 до 1000 км, топоезд, если на самолет нет билетов эконом-класса, если такие билеты имеются,то самолет.
Если расстояние свыше 1000 км, то самолет. Естественно, что поездка может состояться, если на самолет имеются билеты, если нет никаких билетов на самолет, то поездка откладывается. Считаем, что на поезд билетыимеются всегда. Граф представлен на рис. 6.7. Применение этого метода начинается с определения и обозначения входов и выходов (относительно их обозначения никаких ограничений нет). В нашем случае:Входы:R1 — расстояние до 400 км.R2 — расстояние от 401 до 1000 км.R3 — расстояние свыше 1000 км.В1 — имеются билеты в эконом-класс.В2 — имеются билеты в бизнес-класс.Очевидно, что из R1, R2 и R3 одно и только одно может имеет значение истинно.
На В1, В2 ограничений нет.Выходы:Р1 — поездка на поезде.Р2 — поездка на самолете.Р3 — поездка откладывается.172P1R1OR2P2R3B1P3B2Рис. 6.7И-ИЛИ граф нагляден, но вместо него можно использовать и функции алгебры логики, которые показывают зависимость выходов от входов. В нашем случае:Р1=R1 ∨ (R2 & ┐B1);P2=(R2 &B1) ∨ (((B1 ∨ B2) &R3);P3=┐(B1 ∨ B2) &R3 = ┐B1 & ┐B2 ┐&R3.Теоретически количество комбинаций входов равно 25, но с учетом ограничений на входы R получим таблицу 6.1.Таблица 6.1№п/п123456789101112R1000000001111R2000011110000ВходыR3111100000000B1001100110011173B2010101010101P1ВыходыP211111111111P31С помощью этой таблицы легко выполнять проверки:1. Каждый выход должен иметь значение 1 хотя бы один раз.2. При любом сочетаний входов только один выход должен иметь значение 1, если противоположное не предусмотрено условиями.6.2.4.
Предположение об ошибкеЭто трудно назвать полноценным методом тестирования, невозможнодать конкретные рекомендации по нему. Можно лишь сказать, что на основеопыта (или интуиции) тестировщик может предполагать, где какие ошибки могут быть, и нацеливает проверки именно туда или обращает внимание на алгоритмически сложные программы, где наиболее вероятно, что такой-то случайне учтен.6.3. Тестирование программных комплексов,построенных методом функциональной декомпозицииМетод функциональной декомпозиции был рассмотрен в п.
2.1 и представлен на рис. 2.1. Напомним, его суть в том, что имеется главная программа,которая вызывает другие программные модули и управляет их взаимодействием в зависимости от решаемой задачи. Мы рассмотрели в предыдущем раздалетестирование примитивных программ, под которыми понимали программы, невызывающие другие. Рассмотрим в этом разделе, как тестировать такой комплекс целиком. Существуют два подхода:1. Монолитное тестирование. Все составные части тестируются независимо друг от друга, и после завершения этого выполняется сборка всегокомплекса. Такую сборку иногда называют» «большой скачок».2. Пошаговое (или инкрементное) тестирование, где протестированныемодули тут же подключают к комплексу, тестирование и сборка выполняются параллельно.
Пошаговое тестирование может выполняться сверху — вниз, когда первым тестируется главный модуль, затем вызываемыеим модули и так далее до нижнего уровня. Для замены пока не тестированных модулей используют заглушки. Тестирование также может выполняться снизу — вверх, когда начинают с модулей самого нижнегоуровня и постепенно доходят до верхнего. Для тестирования модулей(кроме главного) разрабатывают драйверы, о которых мы уже говорили.Возможны и другие тактики тестирования.
Например, одновременносверху — вниз и снизу — вверх, и в середине встречаются.Тестирование каждого модуля выполняется рассмотренными нами вышеметодами «черного» и «белого» ящиков, но вызов функции более нижнегоуровня декомпозиции рассматривается как один оператор, который при заданных исходных данных выдает требуемый результат.Рассмотрим преимущества и недостатки этих подходов. При монолитномтестировании приходится почти для всех модулей разрабатывать как драйверы,так и заглушки, но благодаря этому можно каждый модуль всесторонне про174тестировать и можно распараллелить работу. Принципиальный недостаток: совсем не проверяются межмодульные интерфейсы, поэтому и сборка тестированных таким способом модулей называется «большой скачок», и найти местанеправильно работающих интерфейсов часто весьма трудно.При пошаговом тестировании при подключении нового модуля кроме егосамого проверяется и его интерфейс.