Основы тестирования программного обеспечения

       

Пример регрессионного тестирования


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

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

  • Проверить и утвердить исправление ошибки. Для этого необходимо выполнить указанный в отчете тест, с помощью которого была найдена ошибка.
  • Попробовать воспроизвести ошибку каким-нибудь другим способом.
  • Протестировать последствия исправлений. Возможно, что внесенные исправления привнесли ошибку (наведенную ошибку) в код, который до этого исправно работал.

Например, при тестировании класса TСommandQueue запускаем тесты (пример 7.2):

// Тест проверяет, создается ли объект // типа TCommand и добавляется ли он // в конец очереди. private void TCommandQueueTest1() // Тест проверяет добавление команд // в очередь на указанную позицию. // Также проверяется правильность // удаления команд из очереди. private void TCommandQueueTest2() Пример 7.4. Набор тестов класса TСommandQueue// Тест проверяет, создается ли объект // типа TCommand и добавляется ли он // в конец очереди. void TCommandQueueTest1() // Тест проверяет добавление команд // в очередь на указанную позицию. // Также проверяется правильность // удаления команд из очереди. void TCommandQueueTest2() Пример 7.4.1. Набор тестов класса TСommandQueue (C++)

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

...

if ((Position<-1)&& (Position<=this.Items.Count)) { this.Items.Insert(Position, Command); } else { if (Position==-1) { this.Items.Add(Command); } } Пример 7.5. Фрагмент кода с зафиксированным при тестировании дефектомif ((Position <-1)&&(Position<=this.Items.Count)) { this.Items.Insert(Position, Command); } else { if (Position==-1) { this.Items.Add(Command); } } Пример 7.5.1. Фрагмент кода с зафиксированным при тестировании дефектом

Анализ показывает, что ошибка заключается в использовании неверного знака сравнения в первой строке фрагмента (помечено светлым тоном).


Далее программист исправляет ошибку, например следующим образом:
... if ((Position>=-1)&& (Position<=this.Items.Count)) { this.Items.Insert(Position, Command); } else { if (Position==-1) { this.Items.Add(Command); } } ... Пример 7.6. Исправленный фрагмент кодаif ((Position>=-1)&& (Position<=this.Items.Count)) { this.Items.Insert(Position, Command); } else { if (Position==-1) { this.Items.Add(Command); } } Пример 7.6.1. Исправленный фрагмент кодаДля проверки скорректированного кода хочется пропустить только тест TCommandQueueTest2. Можно убедиться, что тест TCommandQueueTest2 будет выполняться успешно. Однако одной этой проверки недостаточно. Если мы повторим пропуск двух тестов, то при запуске первого теста, TCommandQueueTest1, будет обнаружен новый дефект. Повторный анализ кода показывает, что ветка else не выполняется. Таким образом, исправление в одном месте привело к ошибке в другом, что демонстрирует необходимость проведения полного перетестирования. Однако повторное перетестирование требует значительных усилий и времени. Возникает задача – отобрать сокращенный набор тестов из исходного набора (может быть, пополнив его рядом дополнительных - вновь разработанных - тестов), которого, тем не менее, будет достаточно для исчерпывающей проверки функциональности в соответствии с выбранным критерием. Организация повторного тестирования в условиях сокращения ресурсов, необходимых для обеспечения заданного уровня качества продукта, обеспечивается регрессионным тестированием.

Содержание раздела







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