Что такое циклическое тестирование? Методология, пример

⚡ Умное резюме

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

  • 🔘 Определение: Методика управления с использованием «белого ящика», ориентированная на проверку корректности цикла, а не на экранирование.
  • 🔁 Четыре класса: Для простых, вложенных, последовательно соединенных и неструктурированных циклов необходима своя стратегия.
  • 📍 Три контрольных пункта: Вход в цикл, поведение во время выполнения и условие выхода.
  • 🧪 Проходы через границу: Ноль, один, два, типичное количество, затем b-1, b и b+1 итераций.
  • 🪜 Вложенный порядок: Начните с самой внутренней петли, удерживайте внешние петли в минимальном положении, затем двигайтесь наружу.
  • 🐞 Обнаружены дефекты: Ограничения, превышающие единицу, неинициализированные счетчики, бесконечные циклы и узкие места в пропускной способности.
  • ⚠️ Ограничение: Ошибки, возникающие в циклах, кроются в низкоуровневом коде и редко бывают незаметными после того, как до них добираются.

Методология тестирования циклов, типы циклов и примеры тестовых случаев.

Что такое циклическое тестирование?

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

Циклическое тестирование — это тестирование белого ящика Этот метод применяется тем, кто может прочитать исходный код и увидеть условие цикла, счетчик и путь выхода. Тестировщик не пытается угадать поведение, исходя из пользовательского интерфейса; сам цикл является объектом тестирования.

На приведенной ниже диаграмме показано место тестирования контуров в семействе тестов управляющих структур.

Тестирование контура показано как раздел тестирования структуры управления.

Типы протестированных петель

Прежде чем выбрать стратегию, определите, какой из четырех классов циклов вы рассматриваете. Примеры тестируемых типов циклов:

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

Объем работы определяется классом. Для простого цикла требуется всего несколько итераций; для неструктурированного цикла обычно требуется перепроектирование кода, прежде чем его вообще можно будет протестировать.

Зачем проводить циклическое тестирование?

Тестирование цикла проводится по следующим причинам.

  • Тестирование может исправить проблемы с повторением цикла.
  • Тестирование циклов может выявить узкие места в производительности и пропускной способности.
  • Путем проверки циклов можно определить неинициализированные переменные внутри цикла.
  • Это помогает выявить проблемы инициализации циклов.

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

Как проводить циклическое тестирование: полная методология

При тестировании цикла необходимо проверить его на трех разных уровнях:

  • Когда цикл вводится
  • В ходе его исполнения и
  • Когда петля осталась

Стратегия тестирования для всех этих циклов следующая.

Простой цикл

Простой цикл имеет один вход и один выход, как показано ниже.

Простая блок-схема цикла с одной точкой входа и одним условием выхода.

Простой цикл тестируется следующим образом:

  1. Пропустить весь цикл
  2. Выполните 1 проход по циклу
  3. Сделайте 2 проход через петлю
  4. MAKE a проходит через петлю, где a < b, то есть типичное среднее количество итераций.
  5. MAKE b, b-1 и b+1 проходит через петлю, где b — это максимально допустимое количество проходов через замкнутый контур.

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

Вложенный цикл

Вложенный цикл увеличивает количество возможных комбинаций итераций, поэтому проверка выполняется изнутри наружу, а не сразу.

Блок-схема с вложенными циклами, в которой внутренний цикл заключен во внешний цикл.

Для создания вложенного цикла необходимо выполнить следующие шаги.

  1. Установите для всех остальных циклов минимальное значение и начните с самого внутреннего цикла.
  2. Для самого внутреннего цикла выполните простой тест цикла и сохраните для внешних циклов минимальное значение параметра итерации.
  3. Выполните проверку для следующего цикла и двигайтесь наружу.
  4. Продолжайте до тех пор, пока не будет проверен самый внешний цикл.

Составные циклы

Как показано на диаграмме, последовательные циклы располагаются один за другим в одном и том же пути выполнения.

Блок-схема последовательного выполнения двух циклов.

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

Однако, если счетчик одного цикла используется в качестве начального значения для другого, то эти два цикла не считаются независимыми.

Неструктурированные петли

Неструктурированные циклы представляют собой наиболее сложный случай, поскольку управление включается и выключается из тела цикла в произвольных точках.

Неструктурированная блок-схема цикла с управляющим переходомping входящий и исходящий из контура тела

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

Пример тестирования цикла с использованием тестовых примеров.

Наглядный пример наглядно демонстрирует количество итераций. Рассмотрим процедуру, которая умножает текущий результат на каждое целое число от 1 до 1. nФакториал. Счетчик цикла начинается с 1, условие выхода — противодействие > nЦикл объявлен таким образом, что он принимает максимум 12 проходов, прежде чем результат выйдет за пределы объявленного целочисленного типа.

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

Прецедент Значение n Выполненные пасы Что это доказывает
TC01 0 0 (цикл пропущен) Условие выхода оценивается до выполнения тела функции, и результат остается равным своему первоначальному значению 1.
TC02 1 1 Один проход дает правильный результат, и счетчик увеличивается на одно деление.
TC03 2 2 Аккумулятор переносит значение вперед между двумя последовательными проходами.
TC04 5 5 Типичный средний показатель дает ожидаемые 120, что подтверждает обычное поведение системы.
TC05 11 11 Даже один проход ниже максимального значения завершается нормально.b-1).
TC06 12 12 Заявленное максимальное значение принимается, и цикл завершается.b).
TC07 13 отклонены Проход, превышающий максимально допустимый уровень, отклоняется, а не происходит незаметное переполнение.b+ 1).

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

Типичные дефекты, выявляемые при тестировании циклов.

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

  • Границы с отклонением на один — состояние, записанное как < в котором <= Так и было задумано, поэтому цикл выполняет либо на один проход меньше, либо на один проход больше.
  • Неинициализированные счетчики или аккумуляторы — итоговая сумма, содержащая остаток от предыдущего звонка.
  • Бесконечные циклы — условие выхода, которое тело цикла никогда не сможет выполнить, поскольку счетчик обновляется только в некоторых ветвях.
  • Предположения о пропущенных циклах — код после цикла, который считывает переменную, которую, как ожидалось, должно было установить тело цикла; это приводит к ошибке, если цикл выполняется ноль раз.
  • Сбои в производительности и мощности — цикл, который корректен, но при каждом проходе повторно считывает базу данных, поэтому стоимость возрастает с увеличением количества итераций.
  • Вложенные петли помех — внутренний цикл, который повторно использует счетчик внешнего цикла и незаметно изменяет количество итераций внешнего цикла.

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

Сравнение методов тестирования контуров управления и других методов тестирования управляющих структур.

Тестирование контуров управления — это один из методов, относящихся к семейству методов управления, и его легко спутать с соседними методами. В таблице ниже приведено их разграничение.

Техника На что это нацелено Типичная цель охвата
Циклическое тестирование Конструкция цикла: вход, количество итераций и выход. Для каждого цикла учитывается нулевое, одно, типичное и граничное количество итераций.
Проверка состояния Логические выражения внутри решений Каждое условие оценивалось как истинное, так и ложное.
Тестирование потока данных Определение и использование каждой переменной Каждая пара «определение-использование» была задействована как минимум один раз.
Базовое тестирование пути Независимые пути через граф потока управления Число путей, равное цикломатической сложности.

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

Ограничение в циклическом тестировании

У этой методики есть реальные ограничения, и знание этих ограничений предотвращает чрезмерные инвестиции.

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

Часто задаваемые вопросы (FAQ)

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

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

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

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

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

Для этого нет специального инструмента. Команды объединяют фреймворк для модульного тестирования, например, такой. JUnit или используйте pytest с инструментом анализа покрытия кода, который сообщает о покрытии ветвей, а затем прочтите отчет, чтобы убедиться, что был достигнут путь с нулевой итерацией.

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

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

Подведем итог этой публикации следующим образом: