Главная страница
Навигация по странице:

  • 1 9 6

  • Прогнозирование ошибок

  • 7: Разработка тестов

  • Тестирование функциональной эквивалентности: автоматизация, анализ чувствительности и случайный ввод

  • Автоматизация тестирования функциональной эквивалентности

  • Анализ чувствительности

  • Случайный ввод

  • Что такое генератор случайных чисел

  • Тестирование-книга. Ю. Н. Артеменко Научный редактор


    Скачать 6.27 Mb.
    НазваниеЮ. Н. Артеменко Научный редактор
    Дата09.10.2019
    Размер6.27 Mb.
    Формат файлаpdf
    Имя файлаТестирование-книга.pdf
    ТипКнига
    #89291
    страница17 из 49
    1   ...   13   14   15   16   17   18   19   20   ...   49
    Глава 7: Разработка тестов 1 9 5
    другое состояние, проверьте ее реакцию на действия пользователя, запро­
    сы системы или наступление ожидаемого события на границах интервала тайм-аута. Что, если событие произойдет за секунду до того, как программа должна прекратить его ожидание, или через секунду после этого.
    Протестируйте систему при повышенной нагрузке. В мультизадачной среде запустите побольше других программ и посмотрите, как поведет себя ваша — успешно ли она справится со своей работой. Отправьте большой файл на принтер, чтобы процессор все время переключался на обслужива­
    ние печати. Перейдите на компьютер с меньшей тактовой частотой и мень­
    шим объемом памяти, с менее быстродействующей дисковой системой.
    Подключите побольше внешних устройств и заставьте их генерировать пре­
    рывания так часто, как только удастся. Короче говоря, замедлите и нагру­
    зите компьютер, насколько это возможно. В результате ваша программа будет выполняться медленнее, и, быстро вводя данные, можно попробовать превысить ее возможности приема. Если в нормальном режиме работы сбоя программы добиться не удастся, это может получиться при повышенной нагрузке.
    Выполняя "стандартное" тестирование программы на медленной техни­
    ке или при сильно повышенной нагрузке, можно столкнуться с совершенно неожиданными ситуациями гонок. И если окажется, что программа в этом отношении уязвима, необходимо будет провести в таких условиях полный цикл тестирования. Не поддавайтесь на убеждения руководителя проекта, который скажет, что вы напрасно тратите время на неадекватные тесты и что пользователи никогда не будут эксплуатировать программу в подобном режиме. Еще как будут] Пользователи будут работать на дешевых маломощ­
    ных компьютерах. Даже на этих компьютерах они будут запускать програм­
    мы параллельно, причем большие программы. Поэтому ваша задача — обеспечить такую надежность разрабатываемого программного обеспече­
    ния, чтобы оно работало, пусть медленно, но без сбоев в любой системе и при любых дополнительных нагрузках. И по крайней мере, необходимо совершенно точно выяснить, какие конфигурации системы являются пре­
    дельными для его эксплуатации.
    Если окажется, что производительность программного обеспечения в определенной программно-аппаратной среде явно неудовлетворительна и в такой среде его будет эксплуатировать, по крайней мере, часть пользова­
    телей, об этом стоит составить отдельный отчет. Отчет лучше всего ввес­
    ти в базу данных в другой день, чтобы он хранился отдельно от отчетов о сбоях при повышенных нагрузках или на чересчур медленной технике. Так ему наверняка будет уделено больше внимания, чем если руководитель проекта просмотрит его вместе с другими похожими, но гораздо менее важными отчетами.

    1 9 6 Часть II: Приемы и технологии тестирования
    Нагрузочные испытания
    Важно не забыть протестировать те ограничения возможностей про­
    граммного продукта, которые определены в его документации. Проверьте размеры файлов, с которыми программа может работать, количество прин­
    теров, терминалов, модемов, которыми она может управлять, объем необ­
    ходимой ей памяти. Откройте максимальное количество файлов или других структур данных, с которым программа может работать, попробуйте по­
    дольше поэксплуатировать ее в таком состоянии. Если в документации ограничения не описаны, но существуют логически допустимые значения каких-либо параметров, проверьте и их. И если программа не справится с достаточно большим числом, которое пользователь вполне может ввести, составьте отчет об ошибке. Если же программа спокойно принимает и об­
    рабатывает и очень маленькие, и очень большие значения параметров, возможно, ограничений на них и в самом деле нет.
    Следует проверить, как ведет себя программа, когда исчерпываются различные аппаратные ресурсы: например, переполняется диск или в прин­
    тере заканчивается бумага. Посмотрите, что будет, когда в системе останет­
    ся очень мало свободной памяти. Поработайте с высоко- и низкоскоростным модемами. Нагрузите технику как следует и посмотрите, что получится.
    Нагрузочное тестирование — это, по сути дела, один из видов тестиро­
    вания граничных условий. Схема его проведения абсолютно аналогична.
    Сначала программу запускают в условиях, в которых она должна работать
    (например, с максимальным количеством терминалов), а затем в условиях, для которых она не предназначена (добавляют еще один терминал). Име­
    ет смысл проверить и различные комбинации условий. Вполне возможно, что, справившись с различными повышенными нагрузками по отдельнос­
    ти, она не выдержит их все вместе. И еще один важный момент: нагрузив систему, проведите не просто один-два теста, а достаточно длительное и обстоятельное тестирование. Поэксплуатируйте программу в таких условиях некоторое время, возможно, сбой не сразу, но все же произойдет.
    Прогнозирование ошибок
    Иногда тестировщик предполагает, что определенный класс тестов вызовет сбой программы, хотя и не может этого логически обосновать.
    Доверяйте своей интуиции и обязательно включайте подобные тесты в общий план. Существует целый ряд ситуаций и значений, которые, хотя и не являются граничными, но частенько вызывают программные сбои.
    Типичным примером таких значений является 0. Не стоит тратить время на поиски обоснований того, почему определенное входное значение или место программы кажется вам подозрительным. Просто протестируйте его.
    Глава 7: Разработка тестов 1 9 7
    Случается, что в сложных ситуациях интуиция подсказывает гораздо лучшую тактику тестирования, чем тривиальная логика. Бывает, что сраба­
    тывает и ассоциативная связь: вы уже находили ошибку в подобных обсто­
    ятельствах, хотя можете этого даже не помнить. Как бы там ни было, доверяйте своему внутреннему чувству и учитесь к нему прислушиваться: с опытом оно будет становиться все более развитым и надежным.
    Тестирование функциональной
    эквивалентности: автоматизация,
    анализ чувствительности и
    случайный ввод
    При тестировании функциональной эквивалентности сравниваются ре­
    зультаты вычислений разными программами одной и той же математичес­
    кой функции. Этот термин не имеет ничего общего с классами эквивалентности. Если обе программы при вычислении одной и той же функции дают одинаковые результаты, значит, в них применены эквива­
    лентные методы вычислений.
    Предположим, что тестируется программа, которая вычисляет матема­
    тическую функцию и печатает результат. Это может быть простая тригоно­
    метрическая функция или гораздо более сложная, инвертирующая матрицу или возвращающая коэффициенты для построения кривой, отражающей некоторый набор данных. Обычно в таких случаях можно найти другую программу, выполняющую те же действия, и при этом достаточно надеж­
    ную и проверенную временем. Обеим программам предлагается обработать одинаковые наборы входных данных, и, если результаты совпадут, значит, тестируемая программа работает правильно.
    Автоматизация тестирования функциональной
    эквивалентности
    Везде, где возможно применить метод тестирования функциональной эквивалентности, он будет наилучшим выбором. И вот почему.
    • Прежде всего, вам не придется вычислять значения вручную. Если функция сложна, это поможет сэкономить огромное количество времени и избежать ошибок, так часто возникающих при неавтома­
    тизированных расчетах.
    • Процесс сравнения также, скорее всего, удастся автоматизировать.
    Простейшим способом может быть вывод результатов расчетов в файлы и их последующее сравнение с помощью соответствующей

    1 9 8 Часть II: Приемы и технологии тестирования
    программы. Компьютер выполнит сравнение файлов и быстрее, и аккуратнее, чем вы. Можно определить и допустимые расхождения результатов — например, погрешности округлений.
    • Вполне возможно автоматизировать и весь процесс тестирования: от ввода выходных данных до сравнения выходных. Если это получит­
    ся, процедура тестирования будет выполняться практически мгно­
    венно и исключительно надежно. Даже если на сравнение потребуется много компьютерного времени, вы в это время сможе­
    те заниматься другой работой.
    Хотя автоматизация подобных тестов — процесс не особенно сложный, он требует некоторого времени. Если программа может считать входные данные из файла, его необходимо подготовить. Кроме того, придется на­
    писать небольшие программки, выполняющие сравнение результатов.
    Если обе программы ориентированы на ручной ввод данных, автомати­
    зировать их тестирование будет несколько сложнее. Для эмуляции клави­
    атурного ввода в некоторых случаях удается использовать модем. Одна программа передает через модем данные другой, а та думает, что они по­
    ступают с клавиатуры. Несколько неуклюже, но это работает.
    Разумеется, тестирование функциональной эквивалентности может потребовать некоторых затрат. Прежде всего, надежная эталонная програм­
    ма, которая будет использоваться для сверки результатов, может оказать­
    ся не такой уж дешевой. К тому же, скорее всего, придется написать кое-какие программки. Может потребоваться и дополнительная техника, например второй компьютер. Разумеется, нельзя определить универсальные критерии того, сколько денежных средств имеет смысл потратить на про­
    ведение подобного тестирования. Однако мы настоятельно советуем не пренебрегать им без веских причин.
    • Оцените, сколько дней потребуется на тестирование программы вручную. Включите в расчет время планирования, выполнения вы­
    числений и проведения тестов. Не забудьте и о том, что каждый тест придется провести не один раз, поскольку вы будете выявлять ошиб­
    ки и повторять всю процедуру тестирования с самого начала. При­
    киньте, сколько циклов тестирования потребуется провести. Скорее всего, их будет пять или шесть. (Для сравнения можно взять сред­
    нее количество циклов, потребовавшееся компании при тестирова­
    нии предыдущих разработок.)
    • Оцените, сколько времени сэкономят автоматизированные средства тестирования. Снова учтите весь процесс: планирование, программи­
    рование и отладку тестировочных программ. Постарайтесь оценить необходимое время как можно более реалистично — ведь впослед­
    ствии, если работа затянется, вам придется отвечать за свои слова.
    Глава 7: Разработка тестов 1 9 9
    • Количество дней, которые предполагается сэкономить, умножьте на свой двойной оклад. Сумма оклада умножается на два потому, что в расчет берется еще и выгода, которую компания получает от уско­
    рения процесса тестирования и повышения его надежности. Если ваша оценка верна, полученная сумма — это минимум того, что можно сэкономить при функциональном тестировании с помощью эталонной программы. И если сама программа стоит меньше этой суммы, любой разумный руководитель одобрит ее покупку.
    • Подготовьте предложение и презентацию, поясняющую назначение покупаемой эталонной программы и основы расчетов. Если компа­
    ния не настолько заинтересована в сокращении времени разработ­
    ки, чтобы вкладывать в нее дополнительные средства, будьте готовы рассказать о том, что вложенные средства гарантированно окупятся благодаря надежности и качеству продукта.
    Анализ чувствительности
    Предположим, что функциональное тестирование решено автоматизи­
    ровать. Это означает, что можно выполнить гораздо больше тестов, чем вручную. Однако отбираться они должны не менее тщательно: ведь коли­
    чество возможных значений входных данных, скорее всего, по-прежнему слишком велико, чтобы можно было провести абсолютно полное тестирова­
    ние. У большинства функций количество возможных значений аргументов бесконечно, так что справиться с ними не под силу даже компьютеру.
    Разумеется, обязательно нужно будет проверить граничные значения, но теперь можно позволить себе роскошь гораздо более обстоятельного тести­
    рования. Как же отобрать наилучшие тесты? Чаще всего для этого приме­
    няется анализ чувствительности. Эта процедура состоит в следующем.
    • Прежде всего, получают общее представление о поведении функции, вычислив ее значения для ряда параметров, располагающихся вдоль всей области определения.
    • Затем ищут участки области определения, на которых небольшие изменения аргументов вызывают значительные скачки результиру­
    ющих значений. (Например, при приближении X к 90 градусам значение tan(X) резко возрастает.) Именно такие участки наиболее
    чреваты ошибками.
    • Значения, полученные в результате теста программируемой функции и ее эталона, могут не вполне совпадать. Если в процессе расчетов выполняются операции с плавающей запятой, неизбежны округле­
    ния или усечения результатов, а значит, и небольшие расхождения.
    Обычно это не страшно. Необходимо только правильно оценить допу­
    стимые погрешности округлений, чтобы можно было зафиксировать превышающие их расхождения, вызванные иными причинами.

    2 0 0 Часть II: Приемы и технологии тестирования
    Мы рекомендуем равномерно разделить каждый диапазон тестируемых входных значений на ряд поддиапазонов (их может быть около сотни) и протестировать по одному значению внутри каждого из них. Например, если функция получает значения между -1 и 1, введите одно значение, лежащее межу -1 и -0,98, второе — между -0,98 и 096 и т.д. После ввода каждого значения проверяйте, правильный ли получился результат, чтобы не тратить зря времени, если что-то не так.
    Получив общую картину поведения функции, проанализируйте его на предмет резких перемен. Если значения функции на отдельных участках области ее определения резко возрастают или уменьшаются либо наблюда­
    ются разрывы и скачки, на них необходимо обратить более пристальное внимание.
    Предположим, что на входном диапазоне от 0,4 до 0,46 значения фун­
    кции (или их расхождение со значениями эталонной функции) резко воз­
    растают. Разделите этот диапазон на 100 равных частей и проверьте по одному значению внутри каждой из них. Если все в порядке, вы убедитесь, что значения тестируемой и эталонной функции для всех тестируемых аргументов совпадают, а если нет, можно будет документировать ошибку.
    При профессиональном тестировании математических функций не обойтись без некоторых знаний из теории вероятности. Если речь идет не об одной, а о целом ряде функций, необходимы боле эффективные и на­
    учно обоснованные технологии поиска критических участков области оп­
    ределения функции — тех, где ее значения резко меняются или отличаются от эталонных. Их описания можно найти в специальной литературе. Для начала подойдет книга Бека и Арнольда (Beck & Arnold 1977). Кроме того, мы рекомендуем работы таких авторов, как Бард (Bard, 1974) и Чамберс
    (Chambers, 1977).
    Случайный ввод
    Вместо разделения всей тестируемой области определения функции на определенное количество равных участков можно воспользоваться другим способом подбора входных значений — случайным. Случайный выбор значений более эффективен, поскольку гарантирует их полную равноправ­
    ность. Например, тестируя такую последовательность входных значений, как 0,02; 0,04; 0,06 и т.д., вы никогда не узнаете, как программа обрабаты­
    вает нечетные числа — как 0,03 или как числа с большим количеством значащих цифр, такие как 0,1415. В то же время при выборе входных зна­
    чений случайным образом область определения функции покрывается го­
    раздо более полно, все типы и диапазоны значений входных данных охватываются равномерно.
    Если вы затрудняетесь в выборе методики подбора входных данных или не вполне уверены в поведении тестируемой функции, остановитесь на
    Глава 7: Разработка тестов 2 0 1
    случайном способе. Он прекрасно подходит и для автоматизированного тестирования.
    Не имея четкого обоснования для выбора конкретных входных значе­
    ний, можно компенсировать этот недостаток количеством проводимых тестов. Здесь нет никаких ограничений — чем больше тестов проводится для каждого из классов эквивалентности, тем лучше. Обычно при автома­
    тизированном тестировании со случайными входными значениями мы проводим как минимум 1000 вычислений.
    Что такое генератор случайных чисел
    "Случайный" ввод вовсе не означает "все, что приходит в голову", иначе он будет слишком предвзятым, чтобы претендовать на равномерный охват области определения функции. Здесь больше подойдут таблицы слу­
    чайных чисел, а еще лучше — компьютерная программа, которая может генерировать такие числа в неограниченном количестве. Однако следует иметь в виду, что алгоритмы, используемые многими подобными програм­
    мами, вовсе не случайны. Кроме того, нередко в программах даже базовый алгоритм реализован не точно. Поэтому, прежде чем выбрать конкретный генератор случайных чисел, даже написанный вполне авторитетной компа­
    нией или встроенный в один из стандартных языков программирования, необходимо выяснить, какой алгоритм положен в основу его работы и подходит ли он для ваших нужд. То, что годится простенькой программке, рисующей на экране разноцветный салют, может совершенно не подойти для профессионального тестирования сложных инженерных программ.
    Нередко генераторы случайных чисел повторяют их последовательность через определенный интервал — например, после каждых 65 535 чисел все начинается с начала.
    Подробный рассказ о теории генераторов случайных чисел в задачи этой книги не входит. На эту тему имеется достаточно литературы, и, в частности, можно прочитать работы таких авторов, как Канер и Воуки
    (Kaner & Vokey, 1984) и Кнут (Knuth, 1981). Однако несколько советов и предложений вам все же пригодятся.
    • Перед тем как приступить к тестированию, почитайте литературу о генераторах случайных чисел. Не доверяйте какой-либо программе просто потому, что она у вас уже есть, а другую еще придется поискать.
    Продолжайте чтение до тех пор, пока нижеследующие предложения не покажутся вам вполне понятными. Не обязательно ими пользо­
    ваться, но, если вы не можете их даже понять, значит, знаете о предметной области еще слишком мало, чтобы принимать самосто­
    ятельные решения. И может оказаться, что, потратив время на те­
    стирование, вы вдруг выясните, что оно проводилось некорректно, поскольку входные данные были вовсе не случайными.

    2 0 2 Часть II: Приемы и технологии тестирования
    • Если вы собираетесь воспользоваться генератором случайных чисел, встроенным в язык программирования, стоит его немного дорабо­
    тать. Сгенерировав с его помощью достаточно большое количество чисел (100-1000), перемешайте их: измените их порядок с помощью последующих чисел, выдаваемых этим же генератором. Хотя это и замедлит работу, зато результат в случае плохого исходного генера­
    тора может быть уже вполне приемлемым.
    • Если выбранный вами язык программирования умеет работать с целыми числами большой разрядности (но не с плавающей запятой), имеет смысл написать собственный генератор, алгоритм работы которого будет таким.
    R[N+1] = (А * R[N] + С) mod M
    Это означает, что для получения N+1-го числа из N-гo нужно ум­
    ножить его на А, добавить С, а результат взять по модулю М. Чем больше будет число М, тем лучше, хотя вычисления будут выпол­
    няться и медленнее. Хорошие значения параметров этого метода приведены на рис. 7.3.
    Значение параметра С не является критическим, достаточно, чтобы оно было нечетным. Однако, подбирая его более тщательно, можно уменьшить взаимную корреляцию генерируемых значений. Значение
    М=2 40
    взято из книги Канера и Воуки (Каnеr & Vokey, 1984), осталь­
    ные — у Кнута (Knuth, 1981). Чтобы показать, насколько важен тща­
    тельный подбор параметров, Канер и Воуки протестировали более 30 тысяч значений параметра А и около сотни значений параметра С.
    1   ...   13   14   15   16   17   18   19   20   ...   49


    написать администратору сайта