Тестирование

Статическое тестирование

  1. Есть ли переменные со сходными именами (например, USER и USERS)? Наличие сходных имён не является ошибкой, но может стать причиной того, что в какой-то точке программы переменные будут перепутаны.
  2. Есть ли обращения к переменным, которым не присвоены значения? Убедитесь в том, что переменным в подпрограммах и в циклах присваиваются правильные начальные значения при каждом входе в них.
  3. Является ли индекс массива целочисленной переменной?
  4. Не выходит ли значение индекса элемента массива за границы, определённые для соответствующего измерения, при всех обращениях к массиву?
  5. Встречаются ли операции, использующие переменные недопустимых типов? Например, неарифметические данные в арифметических выражениях, нелогические операнды в логических выражениях.
  6. Встречаются ли операции, использующие данные разных типов?
  7. Учтены ли приоритеты операций?
  8. Возможны ли переполнение или исчезновение порядка во время вычисления значения выражения? Это означает, что конечный результат может казаться правильным, но промежуточный результат может быть слишком большим (переполнение) или слишком малым (исчезновение порядка) для машинного представления данных.
  9. Учтено ли, что делитель при делении может обратиться в нуль?
  10. Может ли значение переменной выходить за пределы диапазона, установленного для её типа?
  11. Корректны ли операции сравнения? Обычно часто путают такие операции отношения, как «больше» и «больше или равно» или «меньше» и «меньше или равно».
  12. Каждое ли логическое выражение сформулировано так, как это предполагалось?
  13. Будет ли каждый цикл завершён? Придумайте неформальное доказательство или аргументы, подтверждающие их завершение.
  14. Будет ли программа завершена?
  15. Существуют ли фрагменты программы, которые никогда не выполняются?
  16. Соответствуют ли фактические параметры формальным параметрам процедур и функций? Соответствие по количеству и типу проверяется компилятором, а вот соответствие по порядку и, главное, по смыслу может проверить только программист.
  17. Совпадают ли единицы измерения значений соответствующих фактических и формальных параметров? Например, нет ли случаев, когда значение фактического параметра выражено в градусах, а в подпрограмме все расчёты проводятся с формальным параметром, выраженным в радианах.
  18. Все ли файлы открыты перед их использованием и закрыты по завершении ввода/вывода данных?
  19. Согласуются ли типы переменных со спецификациями формата?
  20. Существуют ли смысловые или грамматические ошибки в тексте, выводимом программой?

Основные принципы тестирования

  1. Описание предполагаемых значений выходных данных должно быть необходимой частью тестового набора. Нарушение этого очевидного принципа представляет одну из наиболее распространённых ошибок. Ошибочные, но правдоподобные результаты могут быть признаны правильными, если результаты теста не были заранее определены. Здесь мы сталкиваемся с явлением психологии: мы видим то, что мы хотим увидеть. Другими словами, несмотря на то, что тестирование по определению – деструктив¬ный процесс, у человека есть подсознательное желание увидеть корректный результат.
  2. Следует избегать тестирования программы её автором.
  3. Тесты для неправильных и непредусмотренных входных данных следует разрабатывать так же тщательно, как для правильных и предусмотренных. Вполне вероятно, что тесты, представляющие неверные и неправильные входные данные, обладают большей обнаруживающей способностью, чем тесты, соответствующие корректным входным данным.
  4. Необходимо проверять не только, делает ли программа то, для чего она предназначена, но и ни делает ли она то, что не должна делать. Обязательно проверяйте программу на нежелательные побочные эффекты.
  5. Вероятность наличия необнаруженных ошибок в части программы пропорциональна числу ошибок, уже обнаруженных в этой части. На первый взгляд, этот принцип лишён смысла, но, тем не менее, подтверждается опытом программирования – ошибки в программе обычно располагаются в виде неких скоплений, хотя данное явление пока никем ещё не объяснено. Например, допустим, что некоторая программа состоит из модулей А и В. К определённому сроку в модуле А обнаружено пять ошибок, а в модуле В – только одна, причём модуль А не подвергался более тщательному тестированию. Тогда из рассматриваемого принципа следует, что вероятность существования необнаруженных ошибок в модуле А больше, чем в модуле В.