Що таке тестування циклу? Методика, Приклад

⚡ Розумний підсумок

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

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

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

Що таке тестування циклу?

Тестування циклу – це тип тестування програмного забезпечення, який повністю зосереджений на достовірності конструкцій циклів у програмі. Це одна з частин тестування структури керування, поряд з тестування шляху, тестування перевірки даних та тестування умов.

Тестування циклу - це a тестування білої скриньки техніка, тому її застосовує людина, яка може прочитати вихідний код і побачити умову циклу, лічильник і шлях виходу. Тестувальник не здогадується про поведінку з інтерфейсу користувача; сам цикл є об'єктом, що тестується.

На діаграмі нижче показано, яке місце займає тестування циклів у сімействі тестування структури керування.

Тестування циклів, показане як галузь тестування структури керування

Типи петель Перевірено

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

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

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

Навіщо тестувати цикл?

Тестування циклу виконується з наступних причин

  • Тестування може вирішити проблеми з повторенням циклу
  • Тестування циклів може виявити вузькі місця в продуктивності та пропускній здатності
  • Шляхом тестування циклів можна визначити неініціалізовані змінні в циклі
  • Це допомагає виявити проблеми ініціалізації циклу.

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

Як виконати тестування циклу: повна методологія

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

  • Коли введено цикл
  • Під час його виконання, та
  • Коли петля залишилася

Стратегія тестування для всіх цих циклів така.

Проста петля

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

Проста блок-схема циклу з однією точкою входу та однією умовою виходу

Простий цикл перевіряється наступним чином:

  1. Пропустити весь цикл
  2. Зробіть 1 прохід через петлю
  3. Зробіть 2 прохід через петлю
  4. зробити a проходить через петлю, де a < b, це типова кількість ітерацій середнього діапазону
  5. зробити b, b-1 і b+1 проходить через цикл, де b – максимальна кількість допустимих проходів через цикл.

Останні два випадки мають найбільшу цінність. Пропустити.ping цикл доводить, що умова виходу обчислюється перед виконанням тіла, і b+1 випадок доводить, що цикл відмовляється виконувати завдання, що перевищують оголошену межу, замість того, щоб перевантажувати масив.

вкладений цикл

Вкладений цикл множить кількість можливих комбінацій ітерацій, тому він перевіряється зсередини назовні, а не все одразу.

Блок-схема вкладених циклів із внутрішнім циклом, оточеним зовнішнім циклом

Для вкладеного циклу потрібно виконати такі кроки.

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

Конкатеновані цикли

Об'єднані цикли розташовані один за одним в одному шляху виконання, як показано на діаграмі.

Блок-схема об'єднаних циклів, що показує два цикли, що виконуються послідовно

У конкатенованих циклах, якщо два цикли незалежні один від одного, то вони тестуються за допомогою підходу простого циклу, інакше вони тестуються як вкладені цикли.

Однак, якщо лічильник циклів одного циклу використовується як початкове значення для іншого, два цикли не вважаються незалежними.

Неструктуровані цикли

Неструктуровані цикли є найскладнішим випадком, оскільки керування переходить у тіло циклу та виходить з нього в довільних точках.

Блок-схема неструктурованого циклу з елементами керуванняping вхід та вихід з тіла циклу

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

Приклад тестування циклу з тестовими випадками

Розроблений приклад конкретизує кількість ітерацій. Розглянемо процедуру, яка множить поточний результат на кожне ціле число від 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 належить до того ж набору, якщо специфікація дозволяє його надання, що пов'язує тестування циклу з негативне тестування.

Поширені дефекти, виявлені під час тестування циклу

Тестування циклів постійно знаходить ту саму невелику групу помилок, саме тому варто щоразу запускати фіксовану кількість ітерацій.

  • Межі, що відрізняються на одиницю — умова, записана як < де <= було задумано, тому цикл виконується на один прохід менше або на один більше.
  • Неініціалізовані лічильники або акумулятори — підсумок, що містить значення, що залишилося від попереднього виклику.
  • Нескінченні цикли — умова виходу, яку тіло циклу ніколи не може задовольнити, оскільки лічильник оновлюється лише на деяких гілках.
  • Припущення про пропущені цикли — код після циклу, який зчитує змінну, яку мало встановити тіло циклу, що призводить до невдачі, коли цикл виконується нуль разів.
  • Недоліки ємності та продуктивності — цикл, який є правильним, але перечитує базу даних на кожному проході, тому вартість зростає зі збільшенням кількості ітерацій.
  • Вкладена петля інтерференції — внутрішній цикл, який повторно використовує лічильник зовнішнього циклу та непомітно змінює лічильник зовнішніх ітерацій.

Оскільки кожен розлад відповідає певній кількості ітерацій, виявлені тут дефекти легко відтворити та швидко виправити порівняно з дефектами, виявленими за вищих показників. рівні тестування.

Тестування циклів проти інших методів тестування структури керування

Тестування циклів є одним із членів сімейства структур керування, і його легко сплутати з сусідніми методами. У таблиці нижче вони розділені.

Техніка На що він спрямований Типова ціль покриття
Тестування циклу Конструкції циклів: вхід, кількість ітерацій та вихід Нульова, одинична, типова та гранична кількість ітерацій для кожного циклу
Тестування стану Булеві вирази всередині рішень Кожна умова оцінювалася як істинна, так і хибна
Тестування потоку даних Визначення та використання кожної змінної Кожна пара «визначення-вживання» застосовується принаймні один раз
Тестування базового шляху Незалежні шляхи через граф потоку керування Кількість шляхів, що дорівнює цикломатичній складності

На практиці ці методи радше доповнюють один одного, ніж конкурують. Цикломатична складність показує, скільки незалежних шляхів існує, базове тестування шляхів їх охоплює, а циклічне тестування потім додає кількість ітерацій, яку саме покриття шляхів не зможе вимагати. Усі вони є динамічне тестування дії, оскільки код має бути виконаний для спостереження за результатами.

Обмеження в тестуванні циклу

Ця техніка має реальні межі, і знання їх запобігає надмірним інвестиціям.

  • Помилки циклу з’являються переважно в програмному забезпеченні низького рівня
  • Помилки, виявлені під час тестування циклу, не дуже тонкі
  • Багато помилок можуть бути виявлені операційною системою, оскільки вони спричиняють порушення меж пам'яті, помилки виявлених вказівників та подібні несправності.
  • Визначення класу кожного циклу та його відповідне тестування вимагає часу, що важко виправдати на шляхах коду з невеликим ризиком.

Поширені запитання

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

Модель зчитує умову циклу та автоматично пропонує нульову, одиничну, типову та граничну кількість ітерацій, включаючи випадок переповнення. Рецензент все одно підтверджує, що кожен очікуваний результат відповідає специфікації.

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

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

Набагато менше, ніж у будь-якій комбінації. Тестування навиворіт забезпечує приблизно адитивний, а не мультиплікативний підрахунок на рівнях, оскільки зовнішні цикли закріплюються на мінімальному значенні, поки виконується внутрішній цикл.

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

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

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

Підсумуйте цей пост за допомогою: