• Технологический процесс тестирования. Почему тестирование необходимо

    | Планирование уроков на учебный год | Основные этапы моделирования

    Урок 2
    Основные этапы моделирования





    Изучив эту тему, вы узнаете:

    Что такое моделирование;
    - что может служить прототипом для моделирования;
    - какое место занимает моделирование в деятельности человека;
    - каковы основные этапы моделирования;
    - что такое компьютерная модель;
    - что такое компьютерный эксперимент.

    Компьютерный эксперимент

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

    В школе вы проводите опыты на уроках биологии, химии, физики, географии.

    Эксперименты проводят при испытании новых образцов продукции на предприятиях. Обычно для этого используется специально создаваемая установка, позволяющая провести эксперимент в лабораторных условиях, либо сам реальный продукт подвергается всякого рода испытаниям (натурный эксперимент). Для исследования, к примеру, эксплуатационных свойств какого-либо агрегата или узла его помещают в термостат, замораживают в специальных камерах, испытывают на вибростендах, роняют и т. п. Хорошо, если это новые часы или пылесос - не велика потеря при разрушении. А если самолет или ракета?

    Лабораторные и натурные эксперименты требуют больших материальных затрат и времени, но их значение, тем не менее, очень велико.

    С развитием компьютерной техники появился новый уникальный метод исследования - компьютерный эксперимент. В помощь, а иногда и на смену экспериментальным образцам и испытательным стендам во многих случаях пришли компьютерные исследования моделей. Этап проведения компьютерного эксперимента включает две стадии: составление плана эксперимента и проведение исследования.

    План эксперимента

    План эксперимента должен четко отражать последовательность работы с моделью. Первым пунктом такого плана всегда является тестирование модели. 

    Тестирование - процесс проверки правильности построенной модели.

    Тест - набор исходных данных, позволяющий определить пра- - вильность построения мЪдели.

    Чтобы быть уверенным в правильности получаемых результатов моделирования, надо: ♦ проверить разработанный алгоритм построения модели; ♦ убедиться, что построенная модель правильно отражает свойства оригинала, которые учитывались при моделировании.

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

    Например, если вы используете при моделировании расчетные формулы, то надо подобрать несколько вариантов исходных данных и просчитать их «вручную». Это тестовые задания. Когда модель построена, вы проводите тестирование с теми же вариантами исходных данных и сравниваете результаты моделирования с выводами, полученными расчетным путем. Если результаты совпадают, то алгоритм разработан верно, если нет - надо искать и устранять причину их расхождения. Тестовые данные могут совершенно не отражать реальную ситуацию и не нести смыслового содержания. Однако полученные в процессе тестирования результаты могут натолкнуть вас на мысль об изменении исходной информационной или знаковой модели, прежде всего в той ее части, где заложено смысловое содержание.

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

    Проведение исследования

    После тестирования, когда у вас появилась уверенность в правильности построенной модели, можно переходить непосредственно к проведению исследования. 

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

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

    Рис. 11.7. Схема компьютерного эксперимента

    Анализ результатов моделирования

    Конечная цель моделирования - принятие решения, которое должно быть выработано на основе всестороннего анализа результатов моделирования. Этот этап решающий - либо вы продолжаете исследование, либо заканчиваете. На рисунке 11.2 видно, что этап анализа результатов не может существовать автономно. Полученные выводы часто способствуют проведению дополнительной серии экспериментов, а подчас и изменению задачи.

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

    Главное, надо всегда помнить: выявленная ошибка - тоже результат. Как гласит народная мудрость, на ошибках учатся. Об этом писал и великий русский поэт А. С. Пушкин:

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

    Контрольные вопросы и задания

    1. Назовите два основных типа постановки задач моделирования.

    2. В известном «Задачнике» Г. Остера есть следущая задача:

    Злая колдунья, работая не покладая рук, превращает в гусениц по 30 принцесс в день. Сколько дней ей понадобится, чтобы превратить в гусениц 810 принцесс? Сколько принцесс в день придется превращать в гусениц, чтобы управиться с работой за 15 дней?
    Какой вопрос можно отнести к типу «что будет, если...», а какой - к типу «как сделать, чтобы...»?

    3. Перечислите наиболее известные цели моделирования.

    4. Формализуйте шутливую задачу из «Задачника» Г. Остера:

    Из двух будок, находящихся на расстоянии 27 км одна от другой, навстречу друг другу выскочили в одно и то же время две драчливые собачки. Первая бежит со скоростью 4 км/час, а вторая - 5 км/час.
    Через сколько времени начнется драка? 

    5. Назовите как можно больше характеристик объекта «пара ботинок ». Составьте информационную модель объекта для разных целей:

    ■ выбор обуви для туристского похода; ■ подбор подходящей коробки для обуви; ■ покупка крема для ухода за обувью.


    6. Какие характеристики подростка существенны для рекомендации по выбору профессии?

    7. По каким причинам компьютер широко используется в моделировании?

    8. Назовите известные вам инструменты компьютерного моделирования.

    9. Что такое компьютерный эксперимент? Приведите пример.

    10. Что такое тестирование модели?

    11. Какие ошибки встречаются в процессе моделирования? Что надо делать, когда ошибка обнаружена?

    12. В чем заключается анализ результатов моделирования? Какие выводы обычно делаются?

    Аннотация: Основные понятия тестирования. Фазы и этапы тестирования. Типы тестов. Разработка, управляемая тестами (Test Driven Development)

    Введение

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

    С технической точки зрения тестирование заключается в выполнении приложения на некотором множестве исходных данных и сверке получаемых результатов с заранее известными (эталонными) с целью установить соответствие различных свойств и характеристик приложения заказанным свойствам. Как одна из основных фаз процесса разработки программного продукта ( Дизайн приложения - Разработка кода - Тестирование), тестирование характеризуется достаточно большим вкладом в суммарную трудоемкость разработки продукта. Широко известна оценка распределения трудоемкости между фазами создания программного продукта: 40%-20%-40%.

    С точки зрения математики тестирование можно рассматривать как интерпретацию некоторой формулы и проверки ее истинности на некоторых множествах. Действительно, программу можно представить в виде формулы f = f1* f2* f3*... * fn , где f1 , f 2 , ... fn - операторы языка программирования, а их суперпозиция - программа .

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

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

    Статическое тестирование выявляет формальными методами анализа без выполнения тестируемой программы неверные конструкции или неверные отношения объектов программы (ошибки формального задания) с помощью специальных инструментов контроля кода - CodeChecker.

    Динамическое тестирование (собственно тестирование) осуществляет выявление ошибок только на выполняющейся программе с помощью специальных инструментов автоматизации тестирования - Testbed или Testbench.

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

    Классы критериев тестирования

    Структурные критерии используют информацию о структуре программы (критерии так называемого "белого ящика"), что предполагает знание исходного текста программы или спецификации программы в виде потокового графа управления. Структурные критерии базируются на основных элементах графа управления - операторах, ветвях и путях.

    • Условие критерия тестирования команд (критерий С0) - набор тестов в совокупности должен обеспечить прохождение каждой команды не менее одного раза.
    • Условие критерия тестирования ветвей (критерий С1) - набор тестов в совокупности должен обеспечить прохождение каждой ветви не менее одного раза.
    • Условие критерия тестирования путей (критерий С2) - набор тестов в совокупности должен обеспечить прохождение каждого пути не менее 1 раз.

    Функциональные критерии формулируются в описании требований к программному изделию (критерии так называемого "черного ящика") Они обеспечивают, прежде всего, контроль степени выполнения требований заказчика в программном продукте. Поскольку требования формулируются к продукту в целом, они отражают взаимодействие тестируемого приложения с окружением. Проблема функционального тестирования - это прежде всего трудоемкость; дело в том, что документы, фиксирующие требования к программному изделию, как правило, достаточно объемны, тем не менее соответствующая проверка должна быть всеобъемлющей.

    Выделяют следующие частные виды функциональных критериев :

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

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

    Мутационные критерии ориентированы на проверку свойств программного изделия на основе подхода Монте-Карло.

    Метод мутационного тестирования состоит в том, что в разрабатываемую программу P вносят мутации (мелкие ошибки), т.е. искусственно создают программы- мутанты P1, P2... . Затем программа P и ее мутанты тестируются на одном и том же наборе тестов (X, Y).

    Если на наборе (X, Y) подтверждается правильность программы P и, кроме того, выявляются все внесенные в программы- мутанты ошибки, то набор тестов (X, Y) соответствует мутационному критерию, а тестируемая программа объявляется правильной. Если некоторые мутанты не выявили всех мутаций, то надо расширять набор тестов (X, Y) и продолжать тестирование.

    Фазы тестирования

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

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

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

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

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

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

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

    Каждая фаза тестирования включает в себя следующие этапы:

    1. Определение целей (требований к тестированию), включающее следующую конкретизацию: какие части системы будут тестироваться, какие аспекты их работы будут выбраны для проверки, каково желаемое качество и т. п.
    2. Планирование : создание графика (расписания) разработки тестов для каждой тестируемой подсистемы; оценка необходимых человеческих, программных и аппаратных ресурсов; разработка расписания тестовых циклов . Важно отметить, что расписание тестирования обязательно должно быть согласовано с расписанием разработки создаваемой системы.
    3. Разработка тестов (тестового кода для тестируемой системы).
    4. Выполнение тестов : реализация тестовых циклов .
    5. Анализ результатов .

    Тестовый цикл - это цикл исполнения тестов, включающий фазы 4 и 5 тестового процесса. Тестовый цикл заключается в прогоне разработанных тестов на некотором однозначно определяемом срезе системы (состоянии кода разрабатываемой системы). Обычно такой срез системы называют build .

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

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

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

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

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

    Типы тестов

    В тестовом плане определяются и документируются различные типы тестов .

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

    1. Тестирование основной функциональности, когда тестированию подвергается собственно система, являющаяся основным выпускаемым продуктом.
    2. Тестирование инсталляции включает тестирование сценариев первичной инсталляции системы, сценариев повторной инсталляции (поверх уже существующей копии), тестирование деинсталляции, тестирование инсталляции в условиях наличия ошибок в инсталлируемом пакете, в окружении или в сценарии и т. п.
    3. Тестирование пользовательской документации включает проверку полноты и понятности описания правил и особенностей использования продукта, наличие описания всех сценариев и функциональности, синтаксис и грамматику языка, работоспособность примеров и т. п.

    Типы тестирования по способу выбора входных значений:

    1. Функциональное тестирование, при котором проверяется:
      • покрытие функциональных требований;
      • покрытие сценариев использования.
    2. Стрессовое тестирование, при котором проверяются экстремальные режимы использования продукта.
    3. Тестирование граничных значений.
    4. Тестирование производительности.
    5. Тестирование на соответствие стандартам.
    6. Тестирование совместимости с другими программно-аппаратными комплексами.
    7. Тестирование работы с окружением.
    8. Тестирование работы на конкретной платформе.

    Test Driven Development

    Рассмотрим подход к тестированию, несколько отличающийся от приведенного выше. Разработка через тестирование ( Test Driven Development - TDD) - процесс разработки программного обеспечения, который предусматривает написание и автоматизацию модульных тестов еще до момента написания соответствующих классов или модулей. Это гарантирует, что все обязанности любого элемента программного обеспечения определяются еще до того, как они будут закодированы.

    TDD задает следующий порядок этапов программирования:

    • Красный - напишите небольшой тест, который не работает, а возможно, даже не компилируется.
    • Зеленый - заставьте тест работать как можно быстрее, при этом не думайте о правильности дизайна и чистоте кода. Напишите ровно столько кода, чтобы тест сработал.
    • Рефакторинг - удалите из написанного вами кода любое дублирование.
    • Освоив TDD, разработчики обнаруживают, что они пишут значительно больше тестов, чем раньше, и двигаются вперед маленькими шагами, которые раньше могли показаться бессмысленными.

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

    Определенно существуют задачи, которые невозможно (по крайней мере на текущий момент) решить только при помощи тестов. В частности, TDD не позволяет механически продемонстрировать адекватность разработанного кода в области безопасности данных и взаимодействия между процессами. Безусловно, безопасность основана на коде, в котором не должно быть дефектов, однако она основана также на участии человека в процедурах защиты данных. Тонкие проблемы, возникающие в области взаимодействия между процессами, невозможно с уверенностью воспроизвести, просто запустив некоторый код.

    Итоги

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

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

    Кроме того, продолжаются исследования в области тестов, ориентированных на конкретную модель разработки (водопадную, спиральную) или на конкретную парадигму программирования. Например, для тестирования компонентно-ориентированных систем предлагается тестирование при помощи агентов. Для тестирования активных Java-апплетов предлагают использовать нейросети. Для тестирования агентов, существующих в web (роботы, пауки), предлагают использовать системы, основанные на знаниях.

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

  • Тестирование веб-сервисов
  • Самый лучший способ оценить, хорошо ли мы протестировали продукт – проанализировать пропущенные дефекты. Те, с которыми столкнулись наши пользователи, внедренцы, бизнес. По ним можно многое оценить: что мы проверили недостаточно тщательно, каким областям продукта стоит уделить больше внимания, какой вообще процент пропусков и какова динамика его изменений. С этой метрикой (пожалуй, самой распространённой в тестировании) всё хорошо, но… Когда мы выпустили продукт, и узнали о пропущенных ошибках, может быть уже слишком поздно: на “хабре” появилась про нас гневная статья, конкуренты стремительно распространяют критику, клиенты потеряли к нам доверие, руководство недовольно.

    Чтобы такого не происходило, мы обычно заранее, до релиза, стараемся оценивать качество тестирования: насколько хорошо и тщательно мы проверяем продукт? Каким областям не хватает внимания, где основные риски, какой прогресс? И чтобы ответить на все эти вопросы, мы оцениваем тестовое покрытие.

    Зачем оценивать?

    Любые метрики оценки – трата времени. В это время можно тестировать, заводить баги, готовить автотесты. Какую такую магическую пользу мы получаем благодаря метрикам тестового покрытия, чтобы пожертвовать временем на тестирование?
    1. Поиск своих слабых зон. Естественно, это нам нужно? не чтобы просто погоревать, а чтобы знать, где требуются улучшения. Какие функциональные области не покрыты тестами? Что мы не проверили? Где наибольшие риски пропуска ошибок?
    2. Редко по результатам оценки покрытия мы получаем 100%. Что улучшать? Куда идти? Какой сейчас процент? Как мы его повысим какой-либо задачей? Как быстро мы дойдём до 100? Все эти вопросы приносят прозрачности и понятности нашему процессу , а ответы на них даёт оценка покрытия.
    3. Фокус внимания. Допустим, в нашем продукте около 50 различных функциональных зон. Выходит новая версия, и мы начинаем тестировать 1-ю из них, и находим там опечатки, и съехавшие на пару пикселей кнопки, и прочую мелочь… И вот время на тестирование завершено, и эта функциональность проверена детально… А остальные 50? Оценка покрытия позволяет нам приоритезировать задачи исходя из текущих реалий и сроков.

    Как оценивать?

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

    Оцениваем покрытие требований тестами

    Допустим, у вас в команде есть аналитики, и они не зря тратят своё рабочее время. По результатам их работы созданы требования в RMS (Requirements Management System) – HP QC, MS TFS, IBM Doors, Jira (с доп. плагинами) и т.д. В эту систему они вносят требования, соответствующие требованиям к требованиям (простите за тавтологию). Эти требования атомарны, трассируемы, конкретны… В общем, идеальные условия для тестирования. Что мы можем сделать в таком случае? При использовании скриптового подхода – связывать требования и тесты. Ведём в той же системе тесты, делаем связку требование-тест, и в любой момент можем посмотреть отчёт, по каким требованиям тесты есть, по каким – нет, когда эти тесты были пройдены, и с каким результатом.
    Получаем карту покрытия, все непокрытые требования покрываем, все счастливы и довольны, ошибок не пропускаем…

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

    Проблема: требования не атомарны.

    Аналитики тоже иногда грешат винегретом в голове, и обычно это чревато проблемами со всем проектом. Например, вы разрабатываете текстовый редактор, и у вас могут быть в системе (в числе прочих) заведены два требования: «должно поддерживаться html-форматирование» и «при открытии файла неподдерживаемого формата, должно появляться всплывающее окно с вопросом». Сколько тестов требуется для базовой проверки 1-го требования? А для 2-го? Разница в ответах, скорее всего, примерно в сто раз!!! Мы не можем сказать, что при наличии хотя бы 1-го теста по 1-му требованию, этого достаточно – а вот про 2-е, скорее всего, вполне.

    Таким образом, наличие теста на требование нам вообще ничего не гарантирует! Что значит в таком случае наша статистика покрытия? Примерно ничего! Придётся решать!

    1. Автоматический расчёт покрытия требований тестами в таком случае можно убрать – он смысловой нагрузки всё равно не несёт.
    2. По каждому требованию, начиная с наиболее приоритетных, готовим тесты. При подготовке анализируем, какие тесты потребуются этому требованию, сколько будет достаточно? Проводим полноценный тест-анализ, а не отмахиваемся «один тест есть, ну и ладно».
    3. В зависимости от используемой системы, делаем экспорт/выгрузку тестов по требованию и… проводим тестирование этих тестов! Достаточно ли их? В идеале, конечно, такое тестирование нужно проводить с аналитиком и разработчиком этой функциональности. Распечатайте тесты, заприте коллег в переговорке, и не отпускайте, пока они не скажут «да, этих тестов достаточно» (такое бывает только при письменном согласовании, когда эти слова говорятся для отписки, даже без анализа тестов. При устном обсуждении ваши коллеги выльют ушат критики, пропущенных тестов, неправильно понятых требований и т.д. – это не всегда приятно, но для тестирования очень полезно!)
    4. После доработки тестов по требованию и согласования их полноты, в системе этому требованию можно проставить статус «покрыто тестами». Эта информация будет значить значительно больше, чем «тут есть хотя бы 1 тест».

    Конечно, такой процесс согласования требует немало ресурсов и времени, особенно поначалу, до наработки практики. Поэтому проводите по нему только высокоприоритетные требования, и новые доработки. Со временем и остальные требования подтянете, и все будут счастливы! Но… а если требований нет вообще?

    Проблема: требований нет вообще.

    Они на проекте отсутствуют, обсуждаются устно, каждый делает, что хочет/может и как он понимает. Тестируем так же. Как результат, получаем огромное количество проблем не только в тестировании и разработке, но и изначально некорректной реализации фич – хотели совсем другого! Здесь я могу посоветовать вариант «определите и задокументируйте требования сами», и даже пару раз в своей практике использовала эту стратегию, но в 99% случаев таких ресурсов в команде тестирования нет – так что пойдём значительно менее ресурсоёмким путём:
    1. Создаём фичелист (feature list). Сами! В виде google-таблички, в формате PBI в TFS – выбирайте любой, лишь бы не текстовый формат. Нам ещё статусы собирать надо будет! В этот список вносим все функциональные области продукта, и постарайтесь выбрать один общий уровень декомпозиции (вы можете выписать объекты ПО, или пользовательские сценарии, или модули, или веб-страницы, или методы API, или экранные формы…) – только не всё это сразу! ОДИН формат декомпозиции, который вам проще и нагляднее всего позволит не пропустить важное.
    2. Согласовываем ПОЛНОТУ этого списка с аналитиками, разработчиками, бизнесом, внутри своей команды… Постарайтесь сделать всё, чтобы не потерять важные части продукта! Насколько глубоко проводить анализ – решать вам. В моей практике всего несколько раз были продукты, на которые мы создали более 100 страниц в таблице, и это были продукты-гиганты. Чаще всего, 30-50 строк – достижимый результат для последующей тщательной обработки. В небольшой команде без выделенных тест-аналитиков большее число элементов фичелиста будет слишком сложным в поддержке.
    3. После этого, идём по приоритетам, и обрабатываем каждую строку фичелиста как в описанном выше разделе с требованиями. Пишем тесты, обсуждаем, согласовываем достаточность. Помечаем статусы, по какой фиче тестов хватает. Получаем и статус, и прогресс, и расширение тестов за счёт общения с командой. Все счастливы!

    Но… Что делать, если требования ведутся, но не в трассируемом формате?

    Проблема: требования не трассируемы.

    На проекте есть огромное количество документации, аналитики печатают со скоростью 400 знаков в минуту, у вас есть спецификации, ТЗ, инструкции, справки (чаще всего это происходит по просьбе заказчика), и всё это выступает в роли требований, и на проекте уже все давно запутались, где какую информацию искать?
    Повторяем предыдущий раздел, помогая всей команде навести порядок!
    1. Создаём фичелист (см. выше), но без детального описания требований.
    2. По каждой фиче собираем воедино ссылки на ТЗ, спецификации, инструкции, и прочие документы.
    3. Идём по приоритетам, готовим тесты, согласовываем их полноту. Всё то же самое, только благодаря объединению всех документов в одну табличку повышаем простоту доступа к ним, прозрачные статусы и согласованность тестов. В итоге, у нас всё супер, и все счастливы!

    Но… Ненадолго… Кажется, за прошлую неделю аналитики по обращениям заказчиков обновили 4 разные спецификации!!!

    Проблема: требования всё время меняются.

    Конечно, хорошо бы тестировать некую фиксированную систему, но наши продукты обычно живые. Что-то попросил заказчик, что-то изменилось во внешнем к нашему продукту законодательстве, а где-то аналитики нашли ошибку анализа позапрошлого года… Требования живут своей жизнью! Что же делать?
    1. Допустим, у вас уже собраны ссылки на ТЗ и спецификации в виде фичелиста-таблицы, PBI, требований, заметок в Wiki и т.д. Допустим, у вас уже есть тесты на эти требования. И вот, требование меняется! Это может означать изменение в RMS, или задачу в TMS (Task Management System), или письмо в почте. В любом случае, это ведёт к одному и тому же следствию: ваши тесты неактуальны! Или могут быть неактуальны. А значит, требуют обновления (покрытие тестами старой версии продукта как-то не очень считается, да?)
    2. В фичелисте, в RMS, в TMS (Test Management System – testrails, sitechco, etc) тесты должны быть обязательно и незамедлительно помечены как неактуальные! В HP QC или MS TFS это можно делать автоматически при обновлении требований, а в google-табличке или wiki придётся проставлять ручками. Но вы должны видеть сразу: тесты неактуальны! А значит, нас ждёт полный повторный путь: обновить, провести заново тест-анализ, переписать тесты, согласовать изменения, и только после этого пометить фичу/требование снова как «покрыто тестами».

    В этом случае мы получаем все бенефиты оценки тестового покрытия, да ещё и в динамике! Все счастливы!!! Но…
    Но вы так много внимания уделяли работе с требованиями, что теперь вам не хватает времени либо на тестирование, либо на документирование тестов. На мой взгляд (и тут есть место религиозному спору!) требования важнее тестов, и уж лучше так! Хотя бы они в порядке, и вся команда в курсе, и разработчики делают именно то, что нужно. НО НА ДОКУМЕНТИРОВАНИЕ ТЕСТОВ ВРЕМЕНИ НЕ ОСТАЁТСЯ!

    Проблема: не хватает времени документировать тесты.

    На самом деле, источником этой проблемы может быть не только нехватка времени, но и ваш вполне осознанный выбор их не документировать (не любим, избегаем эффекта пестицида, слишком часто меняется продукт и т.д.). Но как оценивать покрытие тестами в таком случае?
    1. Вам всё равно нужны требования, как полноценные требования или как фиче-лист, поэтому какой-то из вышеописанных разделов, в зависимости от работы аналитиков на проекте, будет всё равно необходим. Получили требования / фичелист?
    2. Описываем и устно согласовываем вкратце стратегию тестирования, без документирования конкретных тестов! Эта стратегия может быть указана в столбце таблицы, на странице вики или в требовании в RMS, и она должна быть опять же согласована. В рамках этой стратегии проверки будут проводиться по-разному, но вы будете знать: когда это последний раз тестировалось и по какой стратегии? А это уже, согласитесь, тоже неплохо! И все будут счастливы.

    Но… Какое ещё «но»? Какое???

    Говорите, все обойдём, и да пребудут с нами качественные продукты!

    Почему тестирование необходимо?

    В этом разделе мы рассмотрим самые базовые понятия и принципы, которые используются в процессе тестирования. Мы узнаем, что же, собственно, собой представляет тестирование, зачем оно нужно и кто им занимается. Рассмотрим цели, принципы и основные этапы тестирования. Почувствуем, каким должен быть психологический настрой настоящего тестировщика и развенчаем напоследок несколько мифов о тестировании. Уверены, Вам будет интересно.
    Начнем с того, что же такое «тестирование». Для начала, давайте абстрагируемся от сухих академических определений и посмотрим на это понятие с точки зрения повседневного использования.
    Когда мы что-то тестируем, то задаем себе простой вопрос: «работает ли это так, как мы ожидаем?» или, другими словами: соответствует ли реальное поведение объекта тестирования нашим ожиданиям? Если ответ положительный – замечательно, если нет, – мы обмануты в своих ожиданиях, а значит что-то нужно исправлять.
    Тестирование необходимо потому, что все мы совершаем ошибки. Некоторые из них могут быть незначительными, в то время как другие – иметь самые разрушительные последствия. Все, что производится человеком, может содержать ошибки (так уж мы, люди, устроены). Именно поэтому любой продукт нуждается в проверке – тестировании, прежде чем его можно будет эффективно и безопасно использовать.
    То же самое справедливо и для программного обеспечения (англ. Software).
    Программное обеспечение (Software) – компьютерные программы, функции, а также сопровождающая их документация и данные, имеющие отношение к эксплуатации компьютерной системы.
    Компьютерные технологии все глубже проникают в нашу повседневную жизнь. Программное обеспечение управляет работой множества окружающих нас вещей – от мобильных телефонов и компьютеров до стиральных машин и кредитных карт. В любом случае, все мы сталкивались с теми или иными ошибками в программах: текстовый редактор, намертво зависший при работе над дипломным проектом, банкомат, «съевший» карточку или просто сайт, который никак не загрузится – все это отнюдь не облегчает нам жизнь.
    Однако не все ошибки одинаково опасны – для разных программных систем уровни риска могут отличаться.
    Риск (risk):
    – фактор, который может привести к негативным последствиям в будущем; как правило, выражается через вероятность наступления таких последствий и их влияние на систему.
    – то, что еще не произошло, и может вообще не произойти; потенциальная проблема.
    Кроме того, уровень риска будет зависеть от вероятности наступления негативных последствий.
    К примеру, одна и та же незначительная ошибка, скажем опечатка, может иметь совершенно разные уровни риска для разных программ:
    – опечатка в описании интересов на персональной страничке в социальной сети вряд ли будет иметь существенные последствия, разве что вызовет улыбку у Ваших друзей;
    – такая же простая опечатка, допущенная в описании деятельности крупной компании, размещенном на ее сайте, уже опасна, так как косвенно свидетельствует о непрофессионализме ее сотрудников;
    – опечатка в коде программы, которая подсчитывает уровни облучения при работе рентгеновского аппарата (например, 100 вместо 10) может иметь самые печальные последствия – вред, нанесенный здоровью и безопасности людей, выльется в потерю доверия к компании и судебные иски со многими нулями.

    Ваша цель как системного администратора
    состоит во внедрении эффективных стратегий для
    максимизации своих компьютерных ресурсов.


    Д. Гантер, С. Барнет, Л. Гантер.
    Интеграция Windows NT и Unix

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

    Что и зачем тестируется

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

    Итак, какие факторы учитываются в таких случаях, что является объектом исследований и какого рода испытания наиболее популярны?

    Критерии тестирования обычно таковы:

    • функциональные возможности продукта;
    • простота освоения;
    • легкость установки;
    • качество документации и поддержки;
    • производительность;
    • для аппаратуры иногда учитывается конструктивное исполнение.

    Встречаются и весьма двусмысленные критерии. Не так давно в одном из обзоров Web-серверов при выставлении общей оценки в качестве положительного фактора рассматривалась "высокая степень интеграции с операционной системой". Но если сбой приложения вызывает сбой операционной системы (вероятность чего пропорциональна степени интегрированности) — то такое ли уж это преимущество?

    Равна ли сотня кроликов одному тигру?

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

    Типичный пример — сравнение старших моделей систем на процессорах Intel с младшими в линии RISC-платформ. Да, действительно, в заданном ценовом диапазоне машины с Intel-архитектурой сопоставимы или, в некоторых случаях, даже превосходят RISC-системы. Однако то, что является потолком для одних платформ, — лишь начальный уровень для других и т. д.

    Выводы: относитесь критически к критериям, по которым оценивается продукт, — у вас и у тестеров могут оказаться разные вкусы. Попробуйте сказать приверженцам Unix, что ради удобства графического интерфейса конфигурирования системы стоит смириться с необходимостью перезагрузки после изменения IP-параметров. Что же касается компактности исполнения системного блока, то это хорошо до тех пор, пока вам не понадобится вставить в slim-корпус дополнительный винчестер.

    Одним словом — переосмысливайте результаты тестов в соответствии со своими нуждами.

    Специфика тестирования серверов

    Если компьютер не включается — он неисправен.
    Если не выключается — он сервер.
    Народная примета

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

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

    И наконец, характерной особенностью функционирования серверов является наличие пиковых нагрузок. Причины их появления могут быть самыми разными — от начала рабочего дня в большой организации (особенно если все пользователи приходят на работу вовремя) до восстановления "упавшего" соединения у поставщика услуг Internet, когда на коммуникационные серверы обрушиваются накопившаяся почта и группы новостей.

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

    К сожалению, большинство обзоров, публикуемых в компьютерной периодике, посвящено либо сопоставлению производительности разных аппаратных решений на наборе тестовых задач, выполняемых последовательно, либо сравнительному тестированию того или иного сервиса (например, испытание Web-серверов разных производителей). Один из наихудших вариантов такого подхода — когда сравнительный обзор возможностей аналогичных решений называют тестированием только потому, что автор публикации провел инсталляцию и немного "погонял" продукт.

    Условия проведения тестирования

    Для начала немного теории. Гленфорд Майерс в своей работе "Надежность программного обеспечения" приводит несколько "аксиом тестирования". Попробуем, следуя им, рассмотреть, что и как надо тестировать.

    Время от времени в компьютерной прессе появляются сообщения почти спортивного характера: продукт фирмы N показал рекордное быстродействие в тесте M. Насколько информативны тесты, проведенные фирмами-производителями?

    Невозможно тестировать свою собственную программу

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

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

    С таким явлением автор столкнулся, пытаясь настроить Netscape Enterprise Web Server под Solaris (SPARC). Производительность сервера по http-протоколу удалось поднять почти в 6 (!) раз (по данным тестирования с MS InetLoad), однако на комплексном тесте увеличение оказалось трехкратным, в то время как быстродействие POP3-сервера возросло вдвое, News-сервера — осталось неизменным, а SMTP показал в два раза худшие результаты, чем до внесения изменений.

    Кроме того, производители, зная характеристики того или иного тестового набора, могут оптимизировать параметры системы именно под него. Пример тому — Web-страничка Netscape, где приведены рекомендации, как настроить Netscape Enterprise Server для проведения тестирования с помощью SPECweb96 .

    Тестирование проводится для обнаружения ошибок

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

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

    Здесь уместны два примечания:

    1. Модель поведения пользователя.

    По отношению к пользователям администратор должен быть пессимистом. Соответственно должно строиться и тестирование "на выживание".

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

    2. Сервис перестал справляться с обработкой запросов: возможные варианты.

    По степени серьезности такие отказы можно разделить на 4 группы:

    • снижение производительности — сервис не успевает провести обработку, но отвечает корректно (возвращает соответствующий код ошибки — "Too many connections" и т. п.);
    • аварийное завершение работы сервиса, не влекущее за собой негативных последствий для системы: соответствующая программа завершила работу, выгружена из памяти, системные ресурсы освобождены;
    • аварийное завершение работы сервиса, отрицательно влияющее на производительность системы. Программа либо "висит" в списке процессов, не высвобождая ресурсы, либо в процессе завершения захватывает дополнительные ресурсы;
    • крах системы — в лучшем случае с последующей перезагрузкой, в худшем — с зависанием.

    Готовьте тесты как для правильных, так и для неправильных входных данных

    Эта аксиома детализирует предыдущую с точки зрения входных информационных потоков.

    Как отреагирует система на отправление письма размером несколько десятков мегабайт? Застрянет ли оно в очереди, заблокировав тем самым на неопределенное время вашу почтовую систему (особенно если связь с хостом-получателем регулярно обрывается), или будет уничтожено, а пользователь уведомлен о недопустимости таких действий?

    Совет, взятый из той же книги Г. Майерса: "старайтесь, чтобы система не рассердила пользователя, ибо это может привести к некоторым неожиданным ситуациям на входе — правило # 5 минимизации ошибок пользователя в диалоговых системах. Быть пессимистом — не значит быть мизантропом!".

    А как насчет news-сервера — установлен ли там максимальный размер статьи?

    Может ли кто-то, вознамерившись загрузить половину вашего FTP-сайта, открыть три десятка параллельных ftp-сессий, и если да, то как это повлияет на ваш канал и работу других желающих посетить FTP?

    В качестве примера, подтверждающего корректность такого подхода, можно упомянуть инцидент с ракетным крейсером Yorktown, где ошибка ввода оператора повлекла за собой отказ системы управления двигателями . Или еще один, приведенный самим Майерсом: "Операторы Нью-Йоркской системы диспетчеризации полицейских машин SPRINT в свободное время развлекались тем, что пытались вывести ее из строя, вводя заведомо неправильные сообщения". Это происходило в начале 70-х. Может, с тех пор нравы и смягчились, но это маловероятно.

    Избегайте невоспроизводимых тестов

    В случае тестирования серверов и серверного ПО эта аксиома особенно актуальна. Во-первых, для их тестирования необходимо наличие аппаратно разделенных генераторов нагрузки (Client-Side Load Generators, CSLG) — обычно это группы рабочих станций, выполняющих клиентскую часть теста и обеспечивающих поток запросов на сервер. Во-вторых, на результаты может повлиять состояние сети, соединяющей сервер и CSLG. Кроме того, во многих случаях производительность зависит от предыстории обращений к серверу. Большинство серверных приложений использует кэширование. Скорость обращения к кэш-памяти значительно выше скорости обращения к дисковой подсистеме. Кэш приложения может наполняться вследствие предварительных или отладочных прогонов тест-программ — и соответственно могут меняться результаты. Более того, при комплексном тестировании возможно перекрестное влияние приложений — так, количество обработанных за единицу времени сложных запросов к POP3- или IMAP-серверам зависит от размера почтового спула, который может быть увеличен предыдущим проведением SMTP-теста. И наконец, на производительность влияют настройки операционной системы.

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

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

    • вы планируете расширить вашу сеть, что приведет к повышению нагрузки на размещенные в ней серверы;
    • вы намереваетесь обновить (или сменить) программное обеспечение;
    • вы решили сменить ваш сервер (или серверы) на более производительные;
    • наконец, может быть, вы просто решили выяснить "пределы роста" вашей системы.

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