КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Организация тестирования ПО. Критерии завершения тестирования.Организация процесса тестирования.Разработка ПО в значительной степени есть процесс передачи информации о конечной программе и перевода этой информации из одной формы в другую. Кроме того, подавляющее число ошибок ПО вызвано дефектами организации работ, недостаточным взаимопониманием и искажениями в процессе передачи и перевода информации. Путем повышения четкости самого процесса разработки можно избежать появления многих ошибок. Это приводит к тому, что в конце каждого этапа необходимо включение отдельного шага проверки, имеющего целью локализовать наибольшее число ошибок до перехода к следующему этапу. Например, спецификация проверяется путем ее сравнения с выходным результатом предыдущей стадии, а каждая обнаруженная ошибка возвращается для устранения в процесс разработки спецификаций. Кроме того, конкретные процессы тестирования должны быть ориентированы на конкретные этапы разработки. Это сосредотачивает каждый процесс тестирования на каком-либо шаге перевода, в результате чего фиксируется определенный класс ошибок. Соотношение между процессами разработки и тестирования. Собственно процесс тестирования начинается с проверки исходного кода. Для этого применяются методы статического тестирования. Далее следует тестирование модулей, ориентированное на проверку соответствия спецификациям интерфейса модулей, а также тестирование сопряжения и результатов сборки модульной структуры, ориентированное на проверку соответствия проекту системы и (или) проекту структуры отдельной программы. После этого появляется тестирование функций, которое заключается в поиске различий между программой и ее внешней спецификацией. При тестировании функций обычно применяются методы функционального тестирования. При этом предполагается, что на более раннем этапе тестирования модулей требуемый критерий покрытия логики, свойственный методам структурного тестирования, удовлетворяется. Для сопоставления результатов разработки с исходными целями появляется процесс комплексного тестирования или, как его еще называют, тестирование системы, в котором проверяется все ПС как единое целое. При рассмотрении различий между полученными результатами и исходными целями разработки ПО наибольшее внимание уделяется выявлению ошибок перевода, возникающих в процессе разработки внешней спецификации. Это делает комплексное тестирование жизненно важным, так как именно на этом этапе обнаруживается больше всего серьезных ошибок. Процесс тестирования завершают испытания ПО. Испытания позволяют проверить полноту решения функциональных задач, их качество и соответствие ПО технической документации. Тестирование системы.В отличие от тестирования функций, внешнюю спецификацию нельзя использовать как базис для получения тестов системы, поскольку это противоречит цели проведения такого тестирования. С другой стороны, документ, отражающий цели системы как таковой (в нашем случае - это техническое задание), нельзя использовать для формирования ее тестов, так как он по определению не содержит точных описаний. Проблема разрешается применением эксплуатационной пользовательской документации. Тесты системы проектируются на основе анализа ее целей по результатам изучения пользовательской документации. Такая практика позволяет сравнить не только программы с исходным документом, но и результаты ее функционирования с пользовательской документацией, а также пользовательскую документацию с исходным документом. Существует несколько категорий тестов, каждая из которых направлена на проверку определенных целей. К ним относятся тестирование полноты реализации, тестирование на предельных объемах, тестирование на предельных нагрузках, тестирование удобства эксплуатации, тестирование защиты, тестирование конфигурации оборудования, тестирование совместимости, тестирование надежности, тестирование восстановления, тестирование удобства обслуживания, тестирование удобства установки и тестирование документации. Тестирование полноты реализации является наиболее очевидным видом тестирования системы, который заключается в проверке выполнения каждого пункта исходного документа. Процедура проверки состоит в последовательном просмотре исходного документа - предложение за предложением. Если предложение содержит конкретную задачу, то определяют, выполняет ли программа эту задачу. Тестирование на предельных объемах заключается в выполнении программы на больших объемах данных, желательно превышающих предлагаемый эксплуатационный объем. Например, на вход компилятора в качестве теста подают большую исходную программу, на вход редактора связей -программу, содержащую тысячу модулей, а на вход программы моделирования электронных схем - схему, содержащую тысячи компонентов. Цель тестирования на предельных объемах - показать, что программа не может управлять объемом данных, специфицированным в исходных целях. Тестирование на предельных нагрузках обусловлено тем, что потребность в ресурсах памяти и быстродействии в процессе решения задачи на ЭВМ значительно изменяется в зависимости от состава объема исходных данных. При высокой интенсивности ввода исходных данных может нарушаться временной баланс между длительностью решения совокупности задач ПО в реальном времени и реальной производительностью ЭВМ при решении этих задач. Цель тестирования на предельных нагрузках показать, что ПО не удовлетворяет целям в области эффективности. Тестирование удобства эксплуатации заключается в выявлении психологических (пользовательских) проблем, возникающих при эксплуатации. При этом тестировании следует установить, как минимум, следующее.
Тестирование защиты заключается в проверке обеспечения защиты информации от несанкционированного доступа. Для тестирования защиты важно построить тесты, которые нарушают программные средства защиты. Одним из путей разработки подобных тестов является изучение известных проблем защиты в подобных существующих системах и построении тестов, которые позволяют проверить, как решаются аналогичные проблемы в тестируемой системе. Тестирование конфигурации оборудования обусловлено тем, что операционные системы, СУБД и коммуникационные системы должны поддерживать множество конфигураций оборудования (например, различные типы и число устройств ввода-вывода и линий связи, различные объемы памяти и т.п.). Часто число возможных конфигураций слишком велико, чтобы проверить ПО на каждой из них. Однако программу следует тестировать по крайней мере с каждым типом оборудования при минимальной и максимальной конфигурациях. Если можно изменять конфигурацию самого ПО, то необходимо тестировать все возможные его конфигурации. Тестирование совместимости вызвано тем, что большинство разрабатываемого ПО не является полностью новым. Часто оно заменяет несовершенные, устаревшие системы обработки информации или неавтоматизированные процессы. Поэтому при разработке ПО необходимо обеспечить совместимость со средой, в которой работали заменяемые системы, и если необходимо, создать процедуры конверсии, обеспечивающие переход от одного метода обработки данных к другой. В этом случае, как и при других формах тестирования, тесты должны быть ориентированы на проверку обеспечения совместимости и работы процедуры конверсии. Назначение всех видов тестирования - повысить надежность ПО, но если в исходном документе, отражающем цели проекта, есть особые указания, например, обеспечить определенное время наработки на отказ или задано допустимое число ошибок, то необходимо провести исследование тестируемого ПО на удовлетворение этих требований. Для этого служит тестирование надежности. Дня проведения этого вида тестирования существует ряд математических моделей надежности. Далее, в разделе, посвященном критериям завершения тестирования, будут рассмотрены две модели надежности: так называемая модель Милса и простая интуитивная модель. Для операционной системы, СУБД и средств телекоммуникации часто определяется, как система должна восстанавливать свою работоспособность после программных ошибок, неисправностей аппаратуры и ошибок в данных. При тестировании системы требуется показать, что эти функции не выполняются. Для этого служит тестирование восстановления. Для этого можно намеренно ввести в систему программные ошибки, чтобы проверить, восстановится ли она после их устранения. Неисправности аппаратуры можно промоделировать. Ошибки в данных (помехи в линиях связи или неправильные значения указателей в базе данных) можно намеренно создать или промоделировать. В исходном документе иногда формируются специальные цели удобства обслуживания или сопровождения ПО. Они могут определять средства обслуживания, которыми должно снабжаться ПО (например, программы выдачи дампов памяти, программы диагностики и т.п.), среднее время нахождения ошибки, процедуры, связанные с сопровождением, и качество до кум стации о внутренней логике программы. Естественно, все эти цели должны быть протестированы. Для этого применяется тестирование удобств обслуживания. Цель тестирования удобства установки - показать, что не удовлетворяются цели по части настройки ПО на конкретные условия эксплуатации. В проверку системы входит и проверка точности пользовательской документации. Большая часть этой проверки происходит при определении правильности представления предшествующих тестов системы. Кроме этого, пользовательская документация должна быть подвергнута инспекции на предмет ее точности и ясности, аналогично инспекциям исходного текста. Любые примеры, приведенные в документации, должны быть оформлены как тест и проверены на ПО. Критерии завершения тестирования.При проведении тестирования встает вопрос о том, когда следует закончить тестирование программы, поскольку не представляется возможным определить, является ли выявленная ошибка последней. В основном на практике придерживаются следующих двух критериев: когда время, отведенное по графику работ на тестирование, истекло; когда все тесты оказались неудачными, то есть были выполнены без выявления ошибок. Оба эти критерия недостаточно точны и логичны, так как первый критерий не содержит оценки качества тестирования и ему можно удовлетворить, ничего не делая, второй же не зависит от качества тестовых наборов данных. Однако второй критерий можно улучшить, если ориентироваться на определенные методологии проектирования тестов. Например, можно определить условие завершения тестирования модуля с помощью тестов, получаемых двумя путями: удовлетворением комбинаторному покрытию условий и методу анализа граничных значений по спецификации интерфейса модуля. Все получающиеся тесты в конце концов должны стать неудачными. Завершение тестирования функций можно определить при выполнении следующих условий: тесты, получаемые методами функциональных диаграмм; эквивалентного разбиения и анализа граничных значений должны стать неудачными. Однако эти критерии, во-первых, бесполезны на той фазе тестирования, когда определенные методы становятся непригодными, например, на фазе тестирования системы; во-вторых, такое измерение субъективно, т.к. нет гарантии, что данный специалист использовал нужную методологию правильно и точно; в-третьих, чтобы поставить цель и дать возможность выбора наиболее подходящего пути ее достижения, рассмотренные критерии предписывают использование конкретных методов, но не ставят цели. Иногда используют критерий, основанный в значительной степени на здравом смысле и информации о количестве ошибок, полученных в процессе тестирования. Для этого строят графики зависимости количества ошибок и времени их появления. По форме полученной кривой и определяют, стоит ли продолжать тестирование или нет. На рисунке приведены примеры графиков зависимости количества ошибок от продолжительности тестирования. Зависимость количества ошибок от продолжительности тестирования. Из примера видно, что если время тестирования велико и с увеличением времени тестирования число ошибок растет, то, естественно, тестирование следует продолжить. Если в процессе тестирования в определенный момент наступило снижение числа выявления ошибок, если число выявленных ошибок постепенно стремится к нулю или достигло нуля, то понятно, что процесс тестирования можно завершить. Однако этот критерий тоже недостаточно эффективен, поскольку нет никакой уверенности в том, что в последнем случае в дальнейшем не последует увеличения числа обнаруживаемых ошибок. Возможен еще один подход к определению критерия завершения тестирования. Поскольку цель тестирования - поиск ошибок, то в качестве критерия можно выбрать некоторое заранее установленное число ошибок, соответствующее некоторой части от предполагаемого общего числа ошибок. Однако с применением этого критерия связан ряд проблем. Во-первых, необходимо оценить общее число ошибок в программе. Во-вторых, требуется выяснить, какой процент этих ошибок можно определить тестированием. И, наконец, нужно определить, какая именно часть ошибок возникла в процессе проектирования и во время каких фаз тестирования целесообразно их выявлять. Для оценки общего числа ошибок и выявления возможного процента ошибок, который можно обнаружить тестированием, можно воспользоваться методами, применяемыми при определении показателей надежности (модели надежности), например, с помощью модели Миллса или простой интуитивной модели, которые мы рассмотрим немного позже. Другой способ получения такой оценки основан на статических средних величинах, широко применяемых в промышленности. Например, число ошибок, которое существует в типичных программах, по времени завершения кодирования (до проведения сквозного просмотра или инспекции) составляет примерно 4 - 8 на 100 операторов программы. Модель Миллса основывается на внесении в программу ошибок с целью оценки в ходе тестирования числа остаточных ошибок, реально содержащихся в программе. Проверяя программу в течение некоторого времени и отсортировывая внесенные ошибки от собственно находящихся в программе, можно оценить число первоначально содержащихся в программе ошибок и число ошибок, оставшихся к моменту оценки. Если в программу внесено случайным образом S ошибок, при проверке обнаружено n+V ошибок (n – число найденных собственных ошибок; V – число найденных внесенных ошибок), то предполагаемое число первоначально находящихся в программе собственных ошибок может быть рассчитано по формуле: . Например, при обнаружении 20 собственных и 10 привнесенных ошибок, при общем числе первоначально внесенных ошибок, равном 25, значение N=25*20/10 = 50; т.е. на данном этапе предполагается, что в программе имелось 50 собственных ошибок и тестирование должно быть продолжено. Оценку числа N можно проводить после каждого нового обнаружения ошибок. Программа должна отлаживаться до тех пор, пока не будут обнаружены все внесенные ошибки. В момент обнаружения внесенных ошибок можно определить уровень доверия C, указывающий вероятность того, что оценка правильна: где k - предполагаемое число собственных ошибок, S - число внесенных ошибок, n - число обнаруженных собственных ошибок. Например, если утверждать, что в программе нет ошибок (k=0), и при внесении в программу 6 ошибок все они были обнаружены, а собственные ошибки обнаружены не были, то C=6/(6 + 0 + 1)=0,86. С другой стороны, чтобы достичь уровня доверия в 0,98 в программу необходимо ввести 39 ошибок: C=39/(39 + 0 + 1)=0,98. Модель Миллса не лишена ряда недостатков, самые существенные из которых - это необходимость внесения искусственных ошибок (этот процесс плохо формализуем) и достаточно вольное допущение величины k (число собственных ошибок), которое основывается исключительно на интуиции человека, проводящего оценку, т.е. допускает большое влияние субъективного фактора. Простая интуитивная модель предполагает проведение тестирования двумя группами программистов независимо друг от друга, использующими независимые тестовые наборы. В процессе тестирования каждая из групп фиксирует все найденные ею ошибки. При оценке числа оставшихся в программе ошибок результаты тестирования обеих групп собираются и сравниваются. Получается, что первая группа обнаружила N1 ошибок, вторая – N2 ошибок, а N12 - это ошибки, обнаруженные обеими группами. Если обозначить через N неизвестное количество ошибок, присутствующих в программе до начала тестирования, то можно эффективность тестирования каждой из групп определить как Предполагая, что возможность обнаружения всех ошибок одинакова для обеих групп, можно допустить, что, если первая группа обнаружила определенное количество всех ошибок, она могла бы определить то же количество любого случайным образом выбранного подмножества. В частности, можно допустить, что Значение N12 известно, а E1 и Е2 можно определить как N12/N1 и N12/N2 . Таким образом, неизвестное количество ошибок в про1рамме можно определить по формуле: Развивая эту модель и опираясь на предположения, что обе группы, проводящие тестирование, имеют равную вероятность обнаружения "общих" ошибок, ее можно рассчитать по следующей формуле: где P(N12i) - вероятность обнаружения N12 "общих" ошибок тестирования программы двумя независимыми группами. Определение ошибок, возникающих в процессе проектирования, использует данные, свидетельствующие о том, что в большом ПО примерно 40% всех ошибок составляют ошибки проектирования логики и кодирования, а остальные сделаны на более ранних этапах проектирования. Исходя из этого, рассмотрим пример. Допустим, что тестируется программа размером 1000 операторов; число ошибок, остающихся после инспекции исходного текста, оценивается в 5 на 100 операторов. Цель тестирования - обнаружить 98% ошибок кодирования и логики и 95% ошибок проектирования. Общее число ошибок составляет 500. Предполагается, что 200 из них составляют ошибки кодирования и логики, а 300 - ошибки проектирования. Следовательно, требуется найти 196 ошибок кодирования и логики и 285 ошибок проектирования. Из соображений здравого смысла логично так распределить процентное отношение найденных ошибок по этапам тестирования, как показано в таблице. Процентное отношение найденных ошибок по этапам тестирования.
Исходя из этих чисел, можно определить следующие критерии.
Другая очевидная проблема для этого вида критериев - это проблема переоценки. Что если в приведенном примере к моменту начала проверки функций остается менее 240 ошибок? Основываясь на данном критерии, завершить фазу проверки функций не удается никогда. Во избежание такой ситуации критерий числа ошибок следует дополнить промежутком времени, в течение которого они должны быть обнаружены. В этом случае, если ошибки найдены быстро, то тестирование на определенном этапе следует продолжать до завершения заданного интервала времени. Если же возникает переоценка, т.е. время прошло, а заданное количество ошибок не обнаружено, то следует пригласить незаинтересованного эксперта, который выскажет свое мнение о причинах возникновения проблемы: либо тесты не эффективны, либо тесты удачны, но в программе действительно мало ошибок. Наилучшим критерием завершения тестирования является комбинация всех трех рассмотренных подходов. Для тестирования модулей оптимальным будет первый рассмотренный критерий, потому что в большинстве проектов на этой фазе не следят за числом обнаруженных ошибок, здесь важно, чтобы использовался определенный набор методов проектирования тестов. На фазах тестирования функций и системы критерием завершения может служить останов по достижении заданного числа обнаруженных ошибок или достижение момента, определенного графиком работ, при условии, что анализ зависимости числа ошибок от времени тестирования покажет снижение продуктивности.
|