Тестирование программного обеспечения (ПО) выявляет недоработки, изъяны и ошибки в коде, которые необходимо устранить. Его также можно определить как процесс оценки функциональных возможностей и корректности ПО с помощью анализа. Основные методы интеграции и тестирования программных продуктов обеспечивают качество приложений и заключаются в проверке спецификации, дизайна и кода, оценке надежности, валидации и верификации.
Методы
Главная цель тестирования ПО – подтверждение качества программного комплекса путем систематической отладки приложений в тщательно контролируемых условиях, определение их полноты и корректности, а также обнаружение скрытых ошибок.
Методы проверки (тестирования) программ можно разделить на статические и динамические.
К первым относятся неформальное, контрольное и техническое рецензирование, инспекция, пошаговый разбор, аудит, а также статический анализ потока данных и управления.
Динамические техники следующие:
- Тестирование методом белого ящика. Это подробное исследование внутренней логики и структуры программы. При этом необходимо знание исходного кода.
- Тестирование методом черного ящика. Данная техника не требует каких-либо знаний о внутренней работе приложения. Рассматриваются только основные аспекты системы, не связанные или мало связанные с ее внутренней логической структурой.
- Метод серого ящика. Сочетает в себе предыдущие два подхода. Отладка с ограниченным знанием о внутреннем функционировании приложения сочетается со знанием основных аспектов системы.
Прозрачное тестирование
В методе белого ящика используются тестовые сценарии контрольной структуры процедурного проекта. Данная техника позволяет выявить ошибки реализации, такие как плохое управление системой кодов, путем анализа внутренней работы части программного обеспечения. Данные методы тестирования применимы на интеграционном, модульном и системном уровнях. Тестировщик должен иметь доступ к исходному коду и, используя его, выяснить, какой блок ведет себя несоответствующим образом.
Тестирование программ методом белого ящика обладает следующими преимуществами:
- позволяет выявить ошибку в скрытом коде при удалении лишних строк;
- возможность использования побочных эффектов;
- максимальный охват достигается путем написания тестового сценария.
Недостатки:
- высокозатратный процесс, требующий квалифицированного отладчика;
- много путей останутся неисследованными, поскольку тщательная проверка всех возможных скрытых ошибок очень сложна;
- некоторая часть пропущенного кода останется незамеченной.
Тестирование методом белого ящика иногда еще называют тестированием методом прозрачного или открытого ящика, структурным, логическим тестированием, тестированием на основе исходных текстов, архитектуры и логики.
Основные разновидности:
1) тестирование управления потоком – структурная стратегия, использующая поток управления программой в качестве модели и отдающая предпочтение большему количеству простых путей перед меньшим числом более сложных;
2) отладка ветвления имеет целью исследование каждой опции (истинной или ложной) каждого оператора управления, который также включает в себя объединенное решение;
3) тестирование основного пути, которое позволяет тестировщику установить меру логической сложности процедурного проекта для выделения базового набора путей выполнения;
4) проверка потока данных – стратегия исследования потока управления путем аннотации графа информацией об объявлении и использовании переменных программы;
5) тестирование циклов – полностью сосредоточено на правильном выполнении циклических процедур.
Поведенческая отладка
Тестирование методом черного ящика рассматривает ПО как «черный ящик» – сведения о внутренней работе программы не учитываются, а проверяются только основные аспекты системы. При этом тестировщику необходимо знать системную архитектуру без доступа к исходному коду.
Преимущества такого подхода:
- эффективность для большого сегмента кода;
- простота восприятия тестировщиком;
- перспектива пользователя четко отделена от перспективы разработчика (программист и тестировщик независимы друг от друга);
- более быстрое создание теста.
Тестирование программ методами черного ящика имеет следующие недостатки:
- в действительности выполняется избранное число тестовых сценариев, результатом чего является ограниченный охват;
- отсутствие четкой спецификации затрудняет разработку тестовых сценариев;
- низкая эффективность.
Другие названия данной техники – поведенческое, непрозрачное, функциональное тестирование и отладка методом закрытого ящика.
К данной категории можно отнести следующие методы тестирования программного обеспечения:
1) эквивалентное разбиение, которое может уменьшить набор тестовых данных, так как входные данные программного модуля разбиваются на отдельные части;
2) краевой анализ фокусируется на проверке границ или экстремальных граничных значений – минимумах, максимумах, ошибочных и типичных значениях;
3) фаззинг – используется для поиска погрешностей реализации с помощью ввода искаженных или полуискаженных данных в автоматическом или полуавтоматическом режиме;
4) графы причинно-следственных связей – методика, основанная на создании графов и установлении связи между действием и его причинами: тождественность, отрицание, логическое ИЛИ и логическое И – четыре основных символа, выражающие взаимозависимость между причиной и следствием;
5) проверка ортогональных массивов, применяемая к проблемам с относительно небольшой областью ввода, превышающей возможности исчерпывающего исследования;
6) тестирование всех пар – техника, набор тестовых значений которой включает все возможные дискретные комбинации каждой пары входных параметров;
7) отладка переходов состояний – техника, полезная для проверки машины состояний, а также для навигации по графическому интерфейсу пользователя.
Тестирование методом черного ящика: примеры
Техника черного ящика основана на спецификациях, документации, а также описаниях интерфейса программного обеспечения или системы. Кроме того, возможно использование моделей (формальных или неформальных), представляющих ожидаемое поведение ПО.
Обычно данный метод отладки применяется для пользовательских интерфейсов и требует взаимодействия с приложением путем введения данных и сбора результатов – с экрана, из отчетов или распечаток.
Тестировщик, таким образом, взаимодействует с ПО путем ввода, воздействуя на переключатели, кнопки или другие интерфейсы. Выбор входных данных, порядок их введения или очередность действий могут привести к гигантскому суммарному числу комбинаций, как это видно на следующем примере.
Какое количество тестов необходимо произвести, чтобы проверить все возможные значения для 4 окон флажка и одного двухпозиционного поля, задающего время в секундах? На первый взгляд расчет прост: 4 поля с двумя возможными состояниями – 24 = 16, которые необходимо умножить на число возможных позиций от 00 до 99, то есть 1600 возможных тестов.
Тем не менее этот расчет ошибочен: мы можем определить, что двухпозиционное поле может также содержать пробел, т. е. оно состоит из двух буквенно-цифровых позиций и может включать символы алфавита, специальные символы, пробелы и т. д. Таким образом, если система представляет собой 16-битный компьютер, то получится 216 = 65 536 вариантов для каждой позиции, результирующих в 4 294 967 296 тестовых случаев, которые необходимо умножить на 16 комбинаций для флажков, что в общей сложности дает 68 719 476 736. Если их выполнить со скоростью 1 тест в секунду, то общая продолжительность тестирования составит 2 177,5 лет. Для 32 или 64-битных систем, длительность еще больше.
Поэтому возникает необходимость уменьшить этот срок до приемлемого значения. Таким образом, должны применяться приемы для сокращения количества тестовых случаев без уменьшения охвата тестирования.
Эквивалентное разбиение
Эквивалентное разбиение представляет собой простой метод, применимый для любых переменных, присутствующих в программном обеспечении, будь то входные или выходные значения, символьные, числовые и др. Он основан на том принципе, что все данные из одного эквивалентного разбиения будут обрабатываться тем же образом и теми же инструкциями.
Во время тестирования выбирается по одному представителю от каждого определенного эквивалентного разбиения. Это позволяет систематически сокращать число возможных тестовых случаев без потери охвата команд и функций.
Другим следствием такого разбиения является сокращение комбинаторного взрыва между различными переменными и связанное с ними сокращение тестовых случаев.
Например, в (1/x)1/2 используется три последовательности данных, три эквивалентных разбиения:
1. Все положительные числа будут обрабатываться таким же образом и должны давать правильные результаты.
2. Все отрицательные числа будут обрабатываться так же, с таким же результатом. Это неверно, так как корень из отрицательного числа является мнимым.
3. Ноль будет обрабатываться отдельно и даст ошибку «деление на ноль». Это раздел с одним значением.
Таким образом, мы видим три различных раздела, один из которых сводится к единственному значению. Есть один «правильный» раздел, дающий достоверные результаты, и два «неправильных», с некорректными результатами.
Краевой анализ
Обработка данных на границах эквивалентного разбиения может выполняться иначе, чем ожидается. Исследование граничных значений – хорошо известный способ анализа поведения ПО в таких областях. Эта техника позволяет выявить такие ошибки:
- неправильное использование операторов отношения (<,>, =, ≠, ≥, ≤);
- единичные ошибки;
- проблемы в циклах и итерациях,
- неправильные типы или размер переменных, используемых для хранения информации;
- искусственные ограничения, связанные с данными и типами переменных.
Полупрозрачное тестирование
Метод серого ящика увеличивает охват проверки, позволяя сосредоточиться на всех уровнях сложной системы путем сочетания методов белого и черного.
При использовании этой техники тестировщик для разработки тестовых значений должен обладать знаниями о внутренних структурах данных и алгоритмах. Примерами методики тестирования серого ящика являются:
- архитектурная модель;
- унифицированный язык моделирования (UML);
- модель состояний (конечный автомат).
В методе серого ящика для разработки тестовых случаев изучаются коды модулей по технике белого, а фактическое испытание выполняется на интерфейсах программы по технологии черного.
Такие методы тестирования обладают следующими преимуществами:
- сочетание преимуществ техник белого и черного ящиков;
- тестировщик опирается на интерфейс и функциональную спецификацию, а не на исходный код;
- отладчик может создавать отличные тестовые сценарии;
- проверка производится с точки зрения пользователя, а не дизайнера программы;
- создание настраиваемых тестовых разработок;
- объективность.
Недостатки:
- тестовое покрытие ограничено, так как отсутствует доступ к исходному коду;
- сложность обнаружения дефектов в распределенных приложениях;
- многие пути остаются неисследованными;
- если разработчик программного обеспечения уже запускал проверку, то дальнейшее исследование может быть избыточным.
Другое название техники серого ящика – полупрозрачная отладка.
К этой категории относят такие методы тестирования:
1) ортогональный массив – использование подмножества всех возможных комбинаций;
2) матричная отладка с использованием данных о состоянии программы;
3) регрессивная проверка, проводимая при внесении новых изменений в ПО;
4) шаблонный тест, который анализирует дизайн и архитектуру добротного приложения.
Сравнение методов тестирования ПО
Использование всех динамических методов приводит к комбинаторному взрыву количества тестов, которые должны быть разработаны, воплощены и проведены. Каждую технику следует использовать прагматично, принимая во внимание ее ограничения.
Единственно верного метода не существует, есть только те, которые лучше подходят для конкретного контекста. Структурные техники позволяют найти бесполезный или вредоносный код, но они сложны и неприменимы к крупным программам. Методы на основе спецификации – единственные, которые способны выявить недостающий код, но они не могут идентифицировать посторонний. Одни техники больше подходят для конкретного уровня тестирования, типа ошибок или контекста, чем другие.
Ниже приведены основные отличия трех динамических техник тестирования - дана таблица сравнения между тремя формами отладки ПО.
Аспект | Метод черного ящика | Метод серого ящика | Метод белого ящика |
Наличие сведений о составе программы | Анализируются только базовые аспекты | Частичное знание о внутреннем устройстве программы | Полный доступ к исходному коду |
Степень дробления программы | Низкая | Средняя | Высокая |
Кто производит отладку? | Конечные пользователи, тестировщики и разработчики | Конечные пользователи, отладчики и девелоперы | Разработчики и тестировщики |
База | Тестирование базируется на внешних внештатных ситуациях. | Диаграммы БД, диаграммы потока данных, внутренние состояния, знание алгоритма и архитектуры | Внутреннее устройство полностью известно |
Степень охвата | Наименее исчерпывающая и требует минимума времени | Средняя | Потенциально наиболее исчерпывающая. Требует много времени |
Данные и внутренние границы | Отладка исключительно методом проб и ошибок | Могут проверяться домены данных и внутренние границы, если они известны | Лучшее тестирование доменов данных и внутренних границ |
Пригодность для тестирования алгоритма | Нет | Нет | Да |
Автоматизация
Автоматические методы тестирования программных продуктов намного упрощают процесс проверки независимо от технической среды или контекста ПО. Их используют в двух случаях:
1) для автоматизации выполнение утомительных, повторяющихся или скрупулезных задач, таких как сравнение файлов в нескольких тысяч строк с целью высвобождения времени тестировщика для концентрации на более важных моментах;
2) для выполнения или отслеживания задач, которые не могут быть легко осуществимы людьми, таких как проверка производительности или анализ времени отклика, которые могут измеряться в сотых долях секунды.
Тестовые инструменты могут быть классифицированы по-разному. Следующее деление основано на поддерживаемых ими задачах:
- управление тестированием, которое включает поддержку управления проектом, версиями, конфигурациями, риск-анализ, отслеживание тестов, ошибок, дефектов и инструменты создания отчетов;
- управление требованиями, которое включает хранение требований и спецификаций, их проверку на полноту и многозначность, их приоритет и отслеживаемость каждого теста;
- критический просмотр и статический анализ, включая мониторинг потока и задач, запись и хранение комментариев, обнаружение дефектов и плановых коррекций, управление ссылками на проверочные списки и правила, отслеживание связи исходных документов и кода, статический анализ с обнаружением дефектов, обеспечением соответствия стандартам написания кода, разбором структур и их зависимостей, вычислением метрических параметров кода и архитектуры. Кроме того, используются компиляторы, анализаторы связей и генераторы кросс-ссылок;
- моделирование, которое включает инструменты моделирования бизнес-поведения и проверки созданных моделей;
- разработка тестов обеспечивает генерацию ожидаемых данных исходя из условий и интерфейса пользователя, моделей и кода, управление ими для создания или изменения файлов и БД, сообщений, проверки данных исходя из правил управления, анализа статистики условий и рисков;
- критический просмотр путем ввода данных через графический интерфейс пользователя, API, командные строки с использованием компараторов, помогающих определить успешные и неудавшиеся тесты;
- поддержка сред отладки, которая позволяет заменить отсутствующее оборудование или ПО, в т. ч. симуляторы оборудования на основе подмножества детерминированного выхода, эмуляторы терминалов, мобильных телефонов или сетевого оборудования, среды для проверки языков, ОС и аппаратного обеспечения путем замены недостающих компонентов драйверами, фиктивными модулями и др., а также инструменты для перехвата и модификации запросов ОС, симуляции ограничений ЦПУ, ОЗУ, ПЗУ или сети;
- сравнение данных файлов, БД, проверка ожидаемых результатов во время и по окончании тестирования, в т. ч. динамическое и пакетное сравнение, автоматические «оракулы»;
- измерение покрытия для локализации утечек памяти и некорректного управления ею, оценки поведения системы в условиях симулированной нагрузки, генерации нагрузки приложений, БД, сети или серверов по реалистичным сценариям ее роста, для измерения, анализа, проверки и отчета о системных ресурсах;
- обеспечение безопасности;
- тестирование производительности, нагрузки и динамический анализ;
- другие инструменты, в т. ч. для проверки правописания и синтаксиса, сетевой безопасности, наличия всех страниц веб-сайта и др.
Перспектива
С изменением тенденций в индустрии ПО процесс его отладки также подвержен изменениям. Существующие новые методы тестирования программных продуктов, такие как сервис-ориентированнае архитектура (SOA), беспроводные технологии, мобильные услуги и т. д., открыли новые способы проверки ПО. Некоторые из изменений, которые ожидаются в этой отрасли в течение следующих нескольких лет, перечислены ниже:
- тестировщики будут предоставлять легковесные модели, с помощью которых разработчики смогут проверять свой код;
- разработка методов тестирования, включающих просмотр и моделирование программ на раннем этапе, позволит устранить многие противоречия;
- наличие множества тестовых перехватов сократит время обнаружения ошибок;
- статический анализатор и средства обнаружения будут применяться более широко;
- применение полезных матриц, таких как охват спецификации, охват модели и покрытие кода, будет определять разработку проектов;
- комбинаторные инструменты позволят тестировщикам определять приоритетные направления отладки;
- тестировщики будут предоставлять более наглядные и ценные услуги на протяжении всего процесса разработки ПО;
- отладчики смогут создавать средства и методы тестирования программного обеспечения, написанные на и взаимодействующие с различными языками программирования;
- специалисты по отладке станут более профессионально подготовленными.
На смену придут новые бизнес-ориентированные методы тестирования программ, изменятся способы взаимодействия с системами и предоставляемой ими информацией с одновременным снижением рисков и ростом преимуществ от бизнес-изменений.