Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тестирование программного обеспечения.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.06 Mб
Скачать

2.4. Нагрузочные испытания

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

Следует проверить, как ведет себя программа, когда исчерпываются: различные аппаратные ресурсы: напри­мер, переполняется диск или в принтере заканчивается бумага. Посмотрите, что будет, когда в системе останется очень мало свободной памяти. Поработайте с высоко- и низкоскоростным модемами. Нагрузите технику как следует и посмотрите, что получится.

Нагрузочное тестирование — это, по сути дела, один из видов тестирования граничных условий. Схема его про­ведения абсолютно аналогична. Сначала программу запускают в условиях, в которых она должна работать (напри­мер, с максимальным количеством терминалов), а затем в условиях, для которых она не предназначена (добавляют еще один терминал). Имеет смысл проверить и различные комбинации условий. Вполне возможно, что, справив­шись с различными повышенными нагрузками по отдельности, она не выдержит их все вместе. И еще один важ­ный момент: нагрузив систему, проведите не просто один-два теста, а достаточно длительное и обстоятельное тес­тирование. Поэксплуатируйте программу в таких условиях некоторое время, возможно, сбой не сразу, но все же произойдет.

2.5. Тестирование функциональной эквивалентности

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

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

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

Везде, где возможно применить метод тестирования функциональной эквивалентности, он будет наилучшим выбором. И вот почему.

• Прежде всего, вам не придется вычислять значения вручную. Если функция сложна, это поможет сэкономить огромное количество времени и избежать ошибок, так часто возникающих при неавтоматизированных расчетах.

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

• Вполне возможно автоматизировать и весь процесс тестирования: от ввода выходных данных до сравнения выходных. Если это получится, процедура тестирования будет выполняться практически мгновенно и исключительно надежно. Даже если на сравнение потребуется много компьютерного времени, вы в это время сможете заниматься другой работой.

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

• Оцените, сколько дней потребуется на тестирование программы вручную. Включите в расчет время планирования, выполнения вычислений и проведения тестов. Не забудьте и о том, что каждый тест при­дется провести не один раз, поскольку вы будете выявлять ошибки и повторять всю процедуру тестирова­ния с самого начала. Прикиньте, сколько циклов тестирования потребуется провести. Скорее всего, их бу­дет пять или шесть. (Для сравнения можно взять среднее количество циклов, потребовавшееся компании при тестировании предыдущих разработок.)

• Оцените, сколько времени сэкономят автоматизированные средства тестирования. Снова учтите весь процесс: планирование, программирование и отладку тестировочных программ. Постарайтесь оценить необходимое время как можно более реалистично — ведь впоследствии, если работа затянется, вам придется отвечать за свои слова.

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

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

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

Предположим, что функциональное тестирование решено автоматизировать. Это означает, что можно выпол­нить гораздо больше тестов, чем вручную. Однако отбираться они должны не менее тщательно: ведь количество возможных значений входных данных, скорее всего, по-прежнему слишком велико, чтобы можно было провести абсолютно полное тестирование. У большинства функций количество возможных значений аргументов бесконечно, так что справиться с ними не под силу даже компьютеру.

Разумеется, обязательно нужно будет проверить граничные значения, но теперь можно позволить себе роскошь гораздо более обстоятельного тестирования. Как же отобрать наилучшие тесты? Чаще всего для этого применяется анализ чувствительности. Эта процедура состоит в следующем.

• Прежде всего, получают общее представление о поведении функции, вычислив ее значения для

ряда парамет­ров, располагающихся вдоль всей области определения.

• Затем ищут участки области определения, на которых небольшие изменения аргументов вызывают значи­тельные скачки результирующих значений. (Например, при приближении X к 90 градусам значение tаn(Х) резко возрастает.) Именно такие участки наиболее чреваты ошибками.

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

Рекомендется [3] равномерно разделить каждый диапазон тестируемых входных значений на ряд поддиапазонов (их может быть около сотни) и протестировать по одному значению внутри каждого из них. Например, если функция получает значения между -1 и 1, введите одно значение, лежащее межу -1 и -0,98, второе — между -0,98 и 096 и т д. После ввода каждого значения проверяйте, правильный ли получился результат, чтобы не тратить зря времени, если что-то не так.

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

Предположим, что на входном диапазоне от 0,4 до 0,46 значения функции (или их расхождение со значениями эталонной функции) резко возрастают. Разделите этот диапазон на 100 равных частей и проверьте по одному значению внутри каждой из них. Если все в порядке, вы убедитесь, что значения тестируемой и эталонной функции для всех тестируемых аргументов совпадают, а если нет, можно будет документировать ошибку.

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

Вместо разделения всей тестируемой области определения функции на определенное количество равных участков можно воспользоваться другим способом подбора входных значений — случайным Случайный выбор значений более эффективен, поскольку гарантирует их полную равноправность. Например, тестируя такую последовательность входных значений, как 0,02, 0,04, 0,06 и т.д., вы никогда не узнаете, как программа обрабатывает нечетные числа — как 0,03 или как числа с большим количеством значащих цифр, такие как 0,1415. В то же время при выборе входных значений случайным образом область определения функции покрывается гораздо более полно, все типы и диапазоны значений входных данных охватываются равномерно.

Если вы затрудняетесь в выборе методики подбора входных данных или не вполне уверены в поведении тестируемой функции, остановитесь на случайном способе. Он, прекрасно подходит и для автоматизированного тестирования.

Не имея четкого обоснования для выбора конкретных входных значений, можно компенсировать этот недостаток количеством проводимых тестов. Здесь нет никаких ограничений — чем больше тестов проводится для каждого из классов эквивалентности, тем лучше Обычно при автоматизированном тестировании со случайными входными значениями мы проводим как минимум 1000 вычислений.

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

"Случайный" ввод вовсе не означает "все, что приходит в голову", иначе он будет слишком предвзятым, чтобы претендовать на равномерный охват области определения функции. Здесь больше подойдут таблицы случайных чисел, а еще лучше — компьютерная программа, которая может генерировать такие числа в неограниченном количестве. Однако следует иметь в виду, что алгоритмы, используемые многими подобными программами, вовсе не случайны. Кроме того, нередко в программах даже базовый алгоритм реализован не точно. Поэтому, прежде чем выбрать конкретный генератор случайных чисел, даже написанный вполне авторитетной компанией или встроенный в один из стандартных языков программирования, необходимо выяснить, какой алгоритм положен в основу его работы и подходит ли он для ваших нужд. То, что годится простенькой программке, рисующей на экране разноцветный салют, может совершенно не подойти для профессионального тестирования сложных инженерных программ. Нередко генераторы случайных числе повторяют их последовательность через определенный интервал — например, после каждых 65 535 чисел все начинается с начала.

Несколько советов для проведения тестирования программ, мспользующих генератор случайных чисел:

• Перед тем как приступить к тестированию, почитайте литературу о генераторах случайных

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

• Если вы собираетесь воспользоваться генератором случайных чисел, встроенным в язык

программирования, стоит его немного доработать. Сгенерировав с его помощью достаточно

большое количество чисел (100-1000), перемешайте их: измените их порядок с помощью, после

дующих чисел, выдаваемых этим же генератором. Хотя это и замедлит работу, зато результат в

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

• Если выбранный вами язык программирования умеет работать c целыми числами большой

разрядности (но не с плавающей запятой), имеет смысл написать собственный генератор,

алгоритм работе которого будет таким.

R[N+1] = (А * R[N] + С) mod M

Это означает, что для получения N+1-го числа из N-ro нужно умножить его на А, добавить С, а результат взять по модулю М. Чем больше будет число М, тем лучше, хотя вычисления будут выполняться и медленнее. Хорошие значения параметров этого метода приведены на рис. 15.

Значение параметра С не является критическим, достаточно, чтобы оно было нечетным. Однако, подбирая его более тщательно, можно уменьшить взаимную корреляцию генерируемых значений.

M

A

C

232

69069

Нечётное число

232

1664525

Нечётное число

235

17059465

Нечётное число

240

37182819621

3

240

8413453205

99991

248

31167285

Нечётное число

264

636413622384679300

Нечётное число

Рис. 14. Параметры некоторых известных генераторов случайных чисел