Верификация по требованиям и покрытие программного кода
Верификация по требованиям и покрытие программного кода С.В.Синицын НИЯУ МИФИ
При обучении верификации программной документации одной из наиболее сложных для восприятия тем является тестирование программного кода по требованиям. Большинство студентов и специалистов в процессе разработки настолько привыкают к анализу программного кода, что предпочитают смотреть на то, что программа делает, а не проверять, что она должна делать. Дополнительную проблему создает необходимость анализа полноты покрытия программного кода в процессе тестирования, когда требуется не только выполнить все команды, но и пройти все разветвления программы. Вечные вопросы, которые возникают у обучающихся: как обеспечить полноту покрытия требований, сколько тестов необходимо для полноты проверки интервальных типов, нужно ли проверять реакцию системы на недопустимые значения, коль скоро в требованиях они не указаны и т.п. Однозначных ответов на все подобные вопросы нет. Но существуют проверенные практикой рекомендации, которые можно и нужно научиться применять в процессе практических занятий со студентами. Одним из конструктивных подходов к этому - группировка тестов по классам эквивалентности. Не вводя точных определений, на интуитивном уровне мы относим к одному классу эквивалентности такие тесты, при выполнении которых мы получаем одинаковые результаты, например зажигание индикаторной лампочки. В ряде случаев удобнее группировать тесты на основе общих свойств входных данных. Например, входные строки содержат ведущие пробелы. [1] Как правило в тест-плане, можно выделить две категории тестов: нормальные - соответствующие требованиям к системе, и тесты на устойчивость, исследующие поведение системы за пределами допустимых воздействий. Цель первой категории тестов - показать способность ПО реагировать на нормальные входные данные и условия. Для тестов нормального диапазона: · вещественные и целые входные переменные должны задаваться, используя корректные значения, включая и граничные значения тоже; · для переходов между состояниями, тесты следует разрабатывать так, чтобы постараться выполнить переход во время нормальной работы; · для требований, представленных в виде логических выражений, тесты нормальных диапазонов должны проверять использование булевых переменных и выражений. Цель второй категории тестов, тестирования на устойчивость, доказать возможность системы разумно реагировать на неправильный вход и неправильные условия. Для этй категории тестов характерно: · вещественные и целые переменные должны инициализироваться, используя некорректные значения; · инициализация системы должна проводиться во время функционирования в ненормальном режиме; · для проверки циклов с вычисляемым счетчиком цикла, тестовые варианты должны быть разработаны так, чтобы попытаться придать счетчику цикла значение выходящее за пределы допустимых значений, и таким образом продемонстрировать устойчивость кода связанного с циклом; · должна проводиться проверка, удостоверяющая, что механизмы защиты реагируют корректно на превышение промежутков времени; · для переходов между состояниями, тесты должны пытаться вызвать переходы, не разрешенные требованиями. В рамках данной работы предлагается рассмотреть одну из простейших задач, полный анализ которой занимает примерно двух часовой семинар с отдельной группой студентов. Для реализации программы рассматриваемого примера может быть применен любой язык программирования, но в данном изложении предлагается ограничиться простой схемой программы. Пример основан на хорошо известном варианте выбора максимума из трех чисел. Предполагается, что исходные числа целые и могут принимать как положительные, так и отрицательные значения. Для лучшего достижения методических целей модифицируем задачу и сведем ее к определению того, какой из трех параметров, переданных в программу, имеет максимальное значение. В примере оформления задачи использованы форматы принятые в курсах программирования на кафедре «Кибернетика» НИЯУ МИФИ.
|