Оценка стоимости и причины ошибок в программном обеспечении это

Экспертиза стоимости программного обеспечения

Мы предлагаем:

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

Вы получаете:

  • Полное понимание реальной инвестиционной, рыночной, ликвидационной и учетной (балансовой) стоимости программного продукта.

Экспертиза стоимости программного обеспечения - изображение услуги


Не продавайте ПО за бесценок!

Эксперты по оценке стоимости ПО

Эксперт по оценке стоимости ПО Музалевский Федор Александрович

Музалевский Федор Александрович

Ведущий эксперт компьютерно-технического направления

Опыт: Экспертная работа с 2010 года. Педагогический стаж с 2012 года. Кандидат физико-математических наук. Доцент кафедры ВМ и ИТ ФГБОУ ВО “ВГУИТ”

Профиль >>

Все эксперты

Эксперт по оценке стоимости ПО Баркалов Юрий Михайлович

Баркалов Юрий Михайлович

Эксперт компьютерно-технического направления

Опыт: Экспертная работа с 1993 года. Педагогический стаж с 2011 года.

Профиль >>

Все эксперты

Почему RTM Group

RTM Group экспертная организация №1 по версии Федерального каталога экспертных организаций

В списке SWIFT Directory of CSP assessment providers

В реестре надежных партнеров торгово-промышленной палаты Российской Федерации

Полноправный член «Ассоциации пользователей стандартов по информационной безопасности» (АБИСС)

Входим в рейтинг «Pravo.ru-300» в отрасли Цифровая экономика

Сайт RTM Group входит в тройку лучших юридических сайтов России

В составе ТК №122

Цены на услуги по оценке стоимости ПО

Наименование услуги Стоимость

Консультация

Бесплатно

Оценка стоимости программного обеспечения

от

100 000
руб.

Работаем с юридическими лицами, ИП и бюджетными организациями по безналичному расчету.

Наши преимущества

более 1700 экспертиз

по направлению информационных технологий проведено нашими экспертами

Широкая география работы и присутствия

Работа на территории России, Беларуси и Казахстана

100% удовлетворенность заказчиков

Более 80% заказчиков оценивают нашу работу как «отлично». По итогам ежегодного опроса, минимальная оценка — «удовлетворительно»

Услуги для вас


Подборка по базе: Самостоятельная работа 3.1.docx, Практическая работа 3.7.pdf, Самостоятельная работа_Тема 1.2. проект.docx, математика практическая.docx, Контрольная работа 2 класс.docx, Практическая работа .docx, Практическая работа к заданию 2.2.pdf, ПРАКТИЧЕСКАЯ РАБОТА архив.docx, Курсовая работа.docx, Практическая работа №1.docx


Практическая работа №4
Задание 1

Оценка стоимости и причины ошибок в программном обеспечении.

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

1. Повторная спецификация.

2. Повторное проектирование.

3. Повторное кодирование.

4. Повторное тестирование.

5. Замена заказа.

6. Внесение исправлений — выявить и устранить все неточности.

7. Списание той части работы (кода, части проектов и т. п.), которая выполнялась с наилучшими побуждениями, но оказалась ненужной.

8. Отозвание дефектных версий встроенного программного обеспечения и соответствующих руководств.

9. Выплаты по гарантийным обязательствам.

10. Ответственность за изделие, если клиент через суд требует возмещение убытка, причиненного некачественным программным продуктом.

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

12.Создание документации.
Виды и методы тестирования.

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

Некоторые виды тестирования:

  • Модульные тесты.
  • Интеграционное тестирование.
  • Функциональные тесты.
  • Тестирование производительности.

Понятие теста.

Тест — набор из одного или нескольких тест-кейсов.

Поскольку среди всех прочих терминов этот легче и быстрее всего

произносить, в зависимости от контекста под ним могут понимать и отдельный пункт чек-листа, и отдельный шаг в тест-кейсе, и сам тест-кейс, и набор тест — кейсов и… продолжать можно долго. Главное здесь одно: если вы слышите или видите слово «тест», воспринимайте его в контексте.
Правила разработки тестовых сценариев.

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

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

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

Задание 2

Разработан код для последующей интеграции в приложения и проверки вхождения второй строки в первую

Сам код:

Console.WriteLine(«Введите первую строку»);

string s1 =(Console.ReadLine());

Console.WriteLine(«Введите вторую строку»);

string s2 =(Console.ReadLine());

int i = 0;

int x = -1;

int count = -1;

while (i != -1)

{

i = s1.IndexOf(s2, x + 1);

x=i;

count++;

}

Console.WriteLine(count);

Console.ReadLine();

Далее были сделаны 2 тест сценария, содержащий 2 теста. Один из сценариев является успешным, а второй провальным.

Рисунок 1 – успешные тестовые сценарии

Рисунок 2 – провальные тестовые сценарии

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

Зачем его проводить?

виды тестированияТестирование программного обеспечения проводится по нескольким причинам:

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

Виды

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

виды тестирования поТестирование программного обеспечения проводится по нескольким причинам:

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

Виды

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

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

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

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

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

интеграционное тестированиеДругие методы тестирования

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

Завершение жизненного цикла ПО

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

77. Отладка ПО включает в себя

a. Тестирование, локализацию ошибок, редактирование

b. Тестирование, оптимизацию

c. Тестирование, локализацию ошибок, оптимизацию

d. Тестирование, оптимизацию, документирование

78. Основной задачей отладки ПО являются

a. Выявление максимального количества ошибок

b. Определение момента окончания отладки

c. Создание тестов

d. Тестирование и оптимизация ПО

79. Существуют следующие виды отладки:

a. Автономная и комплексная

b. Программная и аппаратная

c. Внешняя и внутренняя

d. Статистическая и вероятностная

80. Автономная отладка не используется для тестирования

a. Программы в целом

b. Модулей

c. Структур данных и классов

d. Интерфейсов

81. Комплексная отладка не применяется для тестирования

a. Внутренних модулей программного средства

b. Документации программного средства

c. Качества программного средства

d. Архитектуры программного средства

82. Характеристика предъявляемая к требованиям к ПО это

a. Корректность

b. Минимальность

c. Фиксированность

d. Наличие пересечений между требованиями

83. Характеристика предъявляемые к требованиям к ПО

a. Полнота

b. Постоянность

c. Отсутствие связей между требованиями

d. Многократное повторение требований

84. Ошибкой при формировании требований к ПО является

a. Описание возможных решений

b. Чёткость требований

c. Отсутствие подробных описаний требований к мелким элементам

d. Прослеживаемость требований

85. Качество технологического процесса непосредственно влияет на качество

a. внутреннее

b. внешнее

c. качество при использовании

d. качество документации

86. При разработке ПО на качество при использовании влияют

a. качество процесса, внутреннее качество, внешнее качество

b. внутреннее качество, внешнее качество, качество документации

c. качество процесса, качество документации

d. внутренне качество, внешнее качество

87. Характеризует ПО с точки зрения его поведения качество

a. внешнее

b. внутреннее

c. качество при использовании

d. качество документации

88. Характеризует ПО по ощущениям пользователей при конкретных сценариях работы

a. качество при использовании

b. внешнее

c. внутреннее

d. качество документации

89. Не существует категорий качества ПО

a. Переносимость и производительность

b. Удобство сопровождения и удобство использования

c. Функциональность и надёжность

d. Доступность и популярность

90. К категории качества ПО «Надёжность» относится характеристика

a. Способность к восстановлению

b. Функциональная пригодность

c. Адаптируемость

d. Удобство изменений

91. К категории качества ПО «Переносимость» относится характеристика

a. Способность к сосуществованию

b. Зрелость

c. Понятность

d. Удобство обучения

92. К категории качества ПО «Функциональность» относится характеристика

a. Защищенность

b. Понятность

c. Временная эфективность

d. Стабильность

93. К категории качества ПО «Удобство использования» относится характеристика

a. Понятность

b. Зрелость

c. Эффективность использования ресурсов

d. Удобство изменений

94. К категории качества ПО «Производительность» относится характеристика

a. Соответствие стандартам

b. Стабильность

c. Адаптируемость

d. Точность

95. К категории качества ПО «Удобство сопровождения» относится характеристика

a. Удобство проверки

b. Понятность

c. Устойчивость к отказам

d. Удобство установки

96. В несколько категорий качества ПО входит характеристика

a. Соответствие стандартам

b. Функциональная пригодность

c. Зрелость

d. Понятность

97. Методами контроля качества ПО являются

a. Верификация и валидация

b. Анализ и синтез

c. Индукция и дедукция

d. Отладка и оптимизация

98. К методам контроля качества ПО не относится

a. Анализ исполняемого файла ПО

b. Выяснение свойств ПО во время его работы

c. Определение качества на основе симуляции работы ПО

d. Анализ проектной документации и исходного кода

99. Не существует метода тестирования ПО

a. Тестирование исходного кода ПО

b. Тестирование чёрного ящика

c. Тестирование белого ящика

d. Тестирование нацеленное на определенные ошибки

100. Не существует вида тестирования ПО

a. процедурное тестирование

b. модульное тестирование

c. интеграционные тестирование

d. системное тестирование

101. К источникам ошибок при программировании не относится

a. Неправильное понимание исходного кода

b. Неправильное понимание задачи

c. Неправильное решение задачи

d. Неправильный перенос решений в код

102. К англоязычным синонимам слова «ошибка» относятся

a. defect, failure, fault, error

b. defect, problem, fault, error

c. defect, failure, problem, error

d. issue, problem, fault, error

103. Не существует человеко-машинный интерфейс

a. Световой

b. Текстовый

c. Тактильный

d. Графический

104. Наиболее сложно проанализировать фактор удобства использования ПО

a. Субъективное удовлетворение пользователей

b. Адекватность интерфейса

c. Производительность работы пользователей

d. Скорость обучения новых пользователей

105. Какой из принципов не повышает удобство пользовательского интерфейса

a. Надёжности

b. Видимости

c. Обратной связи

d. Простоты

106. Ущерб от ошибок пользователя за счёт использоваия принципа

a. Толерантности

b. Обратной связи

c. Видимости

d. Простоты

107. Предоставление наборов возможностей предоставляемых пользователю соответствует правилу

a. Непрерывного развития

b. Толерантности

c. Видимости

d. Простоты

108. Проектирование интерфейса ПО, ориентированное на использование не включает модель

a. Результатов

b. Ролей

c. Задач

d. Содержимого

109. К внешним характеристикам ПО не относится

a. Понятность

b. Эффективность

c. Практичность

d. Адаптируемость

110. К внутренним характеристикам ПО относится

a. Тестируемость

b. Практичность

c. Эффективность

d. Адаптируемость

111. Тестирование ПО производится исполнителями при

a. Альфа-тесте

b. Бета-тесте

c. Внедрении ПО

d. Эксплуатации ПО

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

a. синтаксической

b. орфографической

c. грамматической

d. семантической

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

a. отладкой

b. семантическим анализом

c. тестированием

d. демонстрацией

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

a. тестирования и отладки

b. кодирования программы

c. постановки задачи

d. построения математической модели

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

a. системным тестированием

b. тестированием «чёрного ящика»

c. регрессионным тестированием

d. тестированием «белого ящика»

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

a. регрессионным тестированием

b. тестированием «белого ящика»

c. тестированием «черного ящика»

d. системным тестированием

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

a. альфа-тестированием

b. тестированием «белого ящика»

c. сквозным тестированием

d. бета-тестированием

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

a. бета-тестированием

b. тестированием «белого ящика»

c. сквозным тестированием

d. альфа-тестированием

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

a. ошибки не найдены

b. ошибки найдены

c. ошибки исправлены

d. есть замечания

120. Обязательным критерием качества программных систем является

a. надежность

b. универсальность

c. легкость применения

d. мобильность

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

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

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

Тестирование ПО
— попытка определить, выполняет ли программа то, что от неё ожидают. Как правило, никакое тестирование не может дать абсолютной гарантии работоспособности программы в будущем.

Для наглядности: почти все производители коммерческого ПО исправляют ошибки в своих продуктах.

Например: Корпорация Microsoft выпускает пакеты обновлений («Service Pack»), для своих операционных систем. Разработчики игр регулярно выпускают «патчи» для своих продуктов. Большинство разработчиков ПО после устранения ошибок выпускают обновлённую (новую) версию своей программы.

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

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

По объекту тестирования:

  • Функциональное тестирование (functional testing)
  • Нагрузочное тестирование
    • Тестирование производительности (perfomance/stress testing)
    • Тестирование стабильности (stability/load testing)
  • Тестирование удобства использования (usability testing)
  • Тестирование интерфейса пользователя (UI testing)
  • Тестирование безопасности (security testing)
  • Тестирование локализации (localization testing)
  • Тестирование совместимости (compatibility testing)

По знанию системы:

  • Тестирование чёрного ящика (black box)
  • Тестирование белого ящика (white box)
  • Тестирование серого ящика (gray box)

По степени автоматизированности:

  • Ручное тестирование (manual testing)
  • Автоматизированное тестирование (automated testing)
  • Полуавтоматизированное тестирование (semiautomated testing)

По степени изолированности компонентов:

  • Компонентное (модульное) тестирование (component/unit testing)
  • Интеграционное тестирование (integration testing)
  • Системное тестирование (system/end-to-end testing)

По времени проведения тестирования:

  • Альфа тестирование (alpha testing)
    • Тестирование при приёмке (smoke testing)
    • Тестирование новых функциональностей (new feature testing)
    • Регрессионное тестирование (regression testing)
    • Тестирование при сдаче (acceptance testing)
  • Бета тестирование (beta testing)

По признаку позитивности сценариев:

  • Позитивное тестирование (positive testing)
  • Негативное тестирование (negative testing)

По степени подготовленности к тестированию:

  • Тестирование по документации (formal testing)
  • Эд Хок (интуитивное) тестирование (ad hoc testing)

Уровни тестирования

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

Часто для свободного/открытого ПО стадия Альфа-тестирования характеризует функциональное наполнение кода, а Бета тестирования — стадию исправления ошибок. При этом как правило на каждом этапе разработки промежуточные результаты работы доступны конечным пользователям.

Тестирование «белого ящика» и «чёрного ящика»

В терминологии профессионалов тестирования (программного и некоторого аппаратного обеспечения), фразы «тестирование белого ящика» и «тестирование чёрного ящика» относятся к тому, имеет ли разработчик тестов доступ к исходному коду тестируемого ПО, или же тестирование выполняется через пользовательский интерфейс либо прикладной программный интерфейс, предоставленный тестируемым модулем.

При тестировании белого ящика (англ. white-box testing

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

), при котором тестируются только отдельные части системы. Оно обеспечивает то, что компоненты конструкции — работоспособны и устойчивы, до определённой степени. При тестировании белого ящика используются метрики покрытия кода.

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

Если «альфа-» и «бета-тестирование» относятся к стадиям до выпуска продукта (а также, неявно, к объёму тестирующего сообщества и ограничениям на методы тестирования), тестирование «белого ящика» и «чёрного ящика» имеет отношение к способам, которыми тестировщик достигает цели.

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

Статическое и динамическое тестирование

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

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

Также к статическому тестированию относят тестирование требований, спецификаций, документации.

Регрессионное тестирование

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

Тестовые скрипты

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

Покрытие кода

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

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

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

Разработка через тестирование (test-driven development)

(англ. test-driven development) — техника программирования, при которой модульные тесты для программы или её фрагмента пишутся до самой программы (англ. test-first development) и, по существу, управляют её разработкой. Является одной из основных практик экстремального программирования.

Ни один программист не считает работу над некоторым фрагментом кода завершенной, не проверив перед этим его работоспособность. Однако, если вы тестируете свой код, это не означает, что у вас есть тесты.

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

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

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

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

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

    Разработчику приятнее писать такой код.

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

    Пишем новый код только тогда, когда автоматический код не сработал.

    Удаляем дублирование.

Два столь простых правила на самом деле генерируют сложное индивидуальное и групповое поведение со множеством технических последствий:

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

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

    Наша среда разработки должна быстро реагировать на небольшие модификации кода.

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

Два упомянутых правила TDD определяют порядок этапов программирования:

    Красный — напишите небольшой тест, который не работает, а возможно, даже не компилируется.

    Зеленый — заставьте тест работать как можно быстрее, при этом не думайте о правильности дизайна и чистоте кода. Напишите ровно столько кода, чтобы тест сработал.

    Рефакторинг — удалите из написанного вами кода любое дублирование.

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

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

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

Терминология, связанная с модульными тестами

  • Разработка через тестирование
    — процесс разработки программного обеспечения, который предусматривает написание и автоматизацию модульных тестов еще до момента написания соответствующих классов или модулей. Это гарантирует, что все обязанности любого элемента программного обеспечения определяются еще до того, как они будут закодированы.
  • Модульные тесты
    — Unit Tests, Programming Tests, Developer Tests — тесты, проверяющие функциональность отдельных классов, компонентов, модулей приложения. Эти тесты не видны конечному заказчику или доменному эксперту. Обычно их начинают писать после оформления функциональных тестов.
  • Зеленая/Красная полоса
    — многие графические среды для выполнения модульных тестов отображают результат выполнения тестов в виде линии, которая окрашена в зеленый цвет, если все тесты выполнились удачно, и красной, если были ошибки.
  • Моки, Мок-объекты (MockObjects)
    — автоматически генерируемые заглушки, которые могу выступат в роли реальных объектов. Поведением моков можно управлять непосредственно в тесте. Моки могут выполнять дополнительные проверки, что тестируемый код их использовал, как ожидалось.
  • Модульный тест
    — тест, который проверяет поведение небольшой части приложения. Эта часть может быть одним классом, одним методом или набором классов, который реализуют какое-то архитектурное решение, и это решение необходимо проверить на работоспособность.
  • Тест — TestCase
    — набор тестовых методов, предназначенных для тестирования одного класса (в среде xUnit). Обычно TestCase состоит из методов, чье имя начинается с приставки test. Каждый такой метод тестирует какой-либо один момент тестируемого класса. В приемочном тестировании TestCase — это набор команд, которые тестируют одну значимую для заказчика функциональность.
  • Фикстура — Fixture
    — состояние среды тестирования, которое требуется для успешного выполнения тестового метода. Это может быть набор каких-либо объектов, состояние базы данных, наличие определенных файлов и т.д. Фикстура создается в методе setUp() перед каждым вызовом метода вида testSomething теста (TestCase) и удаляется в tearDown() после окончания выполнения тестового метода.
  • Проверка — Assert
    — метод класса TestCase, который предназначен для сверки реального состояния тестируемого кода с ожидаемым.

Терминология, связанная с наборами тестов

  • Набор тестов — TestSuite
    — набор тестов, предназначенный для тестирования какой-либо укрупненной сущности программной системы. В SimpleTest есть понятие TestGroup, которые практически эквивалентно понятию TestSuite. Иногда TestSuite употребляют в значении «все тесты, которые есть для приложения».

Терминология, связанная с приемочными тестами

  • Приемочные (функциональные) тесты — Customer tests, Acceptance tests
    — тесты, проверяющие функциональность приложения на соответствие требованиям заказчика. Приемочные тесты не должны ничего знать о деталях реализации приложения. Приемочные тесты заменяют ТЗ при использовании методики экстремального программирования (XP).
  • Регрессионный тесты
    — тесты, которые проверяют, что поведение системы не изменилось. На самом деле, большинство регрессионных тестов являются или модульными или функциональными тестами, которые включаются в определенный набор тестов (RegressionTestSuite), который гарантирует, что функциональность системы не будет случайно изменена.

Андрей Колесов

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

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

Нужно отметить парадоксальную ситуацию: при обилии методической литературы и курсов по проектированию и кодированию ПО наблюдается практически полное отсутствие материалов по тестированию и отладке! Как сказал известный американский автор книг по разработке ПО Джон Роббинс: «Даже если у вас есть специальное образование, бьюсь об заклад, что вы никогда не сталкивались со специальным курсом, посвященным отладке» (см. PC Week/RE, № 9/2004, с. 61).

Однако ситуация несколько меняется, одним из свидетельств чего являются проведенные в конце февраля в Москве компанией «Аплана» при поддержке московского представительства IBM практические семинары «Эффективная организация процессов тестирования в ходе разработки и сопровождения корпоративных систем». Тема оказалась настолько актуальной, что Центр технологий IBM не смог вместить всех желающих в один день, поэтому семинар пришлось проводить дважды. Изначально мероприятие было ориентировано на ИТ-подразделения корпораций, ведущие собственные внутрифирменные разработки, однако большой интерес к нему проявили и специализированные фирмы — создатели заказного и тиражируемого ПО. В общей сложности в семинарах приняли участие более 80 руководителей и специалистов корпоративных и ведомственных центров разработки и внедрения, а также ИТ-компаний.

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

Особенности организации тестирования

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

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

Есть еще один важный момент. Тестирование, в свою очередь, является лишь составляющей частью отладки — процесса доводки ПО после его написания до эксплуатационного состояния. Процесс этот включает две основные процедуры: обнаружение ошибок (тестирование) и поиск и устранение их причин. Однако, даже учитывая все возможные взаимосвязи этих работ (например, поиск причин ошибок требует проведения специального дополнительного тестирования), нужно подчеркнуть, что тестирование является достаточно автономным, независимым этапом жизненного цикла ПО. При этом подчеркнем, что повышение качества разработки (которое обратно пропорционально количеству ошибок в приложении) напрямую снижает затраты на устранение ошибок, но на объем тестирования влияет совсем не так сильно: его нужно проводить в любом случае и желательно «по полной программе».

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

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

  1. Объем тестирования очень велик. Дело в том, что именно в случае внутрифирменных разработок очень часто вносятся изменения (многие слушатели семинара говорили о непрерывном потоке корректировок по запросам подразделений-заказчиков). А ведь, как известно, классическое правило разработки ПО гласит: изменение одной строки кода требует повторного проведения полного цикла тестирования.
  2. Как это ни цинично звучит, но разработчики очень часто не заинтересованы в снижении количества ошибок в ПО, передаваемом в эксплуатацию. Руководство компаний оценивает работу ИТ-отдела в первую очередь по его умению уложиться в бюджет (время и деньги), а проблемы эксплуатации программ его волнуют значительно меньше. Поэтому получается, что увеличение объемов тестирования повышает издержки ИТ-подразделения без выделения соответствующих ресурсов со стороны начальства ** .
  3. Проведение качественного тестирования требует наличия специалистов и инструментов соответствующего профиля. А из п. 2 следует, что ИТ-подразделениям держать собственные группы тестировщиков просто невыгодно.

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

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

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

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

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

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

Тестирование — процесс также итерационный. После обнаружения и исправления каждой ошибки обязательно следует повторение тестов, чтобы убедиться в работоспособности программы. Более того, для идентификации причины обнаруженной проблемы может потребоваться проведение специального дополнительного тестирования. При этом нужно всегда помнить о фундаментальном выводе, сделанном профессором Эдсжером Дейкстрой в 1972 г: «Тестирование программ может служить доказательством наличия ошибок, но никогда не докажет их отсутствие!».

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

Функциональное и нагрузочное тестирование. Работы первого вида можно отнести к традиционным — проверка ПО на соответствие требованиям по функционалу *** . В последние годы заметно возросла актуальность относительно новых задач, таких, например, как анализ совместимости разрабатываемого продукта с различными программными и аппаратными платформами, приложениями и пр. Второй тип обычно связывают с задачами оценки производительности и масштабирования, но на самом деле он затрагивает гораздо более широкий круг проблем; выявление узких мест в коде программы, обнаружение «утечек» ресурсов и т. д.

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

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

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

Решение проблемы — центры тестирования

Как уже было сказано, ведущую роль в вопросах тестирования играют методология и организационная составляющая. Что же касается инструментария, то его роль в этом процессе вторична и выбор того или иного продукта для автоматизации задач тестирования определяется уже в зависимости от целей и специфики проекта, существующих предпочтений заказчика, бюджета. На рынке сейчас представлен целый спектр средств автоматизированного тестирования, в котором лидируют IBM Rational, Mercury, Segue, Compuware.

В рамках семинара специалистами компании «Аплана» рассматривались возможности автоматизированного тестирования на примере средств тестирования IBM Rational, которые в настоящее время получили значительное распространение среди российских разработчиков (см. врезку «Методология и инструментарий IBM Rational»). Обсуждались также различные сценарии их применения при создании ПО корпоративного уровня. Среди конкретных программных продуктов особое внимание было уделено наиболее популярной сегодня системе IBM Rational Robot.

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

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

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

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

В заключение стоит отметить еще один любопытный момент: проведя семинары, компания «Аплана» одной из первых в нашей стране фактически объявила о продвижении нового вида услуг в области разработки ПО. Первопроходцы же довольно часто попадают в двойственное положение. Так и на этом семинаре: бесплатный курс консалтинга и обучения пришлось дать не только потенциальным заказчикам, но и конкурентам…

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

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

*** Говоря о тестировании, надо также обязательно упомянуть о важности верификации ПО (систематической процедуры проверки правильности). Тонкое различие между этими понятиями заключается в том, что тестирование базируется на возможности сравнения полученных результатов с эталонными. Однако есть достаточно большой класс задач, когда эталонных данных попросту нет. Классический пример такого варианта — построение сложных математических моделей с решением десятков тысяч дифференциальных уравнений, хотя аналогичные ситуации возникают и тогда, когда имеешь дело с бизнес-приложениями. В этом случае требуется включение в ПО дополнительных функций и проведение специальных исследований, чтобы у пользователя появилась уверенность (пусть даже не 100-%), что программа действительно работает правильно.

Методология и инструментарий IBM Rational
Общая методология разработки ПО Rational Unified Process выделяет довольно большой набор видов тестирования (см. рисунок). Их можно с известной долей условности разделить следующим образом:
Функциональное тестирование (Function testing)

  • тестирование целостности данных (Data integrity testing);
  • тестирование на разных платформах (Configuration testing);
  • тестирование отказоустойчивости (Failover & recovery testing);
  • тестирование доступа (Security testing);
  • инсталляционное тестирование (Installation testing);
  • тестирование пользовательского интерфейса (User interface testing)

Нагрузочное тестирование (Load testing)

  • профилирование производительности (Performance profiling);
  • тестирование цикла работы (Business cycle testing);
  • тестирование при большой пользовательской нагрузке (Stress testing);
  • тестирование на больших объемах данных (Volume testing).

Для решения этих задач предлагаются следующие основные инструменты:

  • IBM Rational TestManager — управление тестированием;
  • IBM Rational PurifyPlus (Purify, PureCoverage, Quantify) — анализ работы системы в режиме RunTime;
  • IBM Rational Robot — функциональное и нагрузочное тестирование;
  • IBM Rational TestFactory — автоматизация создания тестов;
  • IBM Rational XDE Tester — функциональное тестирование Java и web-приложений.

Из сопоставления двух этих списков видно, что каждый продукт покрывает несколько типов тестирования. Вот краткая характеристика этих инструментов.
IBM Rational TestManager
необходим на всех этапах тестирования, предоставляет в распоряжение команды общие средства планирования, проектирования, исполнения и анализа тестов с использованием единой панели управления. Данный продукт имеет собственное хранилище данных, что обеспечивает более качественное управление версиями. Любой инструмент тестирования ПО, обладающий собственным API, не сложно интегрировать в единую систему, при этом может поддерживаться большинство исполняющих платформ тестирования.
IBM Rational PurifyPlus
включает три инструмента, предназначенных для анализа в режиме реального времени приложений и компонентов, разработанных с помощью Visual C/C++, C#, VB, VB .NET, Java, Java .NET. Purify обеспечивает автоматическое выявление ошибок, связанных с памятью, при этом выделяются источник и расположение ошибки. Если доступен исходный код, то его можно исправить непосредственно из Purify. Запатентованная технология Object Code Insertion позволяет выявлять ошибки доступа к памяти не только в исходном коде, но и в двоичных программных компонентах (DLL, объекты COM/DCOM, ODBC). PureCoverage — средство автоматического определения непротестированного кода. Quantify выполняет оценку производительности, определяя узкие места приложений и компонентов, как с исходным кодом, так и без него. Встроенные средства анализа данных помогают проводить сравнение результатов тестовых прогонов для различных вариантов кода.
IBM Rational Robot
— средство создания, изменения и выполнения автоматизированных тестов Интернет-приложений, ERP-систем и клиент-серверных решений. С его помощью обеспечивается объектно-уровневая поддержка при создании приложений на различных средствах разработки. Сценарии функциональных тестов генерируются в среде SQABasic, синтаксически совместимой с VB; встроенный редактор позволяет расширить сценарии тестов необходимыми процедурами и логическими условиями. Предусмотрена возможность создания специализированных тестов для различных типов программных объектов. Для формирования скриптов используется собственный Си-подобный язык.
IBM Rational TestFactory
— инструмент автоматической генерации скриптов тестирования посредством всестороннего анализа запущенного приложения для выявления дефектов надежности. Поскольку в программах имеется огромное число путей выполнения, проблема заключается в том, чтобы создать тесты, которые проверяют полный функционал приложения за минимальное число шагов.
IBM Rational XDE Tester
— специализированный инструмент для тестирования Java-приложений (J2EE, J2SE, SWT, AWT/JFC) и Web-приложений (HTML, DHTML, XML, JavaScript, апплеты Java). Текстовые сценарии пишутся на Java, технология ScriptAssure обеспечивает проверку достоверности динамических данных. Среда тестирования реализована в оболочке Eclipse, при этом имеется возможность встраивания инструмента в WebSphere Studio и Rational XDE Developer.

Тестирование

Тестирование (англ. test — испытание, проверка) — эксперементальный метод психродиагностики, применяемый в эмпирических социологических исследованиях, а также метод измерения и оценки различных психологических качеств и состояний индивида.

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

Основоположники тестирования — Ф.Гальтон, Ч.Спирман, Дж.Каттел, А.Бине, Т.Симон. Сам термин «умственный тест» придумал Кеттел в 1890 г. Начало развития современной тестологии массового применения тестов на практике связано с именем французского врача Бине, разработавшего в соавторстве с Симоном метрическую шкалу умственного развития, известную под названием «тест Бине-Симона».

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

Тесты предъявляют требования:

Строгая формализация всех этапов тестирования,

Стандартизация заданий и условий их выполнения,

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

Интерпретации результатов на основе предварительно полученного распределения по изучаемому признаку.

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

1) стандартная инструкция для испытуемого о цели и правилах выполнения заданий,

2) ключ шкалирования — соотнесение пунктов заданий со шкалами измеряемых качеств, указывающее, какой пункт заданий к какой шкале относится,

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

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

Для преодоления основного недостатка большинства тестов применяются различные приемы:

1) увеличение базовой выборки с целью повышения ее репрезентативности по большему числу параметров,

2) введение поправочных коэффициетнов с учетом характеристик выборки,

3)введение в практику тестирования невербального способа предъявления материала.

Тест состоит из двух частей:

а) стимулирующего материала (задача, инструкция или вопрос)

б) указаний относительно регистрации или интнграции полученых ответов.

Типичная для тестов стандартизация ситуации обеспечивает им в отличие от «свободного» наблюдения поведения большуюю объективность результатов.

Тесты классифицируются по разным признакам.

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

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

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

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

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

Разработка теста состоит из четырех этапов.

На первомэтапе развивается исходная концепция с формулировкой основных пунктов испытания или основных вопросов, носящих предварительный характер;

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

На третьем этапе тест проверяется повторно на той же самой популяции;

На четвертом — калибруется по отношению к возрасту, уровню образования и другим признакам популяции.

На всех этапах разработки теста необходимо учитывать:

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

б) связанную с этим валидизацию метода, т.е. опpеделение того, насколько он измеpяет тpебуемое свойство;

в) величину выбоpки из популяции, на котоpой должна пpоводиться оценка метода;

г) стимулиpующий матеpиал (таблички, изобpажения, игpушки, фильмы);

д) влияние исследователя в пpоцессе инстpуктиpования, постановки задач, pазъяснений, ответов на вопpосы;

е) условия ситуации;

ж) такие фоpмы поведения испытуеого, котоpые свидетельствуют об измеpяемом свойстве;

з) шкалиpование pелевантных фоpм поведения;

и) сведение pезультатов по отдельным измеpяемым пунктам в общие значения (напpимеp, суммиpование ответов типа «Да»);

к) фоpмулиpовку pезультатов в ноpмиpованной шкале оценок.

Одним из вариантов теста может быть опросник, но при условии, что он отвечает требованиям, предъявляемым к тестам. Опросник — это сборник вопросов, которые выбираются и располагаются по отношению друг к другу в соответствии с требуемым содержанием. Опросники используются, например, в целях психодиагностики, когда от испытуемого требуется самооценка его поведения, привычек, мнений и т.д. При этом испытуемый, отвечаяя на вопросы, выражает свои положительные и отрицательные предпочтения. С помощью опросников можно измерять у испытуемых и оценки ими других людей. Задание обычно выступает, как прямая реакция на вопросы, на которые надо ответить путем сожаления или опровержения. Возможности для ответа в большинстве случаев заданы и требуют лишь отметки в виде крестика, крижочка и т.п. Недостаток опросника состоит в том, что испытуемый может симулировать или диссимулировать те или иные свойства личности. Преодолеть указанный недостаток (хотя и не полностью) исследователь может посредством контрольных вопросов, контрольных шкал, шкал «лжи». Опросники применяются преимущественно для диагностики характера, диагностики личности (например, экстроверсии — интроверсии, интересов, установок, мотивов).

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

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

Использованная литература:

1.Соц.справочник,Киев,1990.

2.Соц.словарь,Минск,1991.

3.Фонд времени и мероприятия в соц.сфере,М:Наука,1989.

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

Методы

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

Методы можно разделить на статические и динамические.

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

Динамические техники следующие:

  1. Тестирование методом белого ящика.
    Это подробное исследование внутренней логики и структуры программы. При этом необходимо знание исходного кода.
  2. Тестирование методом черного ящика.
    Данная техника не требует каких-либо знаний о внутренней работе приложения. Рассматриваются только основные аспекты системы, не связанные или мало связанные с ее внутренней логической структурой.
  3. Метод серого ящика.
    Сочетает в себе предыдущие два подхода. Отладка с ограниченным знанием о внутреннем функционировании приложения сочетается со знанием основных аспектов системы.

Прозрачное тестирование

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

Тестирование программ методом белого ящика обладает следующими преимуществами:

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

Недостатки:

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

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

Основные разновидности:

1) тестирование управления потоком — структурная стратегия, использующая поток управления программой в качестве модели и отдающая предпочтение большему количеству простых путей перед меньшим числом более сложных;

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

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

4) проверка потока данных — стратегия исследования потока управления путем аннотации графа информацией об объявлении и использовании переменных программы;

5) тестирование циклов — полностью сосредоточено на правильном выполнении циклических процедур.

Поведенческая отладка

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

Преимущества такого подхода:

  • эффективность для большого сегмента кода;
  • простота восприятия тестировщиком;
  • перспектива пользователя четко отделена от перспективы разработчика (программист и тестировщик независимы друг от друга);
  • более быстрое создание теста.

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

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

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

1) эквивалентное разбиение, которое может уменьшить набор тестовых данных, так как входные данные программного модуля разбиваются на отдельные части;

2) краевой анализ фокусируется на проверке границ или экстремальных граничных значений — минимумах, максимумах, ошибочных и типичных значениях;

3) фаззинг — используется для поиска погрешностей реализации с помощью ввода искаженных или полуискаженных данных в автоматическом или полуавтоматическом режиме;

4) графы причинно-следственных связей — методика, основанная на создании графов и установлении связи между действием и его причинами: тождественность, отрицание, логическое ИЛИ и логическое И — четыре основных символа, выражающие взаимозависимость между причиной и следствием;

5) проверка ортогональных массивов, применяемая к проблемам с относительно небольшой областью ввода, превышающей возможности исчерпывающего исследования;

6) тестирование всех пар — техника, набор тестовых значений которой включает все возможные дискретные комбинации каждой пары входных параметров;

Тестирование методом черного ящика: примеры

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

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

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

Какое количество тестов необходимо произвести, чтобы проверить все возможные значения для 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) шаблонный тест, который анализирует дизайн и архитектуру добротного приложения.

Другие методы тестирования

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

Завершение жизненного цикла ПО

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

77. Отладка ПО включает в себя

a. Тестирование, локализацию ошибок, редактирование

b. Тестирование, оптимизацию

c. Тестирование, локализацию ошибок, оптимизацию

d. Тестирование, оптимизацию, документирование

78. Основной задачей отладки ПО являются

a. Выявление максимального количества ошибок

b. Определение момента окончания отладки

c. Создание тестов

d. Тестирование и оптимизация ПО

79. Существуют следующие виды отладки:

a. Автономная и комплексная

b. Программная и аппаратная

c. Внешняя и внутренняя

d. Статистическая и вероятностная

80. Автономная отладка не используется для тестирования

a. Программы в целом

b. Модулей

c. Структур данных и классов

d. Интерфейсов

81. Комплексная отладка не применяется для тестирования

a. Внутренних модулей программного средства

b. Документации программного средства

c. Качества программного средства

d. Архитектуры программного средства

82. Характеристика предъявляемая к требованиям к ПО это

a. Корректность

b. Минимальность

c. Фиксированность

d. Наличие пересечений между требованиями

83. Характеристика предъявляемые к требованиям к ПО

a. Полнота

b. Постоянность

c. Отсутствие связей между требованиями

d. Многократное повторение требований

84. Ошибкой при формировании требований к ПО является

a. Описание возможных решений

b. Чёткость требований

c. Отсутствие подробных описаний требований к мелким элементам

d. Прослеживаемость требований

85. Качество технологического процесса непосредственно влияет на качество

a. внутреннее

b. внешнее

c. качество при использовании

d. качество документации

86. При разработке ПО на качество при использовании влияют

a. качество процесса, внутреннее качество, внешнее качество

b. внутреннее качество, внешнее качество, качество документации

c. качество процесса, качество документации

d. внутренне качество, внешнее качество

87. Характеризует ПО с точки зрения его поведения качество

a. внешнее

b. внутреннее

c. качество при использовании

d. качество документации

88. Характеризует ПО по ощущениям пользователей при конкретных сценариях работы

a. качество при использовании

b. внешнее

c. внутреннее

d. качество документации

89. Не существует категорий качества ПО

a. Переносимость и производительность

b. Удобство сопровождения и удобство использования

c. Функциональность и надёжность

d. Доступность и популярность

90. К категории качества ПО «Надёжность» относится характеристика

a. Способность к восстановлению

b. Функциональная пригодность

c. Адаптируемость

d. Удобство изменений

91. К категории качества ПО «Переносимость» относится характеристика

a. Способность к сосуществованию

b. Зрелость

c. Понятность

d. Удобство обучения

92. К категории качества ПО «Функциональность» относится характеристика

a. Защищенность

b. Понятность

c. Временная эфективность

d. Стабильность

93. К категории качества ПО «Удобство использования» относится характеристика

a. Понятность

b. Зрелость

c. Эффективность использования ресурсов

d. Удобство изменений

94. К категории качества ПО «Производительность» относится характеристика

a. Соответствие стандартам

b. Стабильность

c. Адаптируемость

d. Точность

95. К категории качества ПО «Удобство сопровождения» относится характеристика

a. Удобство проверки

b. Понятность

c. Устойчивость к отказам

d. Удобство установки

96. В несколько категорий качества ПО входит характеристика

a. Соответствие стандартам

b. Функциональная пригодность

c. Зрелость

d. Понятность

97. Методами контроля качества ПО являются

a. Верификация и валидация

b. Анализ и синтез

c. Индукция и дедукция

d. Отладка и оптимизация

98. К методам контроля качества ПО не относится

a. Анализ исполняемого файла ПО

b. Выяснение свойств ПО во время его работы

c. Определение качества на основе симуляции работы ПО

d. Анализ проектной документации и исходного кода

99. Не существует метода тестирования ПО

a. Тестирование исходного кода ПО

b. Тестирование чёрного ящика

c. Тестирование белого ящика

d. Тестирование нацеленное на определенные ошибки

100. Не существует вида тестирования ПО

a. процедурное тестирование

b. модульное тестирование

c. интеграционные тестирование

d. системное тестирование

101. К источникам ошибок при программировании не относится

a. Неправильное понимание исходного кода

b. Неправильное понимание задачи

c. Неправильное решение задачи

d. Неправильный перенос решений в код

102. К англоязычным синонимам слова «ошибка» относятся

a. defect, failure, fault, error

b. defect, problem, fault, error

c. defect, failure, problem, error

d. issue, problem, fault, error

103. Не существует человеко-машинный интерфейс

a. Световой

b. Текстовый

c. Тактильный

d. Графический

104. Наиболее сложно проанализировать фактор удобства использования ПО

a. Субъективное удовлетворение пользователей

b. Адекватность интерфейса

c. Производительность работы пользователей

d. Скорость обучения новых пользователей

105. Какой из принципов не повышает удобство пользовательского интерфейса

a. Надёжности

b. Видимости

c. Обратной связи

d. Простоты

106. Ущерб от ошибок пользователя за счёт использоваия принципа

a. Толерантности

b. Обратной связи

c. Видимости

d. Простоты

107. Предоставление наборов возможностей предоставляемых пользователю соответствует правилу

a. Непрерывного развития

b. Толерантности

c. Видимости

d. Простоты

108. Проектирование интерфейса ПО, ориентированное на использование не включает модель

a. Результатов

b. Ролей

c. Задач

d. Содержимого

109. К внешним характеристикам ПО не относится

a. Понятность

b. Эффективность

c. Практичность

d. Адаптируемость

110. К внутренним характеристикам ПО относится

a. Тестируемость

b. Практичность

c. Эффективность

d. Адаптируемость

111. Тестирование ПО производится исполнителями при

a. Альфа-тесте

b. Бета-тесте

c. Внедрении ПО

d. Эксплуатации ПО

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

a. синтаксической

b. орфографической

c. грамматической

d. семантической

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

a. отладкой

b. семантическим анализом

c. тестированием

d. демонстрацией

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

a. тестирования и отладки

b. кодирования программы

c. постановки задачи

d. построения математической модели

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

a. системным тестированием

b. тестированием «чёрного ящика»

c. регрессионным тестированием

d. тестированием «белого ящика»

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

a. регрессионным тестированием

b. тестированием «белого ящика»

c. тестированием «черного ящика»

d. системным тестированием

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

a. альфа-тестированием

b. тестированием «белого ящика»

c. сквозным тестированием

d. бета-тестированием

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

a. бета-тестированием

b. тестированием «белого ящика»

c. сквозным тестированием

d. альфа-тестированием

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

a. ошибки не найдены

b. ошибки найдены

c. ошибки исправлены

d. есть замечания

120. Обязательным критерием качества программных систем является

a. надежность

b. универсальность

c. легкость применения

d. мобильность

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

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

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

Тестирование ПО
— попытка определить, выполняет ли программа то, что от неё ожидают. Как правило, никакое тестирование не может дать абсолютной гарантии работоспособности программы в будущем.

Для наглядности: почти все производители коммерческого ПО исправляют ошибки в своих продуктах.

Например: Корпорация Microsoft выпускает пакеты обновлений («Service Pack»), для своих операционных систем. Разработчики игр регулярно выпускают «патчи» для своих продуктов. Большинство разработчиков ПО после устранения ошибок выпускают обновлённую (новую) версию своей программы.

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

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

По объекту тестирования:

  • Функциональное тестирование (functional testing)
  • Нагрузочное тестирование
    • Тестирование производительности (perfomance/stress testing)
    • Тестирование стабильности (stability/load testing)
  • Тестирование удобства использования (usability testing)
  • Тестирование интерфейса пользователя (UI testing)
  • Тестирование безопасности (security testing)
  • Тестирование локализации (localization testing)
  • Тестирование совместимости (compatibility testing)

По знанию системы:

  • Тестирование чёрного ящика (black box)
  • Тестирование белого ящика (white box)
  • Тестирование серого ящика (gray box)

По степени автоматизированности:

  • Ручное тестирование (manual testing)
  • Автоматизированное тестирование (automated testing)
  • Полуавтоматизированное тестирование (semiautomated testing)

По степени изолированности компонентов:

  • Компонентное (модульное) тестирование (component/unit testing)
  • Интеграционное тестирование (integration testing)
  • Системное тестирование (system/end-to-end testing)

По времени проведения тестирования:

  • Альфа тестирование (alpha testing)
    • Тестирование при приёмке (smoke testing)
    • Тестирование новых функциональностей (new feature testing)
    • Регрессионное тестирование (regression testing)
    • Тестирование при сдаче (acceptance testing)
  • Бета тестирование (beta testing)

По признаку позитивности сценариев:

  • Позитивное тестирование (positive testing)
  • Негативное тестирование (negative testing)

По степени подготовленности к тестированию:

  • Тестирование по документации (formal testing)
  • Эд Хок (интуитивное) тестирование (ad hoc testing)

Уровни тестирования

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

Часто для свободного/открытого ПО стадия Альфа-тестирования характеризует функциональное наполнение кода, а Бета тестирования — стадию исправления ошибок. При этом как правило на каждом этапе разработки промежуточные результаты работы доступны конечным пользователям.

Тестирование «белого ящика» и «чёрного ящика»

В терминологии профессионалов тестирования (программного и некоторого аппаратного обеспечения), фразы «тестирование белого ящика» и «тестирование чёрного ящика» относятся к тому, имеет ли разработчик тестов доступ к исходному коду тестируемого ПО, или же тестирование выполняется через пользовательский интерфейс либо прикладной программный интерфейс, предоставленный тестируемым модулем.

При тестировании белого ящика (англ. white-box testing

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

), при котором тестируются только отдельные части системы. Оно обеспечивает то, что компоненты конструкции — работоспособны и устойчивы, до определённой степени. При тестировании белого ящика используются метрики покрытия кода.

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

Если «альфа-» и «бета-тестирование» относятся к стадиям до выпуска продукта (а также, неявно, к объёму тестирующего сообщества и ограничениям на методы тестирования), тестирование «белого ящика» и «чёрного ящика» имеет отношение к способам, которыми тестировщик достигает цели.

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

Статическое и динамическое тестирование

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

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

Также к статическому тестированию относят тестирование требований, спецификаций, документации.

Регрессионное тестирование

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

Тестовые скрипты

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

Покрытие кода

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

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

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

Разработка через тестирование (test-driven development)

(англ. test-driven development) — техника программирования, при которой модульные тесты для программы или её фрагмента пишутся до самой программы (англ. test-first development) и, по существу, управляют её разработкой. Является одной из основных практик экстремального программирования.

Ни один программист не считает работу над некоторым фрагментом кода завершенной, не проверив перед этим его работоспособность. Однако, если вы тестируете свой код, это не означает, что у вас есть тесты.

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

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

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

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

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

    Разработчику приятнее писать такой код.

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

    Пишем новый код только тогда, когда автоматический код не сработал.

    Удаляем дублирование.

Два столь простых правила на самом деле генерируют сложное индивидуальное и групповое поведение со множеством технических последствий:

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

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

    Наша среда разработки должна быстро реагировать на небольшие модификации кода.

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

Два упомянутых правила TDD определяют порядок этапов программирования:

    Красный — напишите небольшой тест, который не работает, а возможно, даже не компилируется.

    Зеленый — заставьте тест работать как можно быстрее, при этом не думайте о правильности дизайна и чистоте кода. Напишите ровно столько кода, чтобы тест сработал.

    Рефакторинг — удалите из написанного вами кода любое дублирование.

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

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

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

Терминология, связанная с модульными тестами

  • Разработка через тестирование
    — процесс разработки программного обеспечения, который предусматривает написание и автоматизацию модульных тестов еще до момента написания соответствующих классов или модулей. Это гарантирует, что все обязанности любого элемента программного обеспечения определяются еще до того, как они будут закодированы.
  • Модульные тесты
    — Unit Tests, Programming Tests, Developer Tests — тесты, проверяющие функциональность отдельных классов, компонентов, модулей приложения. Эти тесты не видны конечному заказчику или доменному эксперту. Обычно их начинают писать после оформления функциональных тестов.
  • Зеленая/Красная полоса
    — многие графические среды для выполнения модульных тестов отображают результат выполнения тестов в виде линии, которая окрашена в зеленый цвет, если все тесты выполнились удачно, и красной, если были ошибки.
  • Моки, Мок-объекты (MockObjects)
    — автоматически генерируемые заглушки, которые могу выступат в роли реальных объектов. Поведением моков можно управлять непосредственно в тесте. Моки могут выполнять дополнительные проверки, что тестируемый код их использовал, как ожидалось.
  • Модульный тест
    — тест, который проверяет поведение небольшой части приложения. Эта часть может быть одним классом, одним методом или набором классов, который реализуют какое-то архитектурное решение, и это решение необходимо проверить на работоспособность.
  • Тест — TestCase
    — набор тестовых методов, предназначенных для тестирования одного класса (в среде xUnit). Обычно TestCase состоит из методов, чье имя начинается с приставки test. Каждый такой метод тестирует какой-либо один момент тестируемого класса. В приемочном тестировании TestCase — это набор команд, которые тестируют одну значимую для заказчика функциональность.
  • Фикстура — Fixture
    — состояние среды тестирования, которое требуется для успешного выполнения тестового метода. Это может быть набор каких-либо объектов, состояние базы данных, наличие определенных файлов и т.д. Фикстура создается в методе setUp() перед каждым вызовом метода вида testSomething теста (TestCase) и удаляется в tearDown() после окончания выполнения тестового метода.
  • Проверка — Assert
    — метод класса TestCase, который предназначен для сверки реального состояния тестируемого кода с ожидаемым.

Терминология, связанная с наборами тестов

  • Набор тестов — TestSuite
    — набор тестов, предназначенный для тестирования какой-либо укрупненной сущности программной системы. В SimpleTest есть понятие TestGroup, которые практически эквивалентно понятию TestSuite. Иногда TestSuite употребляют в значении «все тесты, которые есть для приложения».

Терминология, связанная с приемочными тестами

  • Приемочные (функциональные) тесты — Customer tests, Acceptance tests
    — тесты, проверяющие функциональность приложения на соответствие требованиям заказчика. Приемочные тесты не должны ничего знать о деталях реализации приложения. Приемочные тесты заменяют ТЗ при использовании методики экстремального программирования (XP).
  • Регрессионный тесты
    — тесты, которые проверяют, что поведение системы не изменилось. На самом деле, большинство регрессионных тестов являются или модульными или функциональными тестами, которые включаются в определенный набор тестов (RegressionTestSuite), который гарантирует, что функциональность системы не будет случайно изменена.

Андрей Колесов

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

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

Нужно отметить парадоксальную ситуацию: при обилии методической литературы и курсов по проектированию и кодированию ПО наблюдается практически полное отсутствие материалов по тестированию и отладке! Как сказал известный американский автор книг по разработке ПО Джон Роббинс: «Даже если у вас есть специальное образование, бьюсь об заклад, что вы никогда не сталкивались со специальным курсом, посвященным отладке» (см. PC Week/RE, № 9/2004, с. 61).

Однако ситуация несколько меняется, одним из свидетельств чего являются проведенные в конце февраля в Москве компанией «Аплана» при поддержке московского представительства IBM практические семинары «Эффективная организация процессов тестирования в ходе разработки и сопровождения корпоративных систем». Тема оказалась настолько актуальной, что Центр технологий IBM не смог вместить всех желающих в один день, поэтому семинар пришлось проводить дважды. Изначально мероприятие было ориентировано на ИТ-подразделения корпораций, ведущие собственные внутрифирменные разработки, однако большой интерес к нему проявили и специализированные фирмы — создатели заказного и тиражируемого ПО. В общей сложности в семинарах приняли участие более 80 руководителей и специалистов корпоративных и ведомственных центров разработки и внедрения, а также ИТ-компаний.

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

Особенности организации тестирования

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

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

Есть еще один важный момент. Тестирование, в свою очередь, является лишь составляющей частью отладки — процесса доводки ПО после его написания до эксплуатационного состояния. Процесс этот включает две основные процедуры: обнаружение ошибок (тестирование) и поиск и устранение их причин. Однако, даже учитывая все возможные взаимосвязи этих работ (например, поиск причин ошибок требует проведения специального дополнительного тестирования), нужно подчеркнуть, что тестирование является достаточно автономным, независимым этапом жизненного цикла ПО. При этом подчеркнем, что повышение качества разработки (которое обратно пропорционально количеству ошибок в приложении) напрямую снижает затраты на устранение ошибок, но на объем тестирования влияет совсем не так сильно: его нужно проводить в любом случае и желательно «по полной программе».

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

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

  1. Объем тестирования очень велик. Дело в том, что именно в случае внутрифирменных разработок очень часто вносятся изменения (многие слушатели семинара говорили о непрерывном потоке корректировок по запросам подразделений-заказчиков). А ведь, как известно, классическое правило разработки ПО гласит: изменение одной строки кода требует повторного проведения полного цикла тестирования.
  2. Как это ни цинично звучит, но разработчики очень часто не заинтересованы в снижении количества ошибок в ПО, передаваемом в эксплуатацию. Руководство компаний оценивает работу ИТ-отдела в первую очередь по его умению уложиться в бюджет (время и деньги), а проблемы эксплуатации программ его волнуют значительно меньше. Поэтому получается, что увеличение объемов тестирования повышает издержки ИТ-подразделения без выделения соответствующих ресурсов со стороны начальства ** .
  3. Проведение качественного тестирования требует наличия специалистов и инструментов соответствующего профиля. А из п. 2 следует, что ИТ-подразделениям держать собственные группы тестировщиков просто невыгодно.

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

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

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

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

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

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

Тестирование — процесс также итерационный. После обнаружения и исправления каждой ошибки обязательно следует повторение тестов, чтобы убедиться в работоспособности программы. Более того, для идентификации причины обнаруженной проблемы может потребоваться проведение специального дополнительного тестирования. При этом нужно всегда помнить о фундаментальном выводе, сделанном профессором Эдсжером Дейкстрой в 1972 г: «Тестирование программ может служить доказательством наличия ошибок, но никогда не докажет их отсутствие!».

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

Функциональное и нагрузочное тестирование. Работы первого вида можно отнести к традиционным — проверка ПО на соответствие требованиям по функционалу *** . В последние годы заметно возросла актуальность относительно новых задач, таких, например, как анализ совместимости разрабатываемого продукта с различными программными и аппаратными платформами, приложениями и пр. Второй тип обычно связывают с задачами оценки производительности и масштабирования, но на самом деле он затрагивает гораздо более широкий круг проблем; выявление узких мест в коде программы, обнаружение «утечек» ресурсов и т. д.

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

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

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

Решение проблемы — центры тестирования

Как уже было сказано, ведущую роль в вопросах тестирования играют методология и организационная составляющая. Что же касается инструментария, то его роль в этом процессе вторична и выбор того или иного продукта для автоматизации задач тестирования определяется уже в зависимости от целей и специфики проекта, существующих предпочтений заказчика, бюджета. На рынке сейчас представлен целый спектр средств автоматизированного тестирования, в котором лидируют IBM Rational, Mercury, Segue, Compuware.

В рамках семинара специалистами компании «Аплана» рассматривались возможности автоматизированного тестирования на примере средств тестирования IBM Rational, которые в настоящее время получили значительное распространение среди российских разработчиков (см. врезку «Методология и инструментарий IBM Rational»). Обсуждались также различные сценарии их применения при создании ПО корпоративного уровня. Среди конкретных программных продуктов особое внимание было уделено наиболее популярной сегодня системе IBM Rational Robot.

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

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

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

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

В заключение стоит отметить еще один любопытный момент: проведя семинары, компания «Аплана» одной из первых в нашей стране фактически объявила о продвижении нового вида услуг в области разработки ПО. Первопроходцы же довольно часто попадают в двойственное положение. Так и на этом семинаре: бесплатный курс консалтинга и обучения пришлось дать не только потенциальным заказчикам, но и конкурентам…

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

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

*** Говоря о тестировании, надо также обязательно упомянуть о важности верификации ПО (систематической процедуры проверки правильности). Тонкое различие между этими понятиями заключается в том, что тестирование базируется на возможности сравнения полученных результатов с эталонными. Однако есть достаточно большой класс задач, когда эталонных данных попросту нет. Классический пример такого варианта — построение сложных математических моделей с решением десятков тысяч дифференциальных уравнений, хотя аналогичные ситуации возникают и тогда, когда имеешь дело с бизнес-приложениями. В этом случае требуется включение в ПО дополнительных функций и проведение специальных исследований, чтобы у пользователя появилась уверенность (пусть даже не 100-%), что программа действительно работает правильно.

Методология и инструментарий IBM Rational
Общая методология разработки ПО Rational Unified Process выделяет довольно большой набор видов тестирования (см. рисунок). Их можно с известной долей условности разделить следующим образом:
Функциональное тестирование (Function testing)

  • тестирование целостности данных (Data integrity testing);
  • тестирование на разных платформах (Configuration testing);
  • тестирование отказоустойчивости (Failover & recovery testing);
  • тестирование доступа (Security testing);
  • инсталляционное тестирование (Installation testing);
  • тестирование пользовательского интерфейса (User interface testing)

Нагрузочное тестирование (Load testing)

  • профилирование производительности (Performance profiling);
  • тестирование цикла работы (Business cycle testing);
  • тестирование при большой пользовательской нагрузке (Stress testing);
  • тестирование на больших объемах данных (Volume testing).

Для решения этих задач предлагаются следующие основные инструменты:

  • IBM Rational TestManager — управление тестированием;
  • IBM Rational PurifyPlus (Purify, PureCoverage, Quantify) — анализ работы системы в режиме RunTime;
  • IBM Rational Robot — функциональное и нагрузочное тестирование;
  • IBM Rational TestFactory — автоматизация создания тестов;
  • IBM Rational XDE Tester — функциональное тестирование Java и web-приложений.

Из сопоставления двух этих списков видно, что каждый продукт покрывает несколько типов тестирования. Вот краткая характеристика этих инструментов.
IBM Rational TestManager
необходим на всех этапах тестирования, предоставляет в распоряжение команды общие средства планирования, проектирования, исполнения и анализа тестов с использованием единой панели управления. Данный продукт имеет собственное хранилище данных, что обеспечивает более качественное управление версиями. Любой инструмент тестирования ПО, обладающий собственным API, не сложно интегрировать в единую систему, при этом может поддерживаться большинство исполняющих платформ тестирования.
IBM Rational PurifyPlus
включает три инструмента, предназначенных для анализа в режиме реального времени приложений и компонентов, разработанных с помощью Visual C/C++, C#, VB, VB .NET, Java, Java .NET. Purify обеспечивает автоматическое выявление ошибок, связанных с памятью, при этом выделяются источник и расположение ошибки. Если доступен исходный код, то его можно исправить непосредственно из Purify. Запатентованная технология Object Code Insertion позволяет выявлять ошибки доступа к памяти не только в исходном коде, но и в двоичных программных компонентах (DLL, объекты COM/DCOM, ODBC). PureCoverage — средство автоматического определения непротестированного кода. Quantify выполняет оценку производительности, определяя узкие места приложений и компонентов, как с исходным кодом, так и без него. Встроенные средства анализа данных помогают проводить сравнение результатов тестовых прогонов для различных вариантов кода.
IBM Rational Robot
— средство создания, изменения и выполнения автоматизированных тестов Интернет-приложений, ERP-систем и клиент-серверных решений. С его помощью обеспечивается объектно-уровневая поддержка при создании приложений на различных средствах разработки. Сценарии функциональных тестов генерируются в среде SQABasic, синтаксически совместимой с VB; встроенный редактор позволяет расширить сценарии тестов необходимыми процедурами и логическими условиями. Предусмотрена возможность создания специализированных тестов для различных типов программных объектов. Для формирования скриптов используется собственный Си-подобный язык.
IBM Rational TestFactory
— инструмент автоматической генерации скриптов тестирования посредством всестороннего анализа запущенного приложения для выявления дефектов надежности. Поскольку в программах имеется огромное число путей выполнения, проблема заключается в том, чтобы создать тесты, которые проверяют полный функционал приложения за минимальное число шагов.
IBM Rational XDE Tester
— специализированный инструмент для тестирования Java-приложений (J2EE, J2SE, SWT, AWT/JFC) и Web-приложений (HTML, DHTML, XML, JavaScript, апплеты Java). Текстовые сценарии пишутся на Java, технология ScriptAssure обеспечивает проверку достоверности динамических данных. Среда тестирования реализована в оболочке Eclipse, при этом имеется возможность встраивания инструмента в WebSphere Studio и Rational XDE Developer.

Тестирование

Тестирование (англ. test — испытание, проверка) — эксперементальный метод психродиагностики, применяемый в эмпирических социологических исследованиях, а также метод измерения и оценки различных психологических качеств и состояний индивида.

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

Основоположники тестирования — Ф.Гальтон, Ч.Спирман, Дж.Каттел, А.Бине, Т.Симон. Сам термин «умственный тест» придумал Кеттел в 1890 г. Начало развития современной тестологии массового применения тестов на практике связано с именем французского врача Бине, разработавшего в соавторстве с Симоном метрическую шкалу умственного развития, известную под названием «тест Бине-Симона».

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

Тесты предъявляют требования:

Строгая формализация всех этапов тестирования,

Стандартизация заданий и условий их выполнения,

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

Интерпретации результатов на основе предварительно полученного распределения по изучаемому признаку.

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

1) стандартная инструкция для испытуемого о цели и правилах выполнения заданий,

2) ключ шкалирования — соотнесение пунктов заданий со шкалами измеряемых качеств, указывающее, какой пункт заданий к какой шкале относится,

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

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

Для преодоления основного недостатка большинства тестов применяются различные приемы:

1) увеличение базовой выборки с целью повышения ее репрезентативности по большему числу параметров,

2) введение поправочных коэффициетнов с учетом характеристик выборки,

3)введение в практику тестирования невербального способа предъявления материала.

Тест состоит из двух частей:

а) стимулирующего материала (задача, инструкция или вопрос)

б) указаний относительно регистрации или интнграции полученых ответов.

Типичная для тестов стандартизация ситуации обеспечивает им в отличие от «свободного» наблюдения поведения большуюю объективность результатов.

Тесты классифицируются по разным признакам.

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

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

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

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

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

Разработка теста состоит из четырех этапов.

На первомэтапе развивается исходная концепция с формулировкой основных пунктов испытания или основных вопросов, носящих предварительный характер;

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

На третьем этапе тест проверяется повторно на той же самой популяции;

На четвертом — калибруется по отношению к возрасту, уровню образования и другим признакам популяции.

На всех этапах разработки теста необходимо учитывать:

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

б) связанную с этим валидизацию метода, т.е. опpеделение того, насколько он измеpяет тpебуемое свойство;

в) величину выбоpки из популяции, на котоpой должна пpоводиться оценка метода;

г) стимулиpующий матеpиал (таблички, изобpажения, игpушки, фильмы);

д) влияние исследователя в пpоцессе инстpуктиpования, постановки задач, pазъяснений, ответов на вопpосы;

е) условия ситуации;

ж) такие фоpмы поведения испытуеого, котоpые свидетельствуют об измеpяемом свойстве;

з) шкалиpование pелевантных фоpм поведения;

и) сведение pезультатов по отдельным измеpяемым пунктам в общие значения (напpимеp, суммиpование ответов типа «Да»);

к) фоpмулиpовку pезультатов в ноpмиpованной шкале оценок.

Одним из вариантов теста может быть опросник, но при условии, что он отвечает требованиям, предъявляемым к тестам. Опросник — это сборник вопросов, которые выбираются и располагаются по отношению друг к другу в соответствии с требуемым содержанием. Опросники используются, например, в целях психодиагностики, когда от испытуемого требуется самооценка его поведения, привычек, мнений и т.д. При этом испытуемый, отвечаяя на вопросы, выражает свои положительные и отрицательные предпочтения. С помощью опросников можно измерять у испытуемых и оценки ими других людей. Задание обычно выступает, как прямая реакция на вопросы, на которые надо ответить путем сожаления или опровержения. Возможности для ответа в большинстве случаев заданы и требуют лишь отметки в виде крестика, крижочка и т.п. Недостаток опросника состоит в том, что испытуемый может симулировать или диссимулировать те или иные свойства личности. Преодолеть указанный недостаток (хотя и не полностью) исследователь может посредством контрольных вопросов, контрольных шкал, шкал «лжи». Опросники применяются преимущественно для диагностики характера, диагностики личности (например, экстроверсии — интроверсии, интересов, установок, мотивов).

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

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

Использованная литература:

1.Соц.справочник,Киев,1990.

2.Соц.словарь,Минск,1991.

3.Фонд времени и мероприятия в соц.сфере,М:Наука,1989.

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

Методы

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

Методы можно разделить на статические и динамические.

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

Динамические техники следующие:

  1. Тестирование методом белого ящика.
    Это подробное исследование внутренней логики и структуры программы. При этом необходимо знание исходного кода.
  2. Тестирование методом черного ящика.
    Данная техника не требует каких-либо знаний о внутренней работе приложения. Рассматриваются только основные аспекты системы, не связанные или мало связанные с ее внутренней логической структурой.
  3. Метод серого ящика.
    Сочетает в себе предыдущие два подхода. Отладка с ограниченным знанием о внутреннем функционировании приложения сочетается со знанием основных аспектов системы.

Прозрачное тестирование

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

Тестирование программ методом белого ящика обладает следующими преимуществами:

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

Недостатки:

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

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

Основные разновидности:

1) тестирование управления потоком — структурная стратегия, использующая поток управления программой в качестве модели и отдающая предпочтение большему количеству простых путей перед меньшим числом более сложных;

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

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

4) проверка потока данных — стратегия исследования потока управления путем аннотации графа информацией об объявлении и использовании переменных программы;

5) тестирование циклов — полностью сосредоточено на правильном выполнении циклических процедур.

Поведенческая отладка

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

Преимущества такого подхода:

  • эффективность для большого сегмента кода;
  • простота восприятия тестировщиком;
  • перспектива пользователя четко отделена от перспективы разработчика (программист и тестировщик независимы друг от друга);
  • более быстрое создание теста.

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

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

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

1) эквивалентное разбиение, которое может уменьшить набор тестовых данных, так как входные данные программного модуля разбиваются на отдельные части;

2) краевой анализ фокусируется на проверке границ или экстремальных граничных значений — минимумах, максимумах, ошибочных и типичных значениях;

3) фаззинг — используется для поиска погрешностей реализации с помощью ввода искаженных или полуискаженных данных в автоматическом или полуавтоматическом режиме;

4) графы причинно-следственных связей — методика, основанная на создании графов и установлении связи между действием и его причинами: тождественность, отрицание, логическое ИЛИ и логическое И — четыре основных символа, выражающие взаимозависимость между причиной и следствием;

5) проверка ортогональных массивов, применяемая к проблемам с относительно небольшой областью ввода, превышающей возможности исчерпывающего исследования;

6) тестирование всех пар — техника, набор тестовых значений которой включает все возможные дискретные комбинации каждой пары входных параметров;

Тестирование методом черного ящика: примеры

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

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

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

Какое количество тестов необходимо произвести, чтобы проверить все возможные значения для 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), беспроводные технологии, мобильные услуги и т. д., открыли новые способы проверки ПО. Некоторые из изменений, которые ожидаются в этой отрасли в течение следующих нескольких лет, перечислены ниже:

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

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

Тестирование программного обеспечения
— процесс исследования программного
обеспечения (ПО) с целью получения
информации о качестве продукта.

Введение

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

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

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

С точки зрения ISO 9126, Качество (программных
средств) можно определить как совокупную
характеристику исследуемого ПО с учётом
следующих составляющих:

· Надёжность

· Сопровождаемость

· Практичность

· Эффективность

· Мобильность

· Функциональность

Более полный список атрибутов и критериев
можно найти в стандарте ISO 9126 Международной
организации по стандартизации. Состав
и содержание документации, сопутствующей
процессу тестирования, определяется
стандартом IEEE 829-1998 Standard for Software Test
Documentation.

История развития тестирования программного
обеспечения

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

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

По объекту тестирования:

· Функциональное тестирование
(functional testing)

· Нагрузочное тестирование

· Тестирование производительности
(perfomance/stress testing)

· Тестирование стабильности
(stability/load testing)

· Тестирование удобства использования
(usability testing)

· Тестирование интерфейса пользователя
(UI testing)

· Тестирование безопасности
(security testing)

· Тестирование локализации
(localization testing)

· Тестирование совместимости
(compatibility testing)

По знанию системы:

· Тестирование чёрного ящика (black
box)

· Тестирование белого ящика (white
box)

· Тестирование серого ящика (gray
box)

По степени автоматизированности:

· Ручное тестирование (manual testing)

· Автоматизированное тестирование
(automated testing)

· Полуавтоматизированное тестирование
(semiautomated testing)

По степени изолированности компонентов:

· Компонентное (модульное) тестирование
(component/unit testing)

· Интеграционное тестирование
(integration testing)

· Системное тестирование
(system/end-to-end testing)

По времени проведения тестирования:

· Альфа тестирование (alpha testing)

· Тестирование при приёмке (smoke
testing)

· Тестирование новых функциональностей
(new feature testing)

· Регрессионное тестирование
(regression testing)

· Тестирование при сдаче (acceptance
testing)

· Бета тестирование (beta testing)

По признаку позитивности сценариев:

· Позитивное тестирование (positive
testing)

· Негативное тестирование (negative
testing)

По степени подготовленности к тестированию:

· Тестирование по документации
(formal testing)

· Эд Хок (интуитивное) тестирование
(ad hoc testing)

Уровни тестирования

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

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

Системное тестирование — тестируется
интегрированная система на её соответствие
требованиям.

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

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

Часто для свободного/открытого ПО стадия
Альфа-тестирования характеризует
функциональное наполнение кода, а Бета
тестирования — стадию исправления
ошибок. При этом как правило на каждом
этапе разработки промежуточные результаты
работы доступны конечным пользователям.

Тестирование «белого ящика» и «чёрного
ящика»

В терминологии профессионалов тестирования
(программного и некоторого аппаратного
обеспечения), фразы «тестирование белого
ящика» и «тестирование чёрного ящика»
относятся к тому, имеет ли разработчик
тестов доступ к исходному коду тестируемого
ПО, или же тестирование выполняется
через пользовательский интерфейс либо
прикладной программный интерфейс,
предоставленный тестируемым модулем.

При тестировании белого ящика (англ.
white-box testing, также говорят — прозрачного
ящика), разработчик теста имеет доступ
к исходному коду программ и может писать
код, который связан с библиотеками
тестируемого ПО. Это типично для
юнит-тестирования (англ. unit testing), при
котором тестируются только отдельные
части системы. Оно обеспечивает то, что
компоненты конструкции — работоспособны
и устойчивы, до определённой степени.
При тестировании белого ящика используются
метрики покрытия кода.

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

Если «альфа-» и «бета-тестирование»
относятся к стадиям до выпуска продукта
(а также, неявно, к объёму тестирующего
сообщества и ограничениям на методы
тестирования), тестирование «белого
ящика» и «чёрного ящика» имеет отношение
к способам, которыми тестировщик
достигает цели.

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

Статическое и динамическое тестирование

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

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

Также к статическому тестированию
относят тестирование требований,
спецификаций, документации.

Регрессионное тестирование

Регрессио́нное тести́рование (англ.
regression testing, от лат. regressio — движение
назад) — собирательное название для
всех видов тестирования программного
обеспечения, направленных на обнаружение
ошибок в уже протестированных участках
исходного кода. Такие ошибки — когда
после внесения изменений в программу
перестает работать то, что должно было
продолжать работать, — называют
регрессионными ошибками (англ. regression
bugs).

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

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

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

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

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

«Фундаментальная проблема при
сопровождении программ состоит в том,
что исправление одной ошибки с большой
вероятностью (20-50%) влечет появление
новой. Поэтому весь процесс идет по
принципу «два шага вперед, шаг назад».

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

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

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

Тестовые скрипты

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

Покрытие кода

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

Критерии

Существует несколько различных способов
измерения покрытия, основные из них:

· Покрытие операторов — каждая ли
строка исходного кода была выполнена
и протестирована?

· Покрытие условий — каждая ли
точка решения (вычисления истинно ли
или ложно выражение) была выполнена и
протестирована?

· Покрытие путей — все ли возможные
пути через заданную часть кода были
выполнены и протестированы?

· Покрытие функций — каждая ли
функция программы была выполнена

· Покрытие вход/выход — все ли
вызовы функций и возвраты из них были
выполнены

Для программ с особыми требованиями к
безопасности часто требуется
продемонстрировать, что тестами
достигается 100 % покрытие для одного из
критериев. Некоторые из приведённых
критериев покрытия связаны между собой;
например, покрытие путей включает в
себя и покрытие условий и покрытие
операторов. Покрытие операторов не
включает покрытие условий, как показывает
этот код на Си:

printf(«this is «);

printf(«a positive integer»);

Если здесь bar = −1, то покрытие операторов
будет полным, а покрытие условий — нет,
так как случай несоблюдения условия в
операторе if — не покрыт. Полное покрытие
путей обычно невозможно. Фрагмент кода,
имеющий n условий содержит 2n путей;
конструкция цикла порождает бесконечное
количество путей. Некоторые пути в
программе могут быть не достигнуты
из-за того, что в тестовых данных
отсутствовали такие, которые могли
привести к выполнению этих путей. Не
существует универсального алгоритма,
который решал бы проблему недостижимых
путей (этот алгоритм можно было бы
использовать для решения проблемы
останова). На практике для достижения
покрытия путей используется следующий
подход: выделяются классы путей (например,
к одному классу можно отнести пути
отличающиеся только количеством итераций
в одном и том же цикле), 100 % покрытие
достигнуто, если покрыты все классы
путей (класс считается покрытым, если
покрыт хотя бы один путь из него).

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

Практическое применение

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

Степень покрытия кода обычно выражают
в виде процента. Например, «мы протестировали
67 % кода». Смысл этой фразы зависит от
того какой критерий был использован.
Например, 67 % покрытия путей — это лучший
результат чем 67 % покрытия операторов.
Вопрос о связи значения покрытия кода
и качеством тестового набора ещё до
конца не решён.

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

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

Введение

В среднем тестирование отнимает 50%
времени и 50% стоимости от общей сметы
проекта (обязательно учитывайте это,
закладывая бюджет). В больших компаниях
(Intel, IBM, Microsoft) за каждым разработчиком
закреплен личный тестировщик. Прошло
то время, когда эту работу выполнял
второсортный программист, которого еще
не подпускали к самостоятельному
кодированию (мол, прежде чем допускать
свои ошибки, сначала пусть учатся на
чужих). Сегодня тестировщик — это
высококвалифицированный и хорошо
оплачиваемый специалист, в услугах
которого нуждаются тысячи фирм и который
никогда не сидит без работы.

Когда вам скажут, что жизненный цикл
продукта состоит из проектирования,
реализации, тестирования и поддержки
— не верьте! Тестирование сопровождает
проект всю его жизнь — от момента рождения
до самой смерти. Проектировщик закладывает
механизмы самодиагностики и вывода
«телеметрической» информации.
Разработчик тестирует каждую
запрограммированную им функцию
(тестирование на микроуровне). Бета-тестеры
проверяют работоспособность всего
продукта в целом. У каждого из них должен
быть четкий план действий, в противном
случае тестирование провалится, еще не
начавшись.

В идеале для каждой функции исходного
кода разрабатывается набор автоматизированных
тестов, предназначенных для проверки
ее работоспособности. Лучше всего
поручить эту работу отдельной группе
программистов, поставив перед ними
задачу: разработать такой пример, на
котором функция провалится. Вот, например,
функция сортировки. Простейший тест
выглядит так. Генерируем произвольные
данные, прогоняем через нее и если для
каждого элемента N условие N =
N + 1 для сортировки по убыванию) истинно,
считаем, что тест пройдет правильно. Но
ведь этот тест неправильный! Необходимо
убедиться, что на выходе функции
присутствуют все исходные данные и нет
ничего лишнего! Многие функции нормально
сортируют десять или даже тысячу
элементов, но спотыкаются на одном или
двух (обычно это происходит при сортировке
методом деления напополам). А если будет
ноль сортируемых элементов? А если одна
из вызываемых функций (например, malloc),
возвратит ошибку — сможет ли тестируемая
функция корректно ее обработать? Сколько
времени (системных ресурсов) потребуется
на сортировку максимально возможного
числа элементов? Неоправданно низкая
производительность — тоже ошибка!

Существует два основных подхода к
тестированию — черный и белый ящики.
«Черный ящик» — это функция с закрытым
кодом, проверка которого сводится к
тупому перебору всех комбинаций
аргументов. Очевидно, что подавляющее
большинство функций не могут быть
протестированы за разумное время
(количество комбинаций слишком велико).
Код белого ящика известен и тестировщик
может сосредоточить свое внимание на
пограничных областях. Допустим, в функции
есть ограничение на предельно допустимую
длину строки в MAX_LEN символов. Тогда
следует тщательно исследовать строки
в MAX_LEN — 1, MAX_LEN и MAX_LEN + 1 символов, поскольку
ошибка «в плюс-минус один байт» —
одна из самых популярных.

Тест должен задействовать все ветви
программы, чтобы после его выполнения
не осталось ни одной незадействованной
строчки кода. Соотношение кода, который
хотя бы раз получил выполнение, к общему
коду программы, называется покрытием
(coverage) и для его измерения придумано
множество инструментов — от профилировщиков,
входящих в штатный комплект поставки
компиляторов, до самостоятельных
пакетов, лучшим из которых является
NuMega True Coverage.

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

Всегда транслируйте программу с
максимальным уровнем предупреждений
(для Microsoft Visual C++ это ключ /W4), обращая
внимание на все сообщения компилятора.
Некоторые, наиболее очевидные ошибки
обнаруживаются уже на этом этапе.
Сторонние верификаторы кода (lint, smatch)
еще мощнее и распознают ошибки, с которыми
трансляторы уже не справляются.

Регистрация ошибок

Завалить программу — проще всего.
Зафиксировать обстоятельства сбоя
намного сложнее. Типичная ситуация:
тестировщик прогоняет программу через
серию тестов. Непройденные тесты
отправляются разработчику, чтобы тот
локализовал ошибку и исправил баги. Но
у разработчика эти же самые тесты
проходят успешно! А, он уже все переделал,
перекомпилировал с другими ключами и
т.д. Чтобы этого не происходило, используйте
системы управления версиями — Microsoft
Source Safe или никсовый CVS.

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

Самыми коварными являются «плавающие»
ошибки, проявляющиеся с той или иной
степенью вероятности — девятьсот прогонов
программа проходит нормально, а затем
неожиданно падает без всяких видимых
причин. Эй, кто там орет, что такого не
бывает? Машина, дескать, детерминирована,
и если железо исправно, то баг либо есть,
либо нет. Ага, разбежались! Многопоточные
приложения и код, управляющий устройствами
ввода/вывода, порождают особый класс
невоспроизводимых ошибок, некоторые
из которых могут проявляться лишь раз
в несколько лет! Вот типичный пример:

f1() {int x = strlen(s); s[x] = «*»; s = 0;} // поток 1

f2() {printf(«%sn», s);} // поток 2

Листинг 1. Пример плавающей ошибки.

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

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

Вот к чему приводят ошибки проектирования
при загрузке системы реальными данными

Рисунок 1. Вот к чему приводят ошибки
проектирования при загрузке системы
реальными данными.

Бета-тестирование

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

Уронив программу (или добившись от нее
выдачи неверных данных), бета-тестер
должен суметь воспроизвести сбой, т.е.
выявить наиболее короткую последовательность
операций, приводящую к ошибке. А сделать
это ой как непросто! Попробуй-ка вспомнить,
какие клавиши были нажаты! Что? Не
получается?! Су… Используйте клавиатурные
шпионы. На любом хакерском сайте их
навалом. Пусть поработают на благо
народа (не вечно же пароли похищать).
Шпионить за мышью намного сложнее —
приходится сохранять не только позицию
курсора, но координаты всех окон или
задействовать встроенные макросредства
(по типу Visual Basic»a в Word»е). В общем, мышь —
это саксь и маст дай. Нормальные
бета-тестеры обходятся одной клавиатурой.
Полный протокол нажатий сокращает круг
поиска ошибки, однако с первого раза
воспроизвести сбой удается не всегда
и не всем.

В процессе тестирования приходится
многократно выполнять одни и те же
операции. Это раздражает, ненадежно и
непроизводительно. В штатную поставку
Windows 3.x входил клавиатурный проигрыватель,
позволяющий автоматизировать такие
операции. Теперь же его приходится
приобретать отдельно. Впрочем, такую
утилиту можно написать и самостоятельно.
В этом помогут функции FindWindow и SendMessage.

Тестируйте программу на всей линейке
операционных систем: Windows 98, Windows 2000,
Windows 2003 и т.д. Различия между ними очень
значительны. Что стабильно работает
под одной осью, может падать под другой,
особенно если она перегружена кучей
конфликтующих приложений. Ладно, если
это кривая программа Васи Пупкина (тут
на пользователя можно и наехать), но
если ваша программа не уживается в MS
Office или другими продуктами крупных
фирм, бить будут вас. Никогда не меняйте
конфигурацию системы в процессе
тестирования! Тогда будет трудно
установить, чей это баг. Хорошая штука
— виртуальные машины (VM Ware, Microsoft Virtual
PC). На одном компьютере можно держать
множество версий операционных систем
с различной комбинацией установленных
приложений — от стерильной до полностью
захламленной. При возникновении ошибки
состояние системы легко сохранить на
жесткий диск, обращаясь к нему впоследствии
столько раз, сколько потребуется.

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

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

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

Тестирование ПО
— попытка определить, выполняет ли программа то, что от неё ожидают. Как правило, никакое тестирование не может дать абсолютной гарантии работоспособности программы в будущем.

Для наглядности: почти все производители коммерческого ПО исправляют ошибки в своих продуктах.

Например: Корпорация Microsoft выпускает пакеты обновлений («Service Pack»), для своих операционных систем. Разработчики игр регулярно выпускают «патчи» для своих продуктов. Большинство разработчиков ПО после устранения ошибок выпускают обновлённую (новую) версию своей программы.

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

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

По объекту тестирования:

  • Функциональное тестирование (functional testing)
  • Нагрузочное тестирование
    • Тестирование производительности (perfomance/stress testing)
    • Тестирование стабильности (stability/load testing)
  • Тестирование удобства использования (usability testing)
  • Тестирование интерфейса пользователя (UI testing)
  • Тестирование безопасности (security testing)
  • Тестирование локализации (localization testing)
  • Тестирование совместимости (compatibility testing)

По знанию системы:

  • Тестирование чёрного ящика (black box)
  • Тестирование белого ящика (white box)
  • Тестирование серого ящика (gray box)

По степени автоматизированности:

  • Ручное тестирование (manual testing)
  • Автоматизированное тестирование (automated testing)
  • Полуавтоматизированное тестирование (semiautomated testing)

По степени изолированности компонентов:

  • Компонентное (модульное) тестирование (component/unit testing)
  • Интеграционное тестирование (integration testing)
  • Системное тестирование (system/end-to-end testing)

По времени проведения тестирования:

  • Альфа тестирование (alpha testing)
    • Тестирование при приёмке (smoke testing)
    • Тестирование новых функциональностей (new feature testing)
    • Регрессионное тестирование (regression testing)
    • Тестирование при сдаче (acceptance testing)
  • Бета тестирование (beta testing)

По признаку позитивности сценариев:

  • Позитивное тестирование (positive testing)
  • Негативное тестирование (negative testing)

По степени подготовленности к тестированию:

  • Тестирование по документации (formal testing)
  • Эд Хок (интуитивное) тестирование (ad hoc testing)

Уровни тестирования

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

Часто для свободного/открытого ПО стадия Альфа-тестирования характеризует функциональное наполнение кода, а Бета тестирования — стадию исправления ошибок. При этом как правило на каждом этапе разработки промежуточные результаты работы доступны конечным пользователям.

Тестирование «белого ящика» и «чёрного ящика»

В терминологии профессионалов тестирования (программного и некоторого аппаратного обеспечения), фразы «тестирование белого ящика» и «тестирование чёрного ящика» относятся к тому, имеет ли разработчик тестов доступ к исходному коду тестируемого ПО, или же тестирование выполняется через пользовательский интерфейс либо прикладной программный интерфейс, предоставленный тестируемым модулем.

При тестировании белого ящика (англ. white-box testing

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

), при котором тестируются только отдельные части системы. Оно обеспечивает то, что компоненты конструкции — работоспособны и устойчивы, до определённой степени. При тестировании белого ящика используются метрики покрытия кода.

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

Если «альфа-» и «бета-тестирование» относятся к стадиям до выпуска продукта (а также, неявно, к объёму тестирующего сообщества и ограничениям на методы тестирования), тестирование «белого ящика» и «чёрного ящика» имеет отношение к способам, которыми тестировщик достигает цели.

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

Статическое и динамическое тестирование

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

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

Также к статическому тестированию относят тестирование требований, спецификаций, документации.

Регрессионное тестирование

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

Тестовые скрипты

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

Покрытие кода

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

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

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

Разработка через тестирование (test-driven development)

(англ. test-driven development) — техника программирования, при которой модульные тесты для программы или её фрагмента пишутся до самой программы (англ. test-first development) и, по существу, управляют её разработкой. Является одной из основных практик экстремального программирования.

Ни один программист не считает работу над некоторым фрагментом кода завершенной, не проверив перед этим его работоспособность. Однако, если вы тестируете свой код, это не означает, что у вас есть тесты.

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

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

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

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

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

    Разработчику приятнее писать такой код.

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

    Пишем новый код только тогда, когда автоматический код не сработал.

    Удаляем дублирование.

Два столь простых правила на самом деле генерируют сложное индивидуальное и групповое поведение со множеством технических последствий:

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

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

    Наша среда разработки должна быстро реагировать на небольшие модификации кода.

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

Два упомянутых правила TDD определяют порядок этапов программирования:

    Красный — напишите небольшой тест, который не работает, а возможно, даже не компилируется.

    Зеленый — заставьте тест работать как можно быстрее, при этом не думайте о правильности дизайна и чистоте кода. Напишите ровно столько кода, чтобы тест сработал.

    Рефакторинг — удалите из написанного вами кода любое дублирование.

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

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

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

Терминология, связанная с модульными тестами

  • Разработка через тестирование
    — процесс разработки программного обеспечения, который предусматривает написание и автоматизацию модульных тестов еще до момента написания соответствующих классов или модулей. Это гарантирует, что все обязанности любого элемента программного обеспечения определяются еще до того, как они будут закодированы.
  • Модульные тесты
    — Unit Tests, Programming Tests, Developer Tests — тесты, проверяющие функциональность отдельных классов, компонентов, модулей приложения. Эти тесты не видны конечному заказчику или доменному эксперту. Обычно их начинают писать после оформления функциональных тестов.
  • Зеленая/Красная полоса
    — многие графические среды для выполнения модульных тестов отображают результат выполнения тестов в виде линии, которая окрашена в зеленый цвет, если все тесты выполнились удачно, и красной, если были ошибки.
  • Моки, Мок-объекты (MockObjects)
    — автоматически генерируемые заглушки, которые могу выступат в роли реальных объектов. Поведением моков можно управлять непосредственно в тесте. Моки могут выполнять дополнительные проверки, что тестируемый код их использовал, как ожидалось.
  • Модульный тест
    — тест, который проверяет поведение небольшой части приложения. Эта часть может быть одним классом, одним методом или набором классов, который реализуют какое-то архитектурное решение, и это решение необходимо проверить на работоспособность.
  • Тест — TestCase
    — набор тестовых методов, предназначенных для тестирования одного класса (в среде xUnit). Обычно TestCase состоит из методов, чье имя начинается с приставки test. Каждый такой метод тестирует какой-либо один момент тестируемого класса. В приемочном тестировании TestCase — это набор команд, которые тестируют одну значимую для заказчика функциональность.
  • Фикстура — Fixture
    — состояние среды тестирования, которое требуется для успешного выполнения тестового метода. Это может быть набор каких-либо объектов, состояние базы данных, наличие определенных файлов и т.д. Фикстура создается в методе setUp() перед каждым вызовом метода вида testSomething теста (TestCase) и удаляется в tearDown() после окончания выполнения тестового метода.
  • Проверка — Assert
    — метод класса TestCase, который предназначен для сверки реального состояния тестируемого кода с ожидаемым.

Терминология, связанная с наборами тестов

  • Набор тестов — TestSuite
    — набор тестов, предназначенный для тестирования какой-либо укрупненной сущности программной системы. В SimpleTest есть понятие TestGroup, которые практически эквивалентно понятию TestSuite. Иногда TestSuite употребляют в значении «все тесты, которые есть для приложения».

Терминология, связанная с приемочными тестами

  • Приемочные (функциональные) тесты — Customer tests, Acceptance tests
    — тесты, проверяющие функциональность приложения на соответствие требованиям заказчика. Приемочные тесты не должны ничего знать о деталях реализации приложения. Приемочные тесты заменяют ТЗ при использовании методики экстремального программирования (XP).
  • Регрессионный тесты
    — тесты, которые проверяют, что поведение системы не изменилось. На самом деле, большинство регрессионных тестов являются или модульными или функциональными тестами, которые включаются в определенный набор тестов (RegressionTestSuite), который гарантирует, что функциональность системы не будет случайно изменена.

Тестирование


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

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

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

1)
информирование испытуемого о целях
проведения тестирования;

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

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

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

5)
предупреждение распространения
полученной в результате тестирования
психодиагностической информации,
обеспечение ее конфиденциальности;

6)
ознакомление испытуемого с результатами
тестирования, сообщение ему или
ответственному лицу соответствующей
информации с учетом принципа «Не
навреди!»; в этом случае возникает
необходимость решения серии этических
и нравственных задач;

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

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

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

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

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

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

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

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

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

свойство.
Применяются разные способы проверки
надежности тестов.

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

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

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

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

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

Изучение
продуктов деятельности


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

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

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

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

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

С чего же начинать организацию процесса тестирования?

Я выделяю 11 основных критериев в организации процесса тестирования:

  1. Цели и область тестирования
  2. Команда
  3. Управление
  4. Коммуникация и взаимодействие
  5. Методология тестирования
  6. Документированность процесса
  7. Управление рисками
  8. Измерение процесса
  9. Инструменты
  10. Тестовые среды
  11. Совершенствование процесса

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

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

  • Зачем нам нужно тестирование?
  • Что мы имеем, чтобы сделать тестирование?
  • Какие процессы нужно формализовать или создать?
  • Как и что мы должны тестировать?

Только после того, как мы получим ответы на эти вопросы, можно начинать переходить к стандартам.

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

  • ISO 29119
  • IEEE 8291008
  • TPI Next&TMap
  • ISTQB

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

Любой ИТ процесс всегда должен удовлетворять потребностям бизнеса!

Мы разберем основные критерии построения процесса тестирования.

Цели и область тестирования

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

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

Говоря об области тестирования, мы должны прекрасно понимать, что именно нам предстоит тестировать. Это могут быть системы, компоненты, бизнес процессы. Для того, чтобы это понять, то нужно просто ответить на два вопроса:

  • Что надо тестировать?
  • Что будем тестировать?

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

Команда и управление

Команда — это самая важная составляющая процесса тестирования. Без команды вы, как руководитель, ничего не сделаете. Зачастую к формированию команды подходят несколькими подходами:

Инструменты и инфраструктура

Какой же процесс тестирования без инструментов? Это получается ручной труд ради ручного труда 🙂 Я думаю многие из вас часто слышали о написании тест-кейсов в документах ворд, о построения графиков и диаграмм в экселе. Но, зачем тратить усилия, если рынок предлагает нам готовые продукты управления тестирования, такие как HP ALM, MS TFS, TestRail, TestLink, JIRA Zephyr и многие другие.
Поэтому, если вы приступили к организации процесса тестирования, то делайте этот процесс удобным и эффективным. Пишите тест-кейсы в удобных формах готовых продуктов, интегрируйте инструменты с системой управления задачами, настраивайте и т.д.

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

  • Какие задачи вы планируете выполнять?
  • Какой у вас бюджет на инструменты?

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

Помимо инструментов управления тестирования, к инструментам тестирования также можно отнести:

  • Система управления дефектами и задачами (может включаться в систему управления тестированием)
  • Вспомогательные инструменты (для скриншотов, снятия логов, работы с БД, SOUP UI для XML и т.д.)
  • Инструменты автоматизации ( , Selenium и т.д.)
  • Системы управления знаниями (на wiki движке)

Теперь поговорим об инфраструктуре. В текущем контексте своего повествования я подразумеваю тестовые среды.

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

Стандартно я выделяю следующие типы тестовых сред:

  • Среда разработки (можно ли ее относить к тестовой?, но тем не менее)
  • Среда тестирования системы (может быть развернута одна или несколько систем, компонент, не требует серьезных мощностей)
  • Среда интеграции (полноценный интеграционная среда для проверки работоспособности сквозных бизнес процессов)
  • Среда (основное требования — соответствие мощностями боевому контуру)
  • Среда ПродЛайк/ПреПрод (среда для отладки готового протестированного билда, проведение инсталяционного тестирования)

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

Совершенствование процесса

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

Но это не так. Почему мы должны постоянно совершенствовать процесс тестирования:

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

2. ИТ сфера постоянно развивается. Приходят новые технологи подходы, которые всегда позволяются совершенствовать процесс тестирования.

Как говорится, совершенству нет предела!

Ну а как совершенствовать — это стандартный цикл Демминга.

Запланировали — .Сделали — Проанализировали — Скорректировали

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

Тестирование программного обеспечения
— процесс исследования программного
обеспечения (ПО) с целью получения
информации о качестве продукта.

Введение

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

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

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

С точки зрения ISO 9126, Качество (программных
средств) можно определить как совокупную
характеристику исследуемого ПО с учётом
следующих составляющих:

· Надёжность

· Сопровождаемость

· Практичность

· Эффективность

· Мобильность

· Функциональность

Более полный список атрибутов и критериев
можно найти в стандарте ISO 9126 Международной
организации по стандартизации. Состав
и содержание документации, сопутствующей
процессу тестирования, определяется
стандартом IEEE 829-1998 Standard for Software Test
Documentation.

История развития тестирования программного
обеспечения

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

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

По объекту тестирования:

· Функциональное тестирование
(functional testing)

· Нагрузочное тестирование

· Тестирование производительности
(perfomance/stress testing)

· Тестирование стабильности
(stability/load testing)

· Тестирование удобства использования
(usability testing)

· Тестирование интерфейса пользователя
(UI testing)

· Тестирование безопасности
(security testing)

· Тестирование локализации
(localization testing)

· Тестирование совместимости
(compatibility testing)

По знанию системы:

· Тестирование чёрного ящика (black
box)

· Тестирование белого ящика (white
box)

· Тестирование серого ящика (gray
box)

По степени автоматизированности:

· Ручное тестирование (manual testing)

· Автоматизированное тестирование
(automated testing)

· Полуавтоматизированное тестирование
(semiautomated testing)

По степени изолированности компонентов:

· Компонентное (модульное) тестирование
(component/unit testing)

· Интеграционное тестирование
(integration testing)

· Системное тестирование
(system/end-to-end testing)

По времени проведения тестирования:

· Альфа тестирование (alpha testing)

· Тестирование при приёмке (smoke
testing)

· Тестирование новых функциональностей
(new feature testing)

· Регрессионное тестирование
(regression testing)

· Тестирование при сдаче (acceptance
testing)

· Бета тестирование (beta testing)

По признаку позитивности сценариев:

· Позитивное тестирование (positive
testing)

· Негативное тестирование (negative
testing)

По степени подготовленности к тестированию:

· Тестирование по документации
(formal testing)

· Эд Хок (интуитивное) тестирование
(ad hoc testing)

Уровни тестирования

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

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

Системное тестирование — тестируется
интегрированная система на её соответствие
требованиям.

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

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

Часто для свободного/открытого ПО стадия
Альфа-тестирования характеризует
функциональное наполнение кода, а Бета
тестирования — стадию исправления
ошибок. При этом как правило на каждом
этапе разработки промежуточные результаты
работы доступны конечным пользователям.

Тестирование «белого ящика» и «чёрного
ящика»

В терминологии профессионалов тестирования
(программного и некоторого аппаратного
обеспечения), фразы «тестирование белого
ящика» и «тестирование чёрного ящика»
относятся к тому, имеет ли разработчик
тестов доступ к исходному коду тестируемого
ПО, или же тестирование выполняется
через пользовательский интерфейс либо
прикладной программный интерфейс,
предоставленный тестируемым модулем.

При тестировании белого ящика (англ.
white-box testing, также говорят — прозрачного
ящика), разработчик теста имеет доступ
к исходному коду программ и может писать
код, который связан с библиотеками
тестируемого ПО. Это типично для
юнит-тестирования (англ. unit testing), при
котором тестируются только отдельные
части системы. Оно обеспечивает то, что
компоненты конструкции — работоспособны
и устойчивы, до определённой степени.
При тестировании белого ящика используются
метрики покрытия кода.

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

Если «альфа-» и «бета-тестирование»
относятся к стадиям до выпуска продукта
(а также, неявно, к объёму тестирующего
сообщества и ограничениям на методы
тестирования), тестирование «белого
ящика» и «чёрного ящика» имеет отношение
к способам, которыми тестировщик
достигает цели.

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

Статическое и динамическое тестирование

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

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

Также к статическому тестированию
относят тестирование требований,
спецификаций, документации.

Регрессионное тестирование

Регрессио́нное тести́рование (англ.
regression testing, от лат. regressio — движение
назад) — собирательное название для
всех видов тестирования программного
обеспечения, направленных на обнаружение
ошибок в уже протестированных участках
исходного кода. Такие ошибки — когда
после внесения изменений в программу
перестает работать то, что должно было
продолжать работать, — называют
регрессионными ошибками (англ. regression
bugs).

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

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

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

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

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

«Фундаментальная проблема при
сопровождении программ состоит в том,
что исправление одной ошибки с большой
вероятностью (20-50%) влечет появление
новой. Поэтому весь процесс идет по
принципу «два шага вперед, шаг назад».

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

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

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

Тестовые скрипты

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

Покрытие кода

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

Критерии

Существует несколько различных способов
измерения покрытия, основные из них:

· Покрытие операторов — каждая ли
строка исходного кода была выполнена
и протестирована?

· Покрытие условий — каждая ли
точка решения (вычисления истинно ли
или ложно выражение) была выполнена и
протестирована?

· Покрытие путей — все ли возможные
пути через заданную часть кода были
выполнены и протестированы?

· Покрытие функций — каждая ли
функция программы была выполнена

· Покрытие вход/выход — все ли
вызовы функций и возвраты из них были
выполнены

Для программ с особыми требованиями к
безопасности часто требуется
продемонстрировать, что тестами
достигается 100 % покрытие для одного из
критериев. Некоторые из приведённых
критериев покрытия связаны между собой;
например, покрытие путей включает в
себя и покрытие условий и покрытие
операторов. Покрытие операторов не
включает покрытие условий, как показывает
этот код на Си:

printf(«this is «);

printf(«a positive integer»);

Если здесь bar = −1, то покрытие операторов
будет полным, а покрытие условий — нет,
так как случай несоблюдения условия в
операторе if — не покрыт. Полное покрытие
путей обычно невозможно. Фрагмент кода,
имеющий n условий содержит 2n путей;
конструкция цикла порождает бесконечное
количество путей. Некоторые пути в
программе могут быть не достигнуты
из-за того, что в тестовых данных
отсутствовали такие, которые могли
привести к выполнению этих путей. Не
существует универсального алгоритма,
который решал бы проблему недостижимых
путей (этот алгоритм можно было бы
использовать для решения проблемы
останова). На практике для достижения
покрытия путей используется следующий
подход: выделяются классы путей (например,
к одному классу можно отнести пути
отличающиеся только количеством итераций
в одном и том же цикле), 100 % покрытие
достигнуто, если покрыты все классы
путей (класс считается покрытым, если
покрыт хотя бы один путь из него).

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

Практическое применение

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

Степень покрытия кода обычно выражают
в виде процента. Например, «мы протестировали
67 % кода». Смысл этой фразы зависит от
того какой критерий был использован.
Например, 67 % покрытия путей — это лучший
результат чем 67 % покрытия операторов.
Вопрос о связи значения покрытия кода
и качеством тестового набора ещё до
конца не решён.

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

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

Введение

В среднем тестирование отнимает 50%
времени и 50% стоимости от общей сметы
проекта (обязательно учитывайте это,
закладывая бюджет). В больших компаниях
(Intel, IBM, Microsoft) за каждым разработчиком
закреплен личный тестировщик. Прошло
то время, когда эту работу выполнял
второсортный программист, которого еще
не подпускали к самостоятельному
кодированию (мол, прежде чем допускать
свои ошибки, сначала пусть учатся на
чужих). Сегодня тестировщик — это
высококвалифицированный и хорошо
оплачиваемый специалист, в услугах
которого нуждаются тысячи фирм и который
никогда не сидит без работы.

Когда вам скажут, что жизненный цикл
продукта состоит из проектирования,
реализации, тестирования и поддержки
— не верьте! Тестирование сопровождает
проект всю его жизнь — от момента рождения
до самой смерти. Проектировщик закладывает
механизмы самодиагностики и вывода
«телеметрической» информации.
Разработчик тестирует каждую
запрограммированную им функцию
(тестирование на микроуровне). Бета-тестеры
проверяют работоспособность всего
продукта в целом. У каждого из них должен
быть четкий план действий, в противном
случае тестирование провалится, еще не
начавшись.

В идеале для каждой функции исходного
кода разрабатывается набор автоматизированных
тестов, предназначенных для проверки
ее работоспособности. Лучше всего
поручить эту работу отдельной группе
программистов, поставив перед ними
задачу: разработать такой пример, на
котором функция провалится. Вот, например,
функция сортировки. Простейший тест
выглядит так. Генерируем произвольные
данные, прогоняем через нее и если для
каждого элемента N условие N =
N + 1 для сортировки по убыванию) истинно,
считаем, что тест пройдет правильно. Но
ведь этот тест неправильный! Необходимо
убедиться, что на выходе функции
присутствуют все исходные данные и нет
ничего лишнего! Многие функции нормально
сортируют десять или даже тысячу
элементов, но спотыкаются на одном или
двух (обычно это происходит при сортировке
методом деления напополам). А если будет
ноль сортируемых элементов? А если одна
из вызываемых функций (например, malloc),
возвратит ошибку — сможет ли тестируемая
функция корректно ее обработать? Сколько
времени (системных ресурсов) потребуется
на сортировку максимально возможного
числа элементов? Неоправданно низкая
производительность — тоже ошибка!

Существует два основных подхода к
тестированию — черный и белый ящики.
«Черный ящик» — это функция с закрытым
кодом, проверка которого сводится к
тупому перебору всех комбинаций
аргументов. Очевидно, что подавляющее
большинство функций не могут быть
протестированы за разумное время
(количество комбинаций слишком велико).
Код белого ящика известен и тестировщик
может сосредоточить свое внимание на
пограничных областях. Допустим, в функции
есть ограничение на предельно допустимую
длину строки в MAX_LEN символов. Тогда
следует тщательно исследовать строки
в MAX_LEN — 1, MAX_LEN и MAX_LEN + 1 символов, поскольку
ошибка «в плюс-минус один байт» —
одна из самых популярных.

Тест должен задействовать все ветви
программы, чтобы после его выполнения
не осталось ни одной незадействованной
строчки кода. Соотношение кода, который
хотя бы раз получил выполнение, к общему
коду программы, называется покрытием
(coverage) и для его измерения придумано
множество инструментов — от профилировщиков,
входящих в штатный комплект поставки
компиляторов, до самостоятельных
пакетов, лучшим из которых является
NuMega True Coverage.

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

Всегда транслируйте программу с
максимальным уровнем предупреждений
(для Microsoft Visual C++ это ключ /W4), обращая
внимание на все сообщения компилятора.
Некоторые, наиболее очевидные ошибки
обнаруживаются уже на этом этапе.
Сторонние верификаторы кода (lint, smatch)
еще мощнее и распознают ошибки, с которыми
трансляторы уже не справляются.

Регистрация ошибок

Завалить программу — проще всего.
Зафиксировать обстоятельства сбоя
намного сложнее. Типичная ситуация:
тестировщик прогоняет программу через
серию тестов. Непройденные тесты
отправляются разработчику, чтобы тот
локализовал ошибку и исправил баги. Но
у разработчика эти же самые тесты
проходят успешно! А, он уже все переделал,
перекомпилировал с другими ключами и
т.д. Чтобы этого не происходило, используйте
системы управления версиями — Microsoft
Source Safe или никсовый CVS.

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

Самыми коварными являются «плавающие»
ошибки, проявляющиеся с той или иной
степенью вероятности — девятьсот прогонов
программа проходит нормально, а затем
неожиданно падает без всяких видимых
причин. Эй, кто там орет, что такого не
бывает? Машина, дескать, детерминирована,
и если железо исправно, то баг либо есть,
либо нет. Ага, разбежались! Многопоточные
приложения и код, управляющий устройствами
ввода/вывода, порождают особый класс
невоспроизводимых ошибок, некоторые
из которых могут проявляться лишь раз
в несколько лет! Вот типичный пример:

f1() {int x = strlen(s); s[x] = «*»; s = 0;} // поток 1

f2() {printf(«%sn», s);} // поток 2

Листинг 1. Пример плавающей ошибки.

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

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

Вот к чему приводят ошибки проектирования
при загрузке системы реальными данными

Рисунок 1. Вот к чему приводят ошибки
проектирования при загрузке системы
реальными данными.

Бета-тестирование

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

Уронив программу (или добившись от нее
выдачи неверных данных), бета-тестер
должен суметь воспроизвести сбой, т.е.
выявить наиболее короткую последовательность
операций, приводящую к ошибке. А сделать
это ой как непросто! Попробуй-ка вспомнить,
какие клавиши были нажаты! Что? Не
получается?! Су… Используйте клавиатурные
шпионы. На любом хакерском сайте их
навалом. Пусть поработают на благо
народа (не вечно же пароли похищать).
Шпионить за мышью намного сложнее —
приходится сохранять не только позицию
курсора, но координаты всех окон или
задействовать встроенные макросредства
(по типу Visual Basic»a в Word»е). В общем, мышь —
это саксь и маст дай. Нормальные
бета-тестеры обходятся одной клавиатурой.
Полный протокол нажатий сокращает круг
поиска ошибки, однако с первого раза
воспроизвести сбой удается не всегда
и не всем.

В процессе тестирования приходится
многократно выполнять одни и те же
операции. Это раздражает, ненадежно и
непроизводительно. В штатную поставку
Windows 3.x входил клавиатурный проигрыватель,
позволяющий автоматизировать такие
операции. Теперь же его приходится
приобретать отдельно. Впрочем, такую
утилиту можно написать и самостоятельно.
В этом помогут функции FindWindow и SendMessage.

Тестируйте программу на всей линейке
операционных систем: Windows 98, Windows 2000,
Windows 2003 и т.д. Различия между ними очень
значительны. Что стабильно работает
под одной осью, может падать под другой,
особенно если она перегружена кучей
конфликтующих приложений. Ладно, если
это кривая программа Васи Пупкина (тут
на пользователя можно и наехать), но
если ваша программа не уживается в MS
Office или другими продуктами крупных
фирм, бить будут вас. Никогда не меняйте
конфигурацию системы в процессе
тестирования! Тогда будет трудно
установить, чей это баг. Хорошая штука
— виртуальные машины (VM Ware, Microsoft Virtual
PC). На одном компьютере можно держать
множество версий операционных систем
с различной комбинацией установленных
приложений — от стерильной до полностью
захламленной. При возникновении ошибки
состояние системы легко сохранить на
жесткий диск, обращаясь к нему впоследствии
столько раз, сколько потребуется.

Тестирование

Тестирование (англ. test — испытание, проверка) — эксперементальный метод психродиагностики, применяемый в эмпирических социологических исследованиях, а также метод измерения и оценки различных психологических качеств и состояний индивида.

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

Основоположники тестирования — Ф.Гальтон, Ч.Спирман, Дж.Каттел, А.Бине, Т.Симон. Сам термин «умственный тест» придумал Кеттел в 1890 г. Начало развития современной тестологии массового применения тестов на практике связано с именем французского врача Бине, разработавшего в соавторстве с Симоном метрическую шкалу умственного развития, известную под названием «тест Бине-Симона».

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

Тесты предъявляют требования:

Строгая формализация всех этапов тестирования,

Стандартизация заданий и условий их выполнения,

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

Интерпретации результатов на основе предварительно полученного распределения по изучаемому признаку.

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

1) стандартная инструкция для испытуемого о цели и правилах выполнения заданий,

2) ключ шкалирования — соотнесение пунктов заданий со шкалами измеряемых качеств, указывающее, какой пункт заданий к какой шкале относится,

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

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

Для преодоления основного недостатка большинства тестов применяются различные приемы:

1) увеличение базовой выборки с целью повышения ее репрезентативности по большему числу параметров,

2) введение поправочных коэффициетнов с учетом характеристик выборки,

3)введение в практику тестирования невербального способа предъявления материала.

Тест состоит из двух частей:

а) стимулирующего материала (задача, инструкция или вопрос)

б) указаний относительно регистрации или интнграции полученых ответов.

Типичная для тестов стандартизация ситуации обеспечивает им в отличие от «свободного» наблюдения поведения большуюю объективность результатов.

Тесты классифицируются по разным признакам.

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

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

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

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

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

Разработка теста состоит из четырех этапов.

На первомэтапе развивается исходная концепция с формулировкой основных пунктов испытания или основных вопросов, носящих предварительный характер;

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

На третьем этапе тест проверяется повторно на той же самой популяции;

На четвертом — калибруется по отношению к возрасту, уровню образования и другим признакам популяции.

На всех этапах разработки теста необходимо учитывать:

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

б) связанную с этим валидизацию метода, т.е. опpеделение того, насколько он измеpяет тpебуемое свойство;

в) величину выбоpки из популяции, на котоpой должна пpоводиться оценка метода;

г) стимулиpующий матеpиал (таблички, изобpажения, игpушки, фильмы);

д) влияние исследователя в пpоцессе инстpуктиpования, постановки задач, pазъяснений, ответов на вопpосы;

е) условия ситуации;

ж) такие фоpмы поведения испытуеого, котоpые свидетельствуют об измеpяемом свойстве;

з) шкалиpование pелевантных фоpм поведения;

и) сведение pезультатов по отдельным измеpяемым пунктам в общие значения (напpимеp, суммиpование ответов типа «Да»);

к) фоpмулиpовку pезультатов в ноpмиpованной шкале оценок.

Одним из вариантов теста может быть опросник, но при условии, что он отвечает требованиям, предъявляемым к тестам. Опросник — это сборник вопросов, которые выбираются и располагаются по отношению друг к другу в соответствии с требуемым содержанием. Опросники используются, например, в целях психодиагностики, когда от испытуемого требуется самооценка его поведения, привычек, мнений и т.д. При этом испытуемый, отвечаяя на вопросы, выражает свои положительные и отрицательные предпочтения. С помощью опросников можно измерять у испытуемых и оценки ими других людей. Задание обычно выступает, как прямая реакция на вопросы, на которые надо ответить путем сожаления или опровержения. Возможности для ответа в большинстве случаев заданы и требуют лишь отметки в виде крестика, крижочка и т.п. Недостаток опросника состоит в том, что испытуемый может симулировать или диссимулировать те или иные свойства личности. Преодолеть указанный недостаток (хотя и не полностью) исследователь может посредством контрольных вопросов, контрольных шкал, шкал «лжи». Опросники применяются преимущественно для диагностики характера, диагностики личности (например, экстроверсии — интроверсии, интересов, установок, мотивов).

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

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

Использованная литература:

1.Соц.справочник,Киев,1990.

2.Соц.словарь,Минск,1991.

3.Фонд времени и мероприятия в соц.сфере,М:Наука,1989.

Существуют различные методологии динамического тестирования ПО. В зависимости от наличия у тестировщика доступа к исходному коду программы, выделяют следующие методы тестирования:

  • · Метод черного ящика
  • · Метод белого ящика
  • · Метод серого ящика

Метод черного ящика.

Впервые термин «черный ящик» упоминается психиатром У. Р. Эшби в книге «Введение в кибернетику» в 1959 г. Он писал, что метод черного ящика позволяет изучать поведение системы абстрагируясь от ее внутреннего устройства.

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

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

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

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

Метод белого ящика.

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

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

Метод серого ящика.

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

Тестирование


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

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

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

1)
информирование испытуемого о целях
проведения тестирования;

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

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

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

5)
предупреждение распространения
полученной в результате тестирования
психодиагностической информации,
обеспечение ее конфиденциальности;

6)
ознакомление испытуемого с результатами
тестирования, сообщение ему или
ответственному лицу соответствующей
информации с учетом принципа «Не
навреди!»; в этом случае возникает
необходимость решения серии этических
и нравственных задач;

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

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

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

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

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

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

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

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

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

свойство.
Применяются разные способы проверки
надежности тестов.

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

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

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

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

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

Изучение
продуктов деятельности


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

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

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

Жизненный цикл разработки программного обеспечения – это процедурный процесс в разработке программного продукта. Этот процесс осуществляется серией шагов, которые объясняют в целом идею, лежащую в основе разработки программного продукта.

Классификация жизненного цикла процесса разработки программного обеспечения происходит следующим образом:

  1. Планирование
  2. Анализ
  3. Дизайн
  4. Разработка программного обеспечения
  5. Реализация
  6. Развертывание
  7. Техническое обслуживание

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

Введение в тестирование программного обеспечения

Ошибка:
ошибка или заблуждение — это человеческое действие, которое производит неправильный или неверный результат.

Дефект (баг, неисправность):
сбой в системе или продукте, который может привести к сбою или неисправности компонента.

Отказ:
это разница между фактическим и ожидаемым результатом.

Риск:
риск — это фактор, который может привести к отрицательным результатам или возможности убытка, или ущерба.

Таким образом, тестирование программного обеспечения — это процесс поиска дефектов/ошибок в системе, которые происходят из-за ошибок в программе, которые могут привести к выходу из строя результирующего продукта. Короче говоря, тестирование программного обеспечения имеет различные цели и задачи, которые часто включают в себя:

  1. Обнаружение дефектов
  2. Обретение уверенности и предоставление информации об уровне качества
  3. Предотвращение дефектов

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

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

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

Ключевые понятия

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

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

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

Верификация и Валидация:
тестирование программного обеспечения проводится с учетом этих двух факторов.

  1. Верификация: проверяет, разработан ли данный продукт согласно спецификации.
  2. Валидация: проверяет, соответствует ли продукт требованиям клиентов.

Обеспечение качества ПО:
тестирование программного обеспечения является важной частью обеспечения качества. Обеспечение качества — это деятельность, которая подтверждает пригодность продукта, заботу о качестве товара и обеспечение соблюдения требований заказчика.

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

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

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

Инструкции по сценарию тестирования:

  • Black Box (черный ящик) тестирование
  • White Box (белый ящик) тестирование
  • Gray Box (серый ящик) тестирование

Уровни тестирования программного обеспечения жизненного цикла включают в себя:

  • Модульное тестирование
  • Интеграционное тестирование
  • Системное тестирование
  • Приемочное тестирования (альфа-тестирование и бета-тестирование)

Другими видами тестирования программного обеспечения являются:

  • Функциональное тестирование
  • Тестирование производительности (нагрузочное тестирование и стресс-тестирование)
  • Дымовое тестирование
  • Санитарное тестирование (проверка согласованности)
  • Регрессионное тестирование
  • Тестирование восстановления.
  • Юзабилити-тестирование
  • Тестирование на совместимость
  • Тестирование конфигурации
  • Исследовательское тестирование

Автоматизированное тестирование

Ручное тестирование — трудоемкий процесс. Автоматизация тестирования предполагает автоматизировать ручной процесс. Автоматизация тестирования — это процесс написания компьютерной программы в виде скриптов для тестирования, который обычно делается вручную. Некоторыми популярными средствами автоматизации являются Winrunner, Quick Test Professional (QTP), LoadRunner, SilkTest, Rational Robot, и т. д. Средства автоматизации также включает в себя сервисные инструменты, такие как TestDirector и многие другие.

Методологии тестирования программного обеспечения

Существуют различные методики тестирования доступные для разработки и тестирования программного продукта. Этими моделями являются:

  • Каскадная модель
  • V Модель
  • Спиральная модель
  • Рационального унифицированный процесс
  • Гибкая модели
  • Быстрая разработка приложений

Тестовые артефакты

В процессе тестирования программного обеспечения можно произвести различные артефакты, такие как:

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

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

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

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

Сценарий тестирования:
тестовый сценарий представляет собой сочетание теста, процедуры тестирования и данных испытаний.

Тестовый набор:
это сборник тестовых случаев.

Процесс тестирование программного обеспечения

Процесс тестирования программного обеспечения осуществляется в следующей последовательности, для того чтобы найти недостатки в программном обеспечении системы:

  1. Создание плана тестирования
  2. Дизайн тест-кейсов
  3. Описание тестовых случаев
  4. Обзор тестовых случаев
  5. Выполнение теста
  6. Изучение результатов тестов
  7. Составление конечного обзора

Ниже приведены примеры тестирования:

Тестирование программного обеспечения для входа на страницу системы:

цель:
пользователь должен иметь возможность перейти на главную страницу.

Предпосылки:

  1. Программное обеспечение должно быть совместимо с операционной системой.
  2. Должна появиться страница «ввода логина».
  3. Текстовые поля идентификатора пользователя и пароля должны быть доступны с соответствующими метками.
  4. Должны быть в наличии кнопки «Войти» и «Отмена» с соответствующими подписями.

Тест 1

Название теста:
проверка требований пользовательского интерфейса.

Шаги/действия:
Пользователь просматривает страницу, чтобы проверить, включает ли она в себя ID пользователя и пароль в текстовых полях с соответствующими наклейками. Кроме того, кнопки «Войти» и «Отмена» должны быть доступны с соответствующими подписями.

Ожидаемые результаты:
экран отображает интерфейс пользователя согласно требованиям пользователя.

Тест 2

Название теста:
Текстовое поле для идентификатора пользователя следует: 1) разрешить только буквенные символы {от a до z, и от A до Z}, 2) не разрешать специальные символы, такие как {«$»,»#»,»!»,»~»,»*»,…}, 3) не разрешать цифровые символы {0-9}.

Шаги/действия:
1) Пользователь вводит числа в текстовое поле. 2) Пользователь вводит алфавитно-цифровые данные в текстовом поле.

Ожидаемые результаты:
я) для числовых данных отображается сообщение об ошибке. 2) текст принимается, когда пользователь вводит алфавитные данные в текстовое поле.

Тест 3

Название теста:
проверка функциональности текстового поля для пароля: 1) текстовое поле для пароля должно принять шесть или более символов. 2) данные должны отображаться в зашифрованном виде.

Шаги/действия:
1) Пользователь вводит только два символа в текстовом поле пароля. 2) Пользователь вводит более шести символов в текстовом поле пароля. 3) Пользователь проверяет отображаются ли данные в зашифрованном виде.

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

Тест 4

Название теста:
проверка функциональности кнопки «Войти».

Шаги/действия:
1) Пользователь проверяет, включена или отключена кнопка «Войти». 2) Пользователь нажимает на кнопку «Войти» и ожидает, просмотра главной страницы приложения.

Ожидаемые результаты:
1) система отображает кнопку «Войти». 2) Система перенаправляет пользователя на главную страницу приложения, как только он нажимает на кнопку «Войти».

Тест 5

Название теста:
проверка функциональности кнопки «Отмена».

Шаги/действия:
1) Пользователь проверяет, включена или отключена кнопка «Отмена». 2) Пользователь проверяет, сбрасываются ли текстовые поля ID пользователя и пароль при нажатии кнопки «Отмена».

Ожидаемые результаты:
1) система отображает кнопки «Отмена». 2) система сбрасывает данные текстовых полей идентификатора пользователя и пароля, когда пользователь нажимает на кнопку «Отмена».

Методы поиска неисправностей при тестировании программного обеспечения

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

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

Метрика программного обеспечения

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

Метрика программного обеспечения поможет избежать таких подводных камней, как:

  1. Перерасход средств
  2. Определение, источника проблемы
  3. Уточнение целей

Даст ответы на такие вопросы как:

  1. Какова оценка каждого процесса деятельности?
  2. Каково качество кода, который был разработан?
  3. Как можно улучшить слаборазвитый код?

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

Некоторыми общими метриками программного обеспечения являются:

  • Покрытие кода
  • Цикломатическая сложность
  • Сплоченность
  • Связь
  • Функция точечного анализа
  • Время выполнения
  • Источник строк кода
  • Ошибка в строках кода

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

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

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

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

Андрей Колесов

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

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

Нужно отметить парадоксальную ситуацию: при обилии методической литературы и курсов по проектированию и кодированию ПО наблюдается практически полное отсутствие материалов по тестированию и отладке! Как сказал известный американский автор книг по разработке ПО Джон Роббинс: «Даже если у вас есть специальное образование, бьюсь об заклад, что вы никогда не сталкивались со специальным курсом, посвященным отладке» (см. PC Week/RE, № 9/2004, с. 61).

Однако ситуация несколько меняется, одним из свидетельств чего являются проведенные в конце февраля в Москве компанией «Аплана» при поддержке московского представительства IBM практические семинары «Эффективная организация процессов тестирования в ходе разработки и сопровождения корпоративных систем». Тема оказалась настолько актуальной, что Центр технологий IBM не смог вместить всех желающих в один день, поэтому семинар пришлось проводить дважды. Изначально мероприятие было ориентировано на ИТ-подразделения корпораций, ведущие собственные внутрифирменные разработки, однако большой интерес к нему проявили и специализированные фирмы — создатели заказного и тиражируемого ПО. В общей сложности в семинарах приняли участие более 80 руководителей и специалистов корпоративных и ведомственных центров разработки и внедрения, а также ИТ-компаний.

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

Особенности организации тестирования

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

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

Есть еще один важный момент. Тестирование, в свою очередь, является лишь составляющей частью отладки — процесса доводки ПО после его написания до эксплуатационного состояния. Процесс этот включает две основные процедуры: обнаружение ошибок (тестирование) и поиск и устранение их причин. Однако, даже учитывая все возможные взаимосвязи этих работ (например, поиск причин ошибок требует проведения специального дополнительного тестирования), нужно подчеркнуть, что тестирование является достаточно автономным, независимым этапом жизненного цикла ПО. При этом подчеркнем, что повышение качества разработки (которое обратно пропорционально количеству ошибок в приложении) напрямую снижает затраты на устранение ошибок, но на объем тестирования влияет совсем не так сильно: его нужно проводить в любом случае и желательно «по полной программе».

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

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

  1. Объем тестирования очень велик. Дело в том, что именно в случае внутрифирменных разработок очень часто вносятся изменения (многие слушатели семинара говорили о непрерывном потоке корректировок по запросам подразделений-заказчиков). А ведь, как известно, классическое правило разработки ПО гласит: изменение одной строки кода требует повторного проведения полного цикла тестирования.
  2. Как это ни цинично звучит, но разработчики очень часто не заинтересованы в снижении количества ошибок в ПО, передаваемом в эксплуатацию. Руководство компаний оценивает работу ИТ-отдела в первую очередь по его умению уложиться в бюджет (время и деньги), а проблемы эксплуатации программ его волнуют значительно меньше. Поэтому получается, что увеличение объемов тестирования повышает издержки ИТ-подразделения без выделения соответствующих ресурсов со стороны начальства ** .
  3. Проведение качественного тестирования требует наличия специалистов и инструментов соответствующего профиля. А из п. 2 следует, что ИТ-подразделениям держать собственные группы тестировщиков просто невыгодно.

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

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

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

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

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

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

Тестирование — процесс также итерационный. После обнаружения и исправления каждой ошибки обязательно следует повторение тестов, чтобы убедиться в работоспособности программы. Более того, для идентификации причины обнаруженной проблемы может потребоваться проведение специального дополнительного тестирования. При этом нужно всегда помнить о фундаментальном выводе, сделанном профессором Эдсжером Дейкстрой в 1972 г: «Тестирование программ может служить доказательством наличия ошибок, но никогда не докажет их отсутствие!».

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

Функциональное и нагрузочное тестирование. Работы первого вида можно отнести к традиционным — проверка ПО на соответствие требованиям по функционалу *** . В последние годы заметно возросла актуальность относительно новых задач, таких, например, как анализ совместимости разрабатываемого продукта с различными программными и аппаратными платформами, приложениями и пр. Второй тип обычно связывают с задачами оценки производительности и масштабирования, но на самом деле он затрагивает гораздо более широкий круг проблем; выявление узких мест в коде программы, обнаружение «утечек» ресурсов и т. д.

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

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

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

Решение проблемы — центры тестирования

Как уже было сказано, ведущую роль в вопросах тестирования играют методология и организационная составляющая. Что же касается инструментария, то его роль в этом процессе вторична и выбор того или иного продукта для автоматизации задач тестирования определяется уже в зависимости от целей и специфики проекта, существующих предпочтений заказчика, бюджета. На рынке сейчас представлен целый спектр средств автоматизированного тестирования, в котором лидируют IBM Rational, Mercury, Segue, Compuware.

В рамках семинара специалистами компании «Аплана» рассматривались возможности автоматизированного тестирования на примере средств тестирования IBM Rational, которые в настоящее время получили значительное распространение среди российских разработчиков (см. врезку «Методология и инструментарий IBM Rational»). Обсуждались также различные сценарии их применения при создании ПО корпоративного уровня. Среди конкретных программных продуктов особое внимание было уделено наиболее популярной сегодня системе IBM Rational Robot.

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

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

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

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

В заключение стоит отметить еще один любопытный момент: проведя семинары, компания «Аплана» одной из первых в нашей стране фактически объявила о продвижении нового вида услуг в области разработки ПО. Первопроходцы же довольно часто попадают в двойственное положение. Так и на этом семинаре: бесплатный курс консалтинга и обучения пришлось дать не только потенциальным заказчикам, но и конкурентам…

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

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

*** Говоря о тестировании, надо также обязательно упомянуть о важности верификации ПО (систематической процедуры проверки правильности). Тонкое различие между этими понятиями заключается в том, что тестирование базируется на возможности сравнения полученных результатов с эталонными. Однако есть достаточно большой класс задач, когда эталонных данных попросту нет. Классический пример такого варианта — построение сложных математических моделей с решением десятков тысяч дифференциальных уравнений, хотя аналогичные ситуации возникают и тогда, когда имеешь дело с бизнес-приложениями. В этом случае требуется включение в ПО дополнительных функций и проведение специальных исследований, чтобы у пользователя появилась уверенность (пусть даже не 100-%), что программа действительно работает правильно.

Методология и инструментарий IBM Rational
Общая методология разработки ПО Rational Unified Process выделяет довольно большой набор видов тестирования (см. рисунок). Их можно с известной долей условности разделить следующим образом:
Функциональное тестирование (Function testing)

  • тестирование целостности данных (Data integrity testing);
  • тестирование на разных платформах (Configuration testing);
  • тестирование отказоустойчивости (Failover & recovery testing);
  • тестирование доступа (Security testing);
  • инсталляционное тестирование (Installation testing);
  • тестирование пользовательского интерфейса (User interface testing)

Нагрузочное тестирование (Load testing)

  • профилирование производительности (Performance profiling);
  • тестирование цикла работы (Business cycle testing);
  • тестирование при большой пользовательской нагрузке (Stress testing);
  • тестирование на больших объемах данных (Volume testing).

Для решения этих задач предлагаются следующие основные инструменты:

  • IBM Rational TestManager — управление тестированием;
  • IBM Rational PurifyPlus (Purify, PureCoverage, Quantify) — анализ работы системы в режиме RunTime;
  • IBM Rational Robot — функциональное и нагрузочное тестирование;
  • IBM Rational TestFactory — автоматизация создания тестов;
  • IBM Rational XDE Tester — функциональное тестирование Java и web-приложений.

Из сопоставления двух этих списков видно, что каждый продукт покрывает несколько типов тестирования. Вот краткая характеристика этих инструментов.
IBM Rational TestManager
необходим на всех этапах тестирования, предоставляет в распоряжение команды общие средства планирования, проектирования, исполнения и анализа тестов с использованием единой панели управления. Данный продукт имеет собственное хранилище данных, что обеспечивает более качественное управление версиями. Любой инструмент тестирования ПО, обладающий собственным API, не сложно интегрировать в единую систему, при этом может поддерживаться большинство исполняющих платформ тестирования.
IBM Rational PurifyPlus
включает три инструмента, предназначенных для анализа в режиме реального времени приложений и компонентов, разработанных с помощью Visual C/C++, C#, VB, VB .NET, Java, Java .NET. Purify обеспечивает автоматическое выявление ошибок, связанных с памятью, при этом выделяются источник и расположение ошибки. Если доступен исходный код, то его можно исправить непосредственно из Purify. Запатентованная технология Object Code Insertion позволяет выявлять ошибки доступа к памяти не только в исходном коде, но и в двоичных программных компонентах (DLL, объекты COM/DCOM, ODBC). PureCoverage — средство автоматического определения непротестированного кода. Quantify выполняет оценку производительности, определяя узкие места приложений и компонентов, как с исходным кодом, так и без него. Встроенные средства анализа данных помогают проводить сравнение результатов тестовых прогонов для различных вариантов кода.
IBM Rational Robot
— средство создания, изменения и выполнения автоматизированных тестов Интернет-приложений, ERP-систем и клиент-серверных решений. С его помощью обеспечивается объектно-уровневая поддержка при создании приложений на различных средствах разработки. Сценарии функциональных тестов генерируются в среде SQABasic, синтаксически совместимой с VB; встроенный редактор позволяет расширить сценарии тестов необходимыми процедурами и логическими условиями. Предусмотрена возможность создания специализированных тестов для различных типов программных объектов. Для формирования скриптов используется собственный Си-подобный язык.
IBM Rational TestFactory
— инструмент автоматической генерации скриптов тестирования посредством всестороннего анализа запущенного приложения для выявления дефектов надежности. Поскольку в программах имеется огромное число путей выполнения, проблема заключается в том, чтобы создать тесты, которые проверяют полный функционал приложения за минимальное число шагов.
IBM Rational XDE Tester
— специализированный инструмент для тестирования Java-приложений (J2EE, J2SE, SWT, AWT/JFC) и Web-приложений (HTML, DHTML, XML, JavaScript, апплеты Java). Текстовые сценарии пишутся на Java, технология ScriptAssure обеспечивает проверку достоверности динамических данных. Среда тестирования реализована в оболочке Eclipse, при этом имеется возможность встраивания инструмента в WebSphere Studio и Rational XDE Developer.

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

Тестирование программного обеспечения является неотъемлемой частью цикла разработки программного обеспечения.

Что такое тестирование программного обеспечения?

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

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

Методика тестирования

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

3) Системное тестирование

4) Приемочные испытания

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

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

Системное тестирование

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

Приемочные испытания

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

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

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

Тестирование методом черного ящика

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

Тестирование методом белого ящика

Тестирование методом «Белого ящика», в отличие от «черного ящика», учитывает внутреннее функционирование и логику работы кода. Для выполнения этого теста, тестер должен иметь знания кода, чтобы узнать точную часть кода, имеющую ошибки. Этот тест также известен как White-box, Open-Box или Glass box тестирование.

Тестирование методом серого ящика

Тестирование методом серого ящика или Gray box тестирование, это что-то среднее между White Box и Black Box тестированием, где тестер обладает лишь общими знаниями данного продукта, необходимыми для выполнения теста. Эта проверка осуществляется посредством документации и схемы информационных потоков. Тестирование проводится конечным пользователем, или пользователям, которые представляются как конечные.

Нефункциональные тесты

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

  • управление тестированием, которое включает поддержку управления проектом, версиями, конфигурациями, риск-анализ, отслеживание тестов, ошибок, дефектов и инструменты создания отчетов;
  • управление требованиями, которое включает хранение требований и спецификаций, их проверку на полноту и многозначность, их приоритет и отслеживаемость каждого теста;
  • критический просмотр и статический анализ, включая мониторинг потока и задач, запись и хранение комментариев, обнаружение дефектов и плановых коррекций, управление ссылками на проверочные списки и правила, отслеживание связи исходных документов и кода, статический анализ с обнаружением дефектов, обеспечением соответствия стандартам написания кода, разбором структур и их зависимостей, вычислением метрических параметров кода и архитектуры. Кроме того, используются компиляторы, анализаторы связей и генераторы кросс-ссылок;
  • моделирование, которое включает инструменты моделирования бизнес-поведения и проверки созданных моделей;
  • разработка тестов обеспечивает генерацию ожидаемых данных исходя из условий и интерфейса пользователя, моделей и кода, управление ими для создания или изменения файлов и БД, сообщений, проверки данных исходя из правил управления, анализа статистики условий и рисков;
  • критический просмотр путем ввода данных через графический интерфейс пользователя, API, командные строки с использованием компараторов, помогающих определить успешные и неудавшиеся тесты;
  • поддержка сред отладки, которая позволяет заменить отсутствующее оборудование или ПО, в т. ч. симуляторы оборудования на основе подмножества детерминированного выхода, эмуляторы терминалов, мобильных телефонов или сетевого оборудования, среды для проверки языков, ОС и аппаратного обеспечения путем замены недостающих компонентов драйверами, фиктивными модулями и др., а также инструменты для перехвата и модификации запросов ОС, симуляции ограничений ЦПУ, ОЗУ, ПЗУ или сети;
  • сравнение данных файлов, БД, проверка ожидаемых результатов во время и по окончании тестирования, в т. ч. динамическое и пакетное сравнение, автоматические «оракулы»;
  • измерение покрытия для локализации утечек памяти и некорректного управления ею, оценки поведения системы в условиях симулированной нагрузки, генерации нагрузки приложений, БД, сети или серверов по реалистичным сценариям ее роста, для измерения, анализа, проверки и отчета о системных ресурсах;
  • обеспечение безопасности;
  • тестирование производительности, нагрузки и динамический анализ;
  • другие инструменты, в т. ч. для проверки правописания и синтаксиса, сетевой безопасности, наличия всех страниц веб-сайта и др.

Перспектива

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

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

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

Тестирование программного обеспечения
— процесс исследования программного
обеспечения (ПО) с целью получения
информации о качестве продукта.

Введение

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

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

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

С точки зрения ISO 9126, Качество (программных
средств) можно определить как совокупную
характеристику исследуемого ПО с учётом
следующих составляющих:

· Надёжность

· Сопровождаемость

· Практичность

· Эффективность

· Мобильность

· Функциональность

Более полный список атрибутов и критериев
можно найти в стандарте ISO 9126 Международной
организации по стандартизации. Состав
и содержание документации, сопутствующей
процессу тестирования, определяется
стандартом IEEE 829-1998 Standard for Software Test
Documentation.

История развития тестирования программного
обеспечения

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

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

По объекту тестирования:

· Функциональное тестирование
(functional testing)

· Нагрузочное тестирование

· Тестирование производительности
(perfomance/stress testing)

· Тестирование стабильности
(stability/load testing)

· Тестирование удобства использования
(usability testing)

· Тестирование интерфейса пользователя
(UI testing)

· Тестирование безопасности
(security testing)

· Тестирование локализации
(localization testing)

· Тестирование совместимости
(compatibility testing)

По знанию системы:

· Тестирование чёрного ящика (black
box)

· Тестирование белого ящика (white
box)

· Тестирование серого ящика (gray
box)

По степени автоматизированности:

· Ручное тестирование (manual testing)

· Автоматизированное тестирование
(automated testing)

· Полуавтоматизированное тестирование
(semiautomated testing)

По степени изолированности компонентов:

· Компонентное (модульное) тестирование
(component/unit testing)

· Интеграционное тестирование
(integration testing)

· Системное тестирование
(system/end-to-end testing)

По времени проведения тестирования:

· Альфа тестирование (alpha testing)

· Тестирование при приёмке (smoke
testing)

· Тестирование новых функциональностей
(new feature testing)

· Регрессионное тестирование
(regression testing)

· Тестирование при сдаче (acceptance
testing)

· Бета тестирование (beta testing)

По признаку позитивности сценариев:

· Позитивное тестирование (positive
testing)

· Негативное тестирование (negative
testing)

По степени подготовленности к тестированию:

· Тестирование по документации
(formal testing)

· Эд Хок (интуитивное) тестирование
(ad hoc testing)

Уровни тестирования

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

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

Системное тестирование — тестируется
интегрированная система на её соответствие
требованиям.

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

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

Часто для свободного/открытого ПО стадия
Альфа-тестирования характеризует
функциональное наполнение кода, а Бета
тестирования — стадию исправления
ошибок. При этом как правило на каждом
этапе разработки промежуточные результаты
работы доступны конечным пользователям.

Тестирование «белого ящика» и «чёрного
ящика»

В терминологии профессионалов тестирования
(программного и некоторого аппаратного
обеспечения), фразы «тестирование белого
ящика» и «тестирование чёрного ящика»
относятся к тому, имеет ли разработчик
тестов доступ к исходному коду тестируемого
ПО, или же тестирование выполняется
через пользовательский интерфейс либо
прикладной программный интерфейс,
предоставленный тестируемым модулем.

При тестировании белого ящика (англ.
white-box testing, также говорят — прозрачного
ящика), разработчик теста имеет доступ
к исходному коду программ и может писать
код, который связан с библиотеками
тестируемого ПО. Это типично для
юнит-тестирования (англ. unit testing), при
котором тестируются только отдельные
части системы. Оно обеспечивает то, что
компоненты конструкции — работоспособны
и устойчивы, до определённой степени.
При тестировании белого ящика используются
метрики покрытия кода.

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

Если «альфа-» и «бета-тестирование»
относятся к стадиям до выпуска продукта
(а также, неявно, к объёму тестирующего
сообщества и ограничениям на методы
тестирования), тестирование «белого
ящика» и «чёрного ящика» имеет отношение
к способам, которыми тестировщик
достигает цели.

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

Статическое и динамическое тестирование

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

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

Также к статическому тестированию
относят тестирование требований,
спецификаций, документации.

Регрессионное тестирование

Регрессио́нное тести́рование (англ.
regression testing, от лат. regressio — движение
назад) — собирательное название для
всех видов тестирования программного
обеспечения, направленных на обнаружение
ошибок в уже протестированных участках
исходного кода. Такие ошибки — когда
после внесения изменений в программу
перестает работать то, что должно было
продолжать работать, — называют
регрессионными ошибками (англ. regression
bugs).

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

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

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

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

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

«Фундаментальная проблема при
сопровождении программ состоит в том,
что исправление одной ошибки с большой
вероятностью (20-50%) влечет появление
новой. Поэтому весь процесс идет по
принципу «два шага вперед, шаг назад».

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

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

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

Тестовые скрипты

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

Покрытие кода

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

Критерии

Существует несколько различных способов
измерения покрытия, основные из них:

· Покрытие операторов — каждая ли
строка исходного кода была выполнена
и протестирована?

· Покрытие условий — каждая ли
точка решения (вычисления истинно ли
или ложно выражение) была выполнена и
протестирована?

· Покрытие путей — все ли возможные
пути через заданную часть кода были
выполнены и протестированы?

· Покрытие функций — каждая ли
функция программы была выполнена

· Покрытие вход/выход — все ли
вызовы функций и возвраты из них были
выполнены

Для программ с особыми требованиями к
безопасности часто требуется
продемонстрировать, что тестами
достигается 100 % покрытие для одного из
критериев. Некоторые из приведённых
критериев покрытия связаны между собой;
например, покрытие путей включает в
себя и покрытие условий и покрытие
операторов. Покрытие операторов не
включает покрытие условий, как показывает
этот код на Си:

printf(«this is «);

printf(«a positive integer»);

Если здесь bar = −1, то покрытие операторов
будет полным, а покрытие условий — нет,
так как случай несоблюдения условия в
операторе if — не покрыт. Полное покрытие
путей обычно невозможно. Фрагмент кода,
имеющий n условий содержит 2n путей;
конструкция цикла порождает бесконечное
количество путей. Некоторые пути в
программе могут быть не достигнуты
из-за того, что в тестовых данных
отсутствовали такие, которые могли
привести к выполнению этих путей. Не
существует универсального алгоритма,
который решал бы проблему недостижимых
путей (этот алгоритм можно было бы
использовать для решения проблемы
останова). На практике для достижения
покрытия путей используется следующий
подход: выделяются классы путей (например,
к одному классу можно отнести пути
отличающиеся только количеством итераций
в одном и том же цикле), 100 % покрытие
достигнуто, если покрыты все классы
путей (класс считается покрытым, если
покрыт хотя бы один путь из него).

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

Практическое применение

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

Степень покрытия кода обычно выражают
в виде процента. Например, «мы протестировали
67 % кода». Смысл этой фразы зависит от
того какой критерий был использован.
Например, 67 % покрытия путей — это лучший
результат чем 67 % покрытия операторов.
Вопрос о связи значения покрытия кода
и качеством тестового набора ещё до
конца не решён.

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

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

Введение

В среднем тестирование отнимает 50%
времени и 50% стоимости от общей сметы
проекта (обязательно учитывайте это,
закладывая бюджет). В больших компаниях
(Intel, IBM, Microsoft) за каждым разработчиком
закреплен личный тестировщик. Прошло
то время, когда эту работу выполнял
второсортный программист, которого еще
не подпускали к самостоятельному
кодированию (мол, прежде чем допускать
свои ошибки, сначала пусть учатся на
чужих). Сегодня тестировщик — это
высококвалифицированный и хорошо
оплачиваемый специалист, в услугах
которого нуждаются тысячи фирм и который
никогда не сидит без работы.

Когда вам скажут, что жизненный цикл
продукта состоит из проектирования,
реализации, тестирования и поддержки
— не верьте! Тестирование сопровождает
проект всю его жизнь — от момента рождения
до самой смерти. Проектировщик закладывает
механизмы самодиагностики и вывода
«телеметрической» информации.
Разработчик тестирует каждую
запрограммированную им функцию
(тестирование на микроуровне). Бета-тестеры
проверяют работоспособность всего
продукта в целом. У каждого из них должен
быть четкий план действий, в противном
случае тестирование провалится, еще не
начавшись.

В идеале для каждой функции исходного
кода разрабатывается набор автоматизированных
тестов, предназначенных для проверки
ее работоспособности. Лучше всего
поручить эту работу отдельной группе
программистов, поставив перед ними
задачу: разработать такой пример, на
котором функция провалится. Вот, например,
функция сортировки. Простейший тест
выглядит так. Генерируем произвольные
данные, прогоняем через нее и если для
каждого элемента N условие N =
N + 1 для сортировки по убыванию) истинно,
считаем, что тест пройдет правильно. Но
ведь этот тест неправильный! Необходимо
убедиться, что на выходе функции
присутствуют все исходные данные и нет
ничего лишнего! Многие функции нормально
сортируют десять или даже тысячу
элементов, но спотыкаются на одном или
двух (обычно это происходит при сортировке
методом деления напополам). А если будет
ноль сортируемых элементов? А если одна
из вызываемых функций (например, malloc),
возвратит ошибку — сможет ли тестируемая
функция корректно ее обработать? Сколько
времени (системных ресурсов) потребуется
на сортировку максимально возможного
числа элементов? Неоправданно низкая
производительность — тоже ошибка!

Существует два основных подхода к
тестированию — черный и белый ящики.
«Черный ящик» — это функция с закрытым
кодом, проверка которого сводится к
тупому перебору всех комбинаций
аргументов. Очевидно, что подавляющее
большинство функций не могут быть
протестированы за разумное время
(количество комбинаций слишком велико).
Код белого ящика известен и тестировщик
может сосредоточить свое внимание на
пограничных областях. Допустим, в функции
есть ограничение на предельно допустимую
длину строки в MAX_LEN символов. Тогда
следует тщательно исследовать строки
в MAX_LEN — 1, MAX_LEN и MAX_LEN + 1 символов, поскольку
ошибка «в плюс-минус один байт» —
одна из самых популярных.

Тест должен задействовать все ветви
программы, чтобы после его выполнения
не осталось ни одной незадействованной
строчки кода. Соотношение кода, который
хотя бы раз получил выполнение, к общему
коду программы, называется покрытием
(coverage) и для его измерения придумано
множество инструментов — от профилировщиков,
входящих в штатный комплект поставки
компиляторов, до самостоятельных
пакетов, лучшим из которых является
NuMega True Coverage.

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

Всегда транслируйте программу с
максимальным уровнем предупреждений
(для Microsoft Visual C++ это ключ /W4), обращая
внимание на все сообщения компилятора.
Некоторые, наиболее очевидные ошибки
обнаруживаются уже на этом этапе.
Сторонние верификаторы кода (lint, smatch)
еще мощнее и распознают ошибки, с которыми
трансляторы уже не справляются.

Регистрация ошибок

Завалить программу — проще всего.
Зафиксировать обстоятельства сбоя
намного сложнее. Типичная ситуация:
тестировщик прогоняет программу через
серию тестов. Непройденные тесты
отправляются разработчику, чтобы тот
локализовал ошибку и исправил баги. Но
у разработчика эти же самые тесты
проходят успешно! А, он уже все переделал,
перекомпилировал с другими ключами и
т.д. Чтобы этого не происходило, используйте
системы управления версиями — Microsoft
Source Safe или никсовый CVS.

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

Самыми коварными являются «плавающие»
ошибки, проявляющиеся с той или иной
степенью вероятности — девятьсот прогонов
программа проходит нормально, а затем
неожиданно падает без всяких видимых
причин. Эй, кто там орет, что такого не
бывает? Машина, дескать, детерминирована,
и если железо исправно, то баг либо есть,
либо нет. Ага, разбежались! Многопоточные
приложения и код, управляющий устройствами
ввода/вывода, порождают особый класс
невоспроизводимых ошибок, некоторые
из которых могут проявляться лишь раз
в несколько лет! Вот типичный пример:

f1() {int x = strlen(s); s[x] = «*»; s = 0;} // поток 1

f2() {printf(«%sn», s);} // поток 2

Листинг 1. Пример плавающей ошибки.

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

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

Вот к чему приводят ошибки проектирования
при загрузке системы реальными данными

Рисунок 1. Вот к чему приводят ошибки
проектирования при загрузке системы
реальными данными.

Бета-тестирование

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

Уронив программу (или добившись от нее
выдачи неверных данных), бета-тестер
должен суметь воспроизвести сбой, т.е.
выявить наиболее короткую последовательность
операций, приводящую к ошибке. А сделать
это ой как непросто! Попробуй-ка вспомнить,
какие клавиши были нажаты! Что? Не
получается?! Су… Используйте клавиатурные
шпионы. На любом хакерском сайте их
навалом. Пусть поработают на благо
народа (не вечно же пароли похищать).
Шпионить за мышью намного сложнее —
приходится сохранять не только позицию
курсора, но координаты всех окон или
задействовать встроенные макросредства
(по типу Visual Basic»a в Word»е). В общем, мышь —
это саксь и маст дай. Нормальные
бета-тестеры обходятся одной клавиатурой.
Полный протокол нажатий сокращает круг
поиска ошибки, однако с первого раза
воспроизвести сбой удается не всегда
и не всем.

В процессе тестирования приходится
многократно выполнять одни и те же
операции. Это раздражает, ненадежно и
непроизводительно. В штатную поставку
Windows 3.x входил клавиатурный проигрыватель,
позволяющий автоматизировать такие
операции. Теперь же его приходится
приобретать отдельно. Впрочем, такую
утилиту можно написать и самостоятельно.
В этом помогут функции FindWindow и SendMessage.

Тестируйте программу на всей линейке
операционных систем: Windows 98, Windows 2000,
Windows 2003 и т.д. Различия между ними очень
значительны. Что стабильно работает
под одной осью, может падать под другой,
особенно если она перегружена кучей
конфликтующих приложений. Ладно, если
это кривая программа Васи Пупкина (тут
на пользователя можно и наехать), но
если ваша программа не уживается в MS
Office или другими продуктами крупных
фирм, бить будут вас. Никогда не меняйте
конфигурацию системы в процессе
тестирования! Тогда будет трудно
установить, чей это баг. Хорошая штука
— виртуальные машины (VM Ware, Microsoft Virtual
PC). На одном компьютере можно держать
множество версий операционных систем
с различной комбинацией установленных
приложений — от стерильной до полностью
захламленной. При возникновении ошибки
состояние системы легко сохранить на
жесткий диск, обращаясь к нему впоследствии
столько раз, сколько потребуется.

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

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

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

Тестирование ПО
— попытка определить, выполняет ли программа то, что от неё ожидают. Как правило, никакое тестирование не может дать абсолютной гарантии работоспособности программы в будущем.

Для наглядности: почти все производители коммерческого ПО исправляют ошибки в своих продуктах.

Например: Корпорация Microsoft выпускает пакеты обновлений («Service Pack»), для своих операционных систем. Разработчики игр регулярно выпускают «патчи» для своих продуктов. Большинство разработчиков ПО после устранения ошибок выпускают обновлённую (новую) версию своей программы.

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

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

По объекту тестирования:

  • Функциональное тестирование (functional testing)
  • Нагрузочное тестирование
    • Тестирование производительности (perfomance/stress testing)
    • Тестирование стабильности (stability/load testing)
  • Тестирование удобства использования (usability testing)
  • Тестирование интерфейса пользователя (UI testing)
  • Тестирование безопасности (security testing)
  • Тестирование локализации (localization testing)
  • Тестирование совместимости (compatibility testing)

По знанию системы:

  • Тестирование чёрного ящика (black box)
  • Тестирование белого ящика (white box)
  • Тестирование серого ящика (gray box)

По степени автоматизированности:

  • Ручное тестирование (manual testing)
  • Автоматизированное тестирование (automated testing)
  • Полуавтоматизированное тестирование (semiautomated testing)

По степени изолированности компонентов:

  • Компонентное (модульное) тестирование (component/unit testing)
  • Интеграционное тестирование (integration testing)
  • Системное тестирование (system/end-to-end testing)

По времени проведения тестирования:

  • Альфа тестирование (alpha testing)
    • Тестирование при приёмке (smoke testing)
    • Тестирование новых функциональностей (new feature testing)
    • Регрессионное тестирование (regression testing)
    • Тестирование при сдаче (acceptance testing)
  • Бета тестирование (beta testing)

По признаку позитивности сценариев:

  • Позитивное тестирование (positive testing)
  • Негативное тестирование (negative testing)

По степени подготовленности к тестированию:

  • Тестирование по документации (formal testing)
  • Эд Хок (интуитивное) тестирование (ad hoc testing)

Уровни тестирования

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

Часто для свободного/открытого ПО стадия Альфа-тестирования характеризует функциональное наполнение кода, а Бета тестирования — стадию исправления ошибок. При этом как правило на каждом этапе разработки промежуточные результаты работы доступны конечным пользователям.

Тестирование «белого ящика» и «чёрного ящика»

В терминологии профессионалов тестирования (программного и некоторого аппаратного обеспечения), фразы «тестирование белого ящика» и «тестирование чёрного ящика» относятся к тому, имеет ли разработчик тестов доступ к исходному коду тестируемого ПО, или же тестирование выполняется через пользовательский интерфейс либо прикладной программный интерфейс, предоставленный тестируемым модулем.

При тестировании белого ящика (англ. white-box testing

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

), при котором тестируются только отдельные части системы. Оно обеспечивает то, что компоненты конструкции — работоспособны и устойчивы, до определённой степени. При тестировании белого ящика используются метрики покрытия кода.

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

Если «альфа-» и «бета-тестирование» относятся к стадиям до выпуска продукта (а также, неявно, к объёму тестирующего сообщества и ограничениям на методы тестирования), тестирование «белого ящика» и «чёрного ящика» имеет отношение к способам, которыми тестировщик достигает цели.

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

Статическое и динамическое тестирование

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

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

Также к статическому тестированию относят тестирование требований, спецификаций, документации.

Регрессионное тестирование

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

Тестовые скрипты

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

Покрытие кода

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

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

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

Разработка через тестирование (test-driven development)

(англ. test-driven development) — техника программирования, при которой модульные тесты для программы или её фрагмента пишутся до самой программы (англ. test-first development) и, по существу, управляют её разработкой. Является одной из основных практик экстремального программирования.

Ни один программист не считает работу над некоторым фрагментом кода завершенной, не проверив перед этим его работоспособность. Однако, если вы тестируете свой код, это не означает, что у вас есть тесты.

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

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

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

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

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

    Разработчику приятнее писать такой код.

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

    Пишем новый код только тогда, когда автоматический код не сработал.

    Удаляем дублирование.

Два столь простых правила на самом деле генерируют сложное индивидуальное и групповое поведение со множеством технических последствий:

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

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

    Наша среда разработки должна быстро реагировать на небольшие модификации кода.

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

Два упомянутых правила TDD определяют порядок этапов программирования:

    Красный — напишите небольшой тест, который не работает, а возможно, даже не компилируется.

    Зеленый — заставьте тест работать как можно быстрее, при этом не думайте о правильности дизайна и чистоте кода. Напишите ровно столько кода, чтобы тест сработал.

    Рефакторинг — удалите из написанного вами кода любое дублирование.

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

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

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

Терминология, связанная с модульными тестами

  • Разработка через тестирование
    — процесс разработки программного обеспечения, который предусматривает написание и автоматизацию модульных тестов еще до момента написания соответствующих классов или модулей. Это гарантирует, что все обязанности любого элемента программного обеспечения определяются еще до того, как они будут закодированы.
  • Модульные тесты
    — Unit Tests, Programming Tests, Developer Tests — тесты, проверяющие функциональность отдельных классов, компонентов, модулей приложения. Эти тесты не видны конечному заказчику или доменному эксперту. Обычно их начинают писать после оформления функциональных тестов.
  • Зеленая/Красная полоса
    — многие графические среды для выполнения модульных тестов отображают результат выполнения тестов в виде линии, которая окрашена в зеленый цвет, если все тесты выполнились удачно, и красной, если были ошибки.
  • Моки, Мок-объекты (MockObjects)
    — автоматически генерируемые заглушки, которые могу выступат в роли реальных объектов. Поведением моков можно управлять непосредственно в тесте. Моки могут выполнять дополнительные проверки, что тестируемый код их использовал, как ожидалось.
  • Модульный тест
    — тест, который проверяет поведение небольшой части приложения. Эта часть может быть одним классом, одним методом или набором классов, который реализуют какое-то архитектурное решение, и это решение необходимо проверить на работоспособность.
  • Тест — TestCase
    — набор тестовых методов, предназначенных для тестирования одного класса (в среде xUnit). Обычно TestCase состоит из методов, чье имя начинается с приставки test. Каждый такой метод тестирует какой-либо один момент тестируемого класса. В приемочном тестировании TestCase — это набор команд, которые тестируют одну значимую для заказчика функциональность.
  • Фикстура — Fixture
    — состояние среды тестирования, которое требуется для успешного выполнения тестового метода. Это может быть набор каких-либо объектов, состояние базы данных, наличие определенных файлов и т.д. Фикстура создается в методе setUp() перед каждым вызовом метода вида testSomething теста (TestCase) и удаляется в tearDown() после окончания выполнения тестового метода.
  • Проверка — Assert
    — метод класса TestCase, который предназначен для сверки реального состояния тестируемого кода с ожидаемым.

Терминология, связанная с наборами тестов

  • Набор тестов — TestSuite
    — набор тестов, предназначенный для тестирования какой-либо укрупненной сущности программной системы. В SimpleTest есть понятие TestGroup, которые практически эквивалентно понятию TestSuite. Иногда TestSuite употребляют в значении «все тесты, которые есть для приложения».

Терминология, связанная с приемочными тестами

  • Приемочные (функциональные) тесты — Customer tests, Acceptance tests
    — тесты, проверяющие функциональность приложения на соответствие требованиям заказчика. Приемочные тесты не должны ничего знать о деталях реализации приложения. Приемочные тесты заменяют ТЗ при использовании методики экстремального программирования (XP).
  • Регрессионный тесты
    — тесты, которые проверяют, что поведение системы не изменилось. На самом деле, большинство регрессионных тестов являются или модульными или функциональными тестами, которые включаются в определенный набор тестов (RegressionTestSuite), который гарантирует, что функциональность системы не будет случайно изменена.

Тестирование


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

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

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

1)
информирование испытуемого о целях
проведения тестирования;

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

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

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

5)
предупреждение распространения
полученной в результате тестирования
психодиагностической информации,
обеспечение ее конфиденциальности;

6)
ознакомление испытуемого с результатами
тестирования, сообщение ему или
ответственному лицу соответствующей
информации с учетом принципа «Не
навреди!»; в этом случае возникает
необходимость решения серии этических
и нравственных задач;

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

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

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

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

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

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

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

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

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

свойство.
Применяются разные способы проверки
надежности тестов.

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

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

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

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

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

Изучение
продуктов деятельности


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

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

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

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

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

С чего же начинать организацию процесса тестирования?

Я выделяю 11 основных критериев в организации процесса тестирования:

  1. Цели и область тестирования
  2. Команда
  3. Управление
  4. Коммуникация и взаимодействие
  5. Методология тестирования
  6. Документированность процесса
  7. Управление рисками
  8. Измерение процесса
  9. Инструменты
  10. Тестовые среды
  11. Совершенствование процесса

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

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

  • Зачем нам нужно тестирование?
  • Что мы имеем, чтобы сделать тестирование?
  • Какие процессы нужно формализовать или создать?
  • Как и что мы должны тестировать?

Только после того, как мы получим ответы на эти вопросы, можно начинать переходить к стандартам.

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

  • ISO 29119
  • IEEE 8291008
  • TPI Next&TMap
  • ISTQB

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

Любой ИТ процесс всегда должен удовлетворять потребностям бизнеса!

Мы разберем основные критерии построения процесса тестирования.

Цели и область тестирования

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

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

Говоря об области тестирования, мы должны прекрасно понимать, что именно нам предстоит тестировать. Это могут быть системы, компоненты, бизнес процессы. Для того, чтобы это понять, то нужно просто ответить на два вопроса:

  • Что надо тестировать?
  • Что будем тестировать?

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

Команда и управление

Команда — это самая важная составляющая процесса тестирования. Без команды вы, как руководитель, ничего не сделаете. Зачастую к формированию команды подходят несколькими подходами:

Инструменты и инфраструктура

Какой же процесс тестирования без инструментов? Это получается ручной труд ради ручного труда 🙂 Я думаю многие из вас часто слышали о написании тест-кейсов в документах ворд, о построения графиков и диаграмм в экселе. Но, зачем тратить усилия, если рынок предлагает нам готовые продукты управления тестирования, такие как HP ALM, MS TFS, TestRail, TestLink, JIRA Zephyr и многие другие.
Поэтому, если вы приступили к организации процесса тестирования, то делайте этот процесс удобным и эффективным. Пишите тест-кейсы в удобных формах готовых продуктов, интегрируйте инструменты с системой управления задачами, настраивайте и т.д.

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

  • Какие задачи вы планируете выполнять?
  • Какой у вас бюджет на инструменты?

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

Помимо инструментов управления тестирования, к инструментам тестирования также можно отнести:

  • Система управления дефектами и задачами (может включаться в систему управления тестированием)
  • Вспомогательные инструменты (для скриншотов, снятия логов, работы с БД, SOUP UI для XML и т.д.)
  • Инструменты автоматизации ( , Selenium и т.д.)
  • Системы управления знаниями (на wiki движке)

Теперь поговорим об инфраструктуре. В текущем контексте своего повествования я подразумеваю тестовые среды.

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

Стандартно я выделяю следующие типы тестовых сред:

  • Среда разработки (можно ли ее относить к тестовой?, но тем не менее)
  • Среда тестирования системы (может быть развернута одна или несколько систем, компонент, не требует серьезных мощностей)
  • Среда интеграции (полноценный интеграционная среда для проверки работоспособности сквозных бизнес процессов)
  • Среда (основное требования — соответствие мощностями боевому контуру)
  • Среда ПродЛайк/ПреПрод (среда для отладки готового протестированного билда, проведение инсталяционного тестирования)

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

Совершенствование процесса

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

Но это не так. Почему мы должны постоянно совершенствовать процесс тестирования:

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

2. ИТ сфера постоянно развивается. Приходят новые технологи подходы, которые всегда позволяются совершенствовать процесс тестирования.

Как говорится, совершенству нет предела!

Ну а как совершенствовать — это стандартный цикл Демминга.

Запланировали — .Сделали — Проанализировали — Скорректировали

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

Тестирование программного обеспечения
— процесс исследования программного
обеспечения (ПО) с целью получения
информации о качестве продукта.

Введение

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

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

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

С точки зрения ISO 9126, Качество (программных
средств) можно определить как совокупную
характеристику исследуемого ПО с учётом
следующих составляющих:

· Надёжность

· Сопровождаемость

· Практичность

· Эффективность

· Мобильность

· Функциональность

Более полный список атрибутов и критериев
можно найти в стандарте ISO 9126 Международной
организации по стандартизации. Состав
и содержание документации, сопутствующей
процессу тестирования, определяется
стандартом IEEE 829-1998 Standard for Software Test
Documentation.

История развития тестирования программного
обеспечения

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

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

По объекту тестирования:

· Функциональное тестирование
(functional testing)

· Нагрузочное тестирование

· Тестирование производительности
(perfomance/stress testing)

· Тестирование стабильности
(stability/load testing)

· Тестирование удобства использования
(usability testing)

· Тестирование интерфейса пользователя
(UI testing)

· Тестирование безопасности
(security testing)

· Тестирование локализации
(localization testing)

· Тестирование совместимости
(compatibility testing)

По знанию системы:

· Тестирование чёрного ящика (black
box)

· Тестирование белого ящика (white
box)

· Тестирование серого ящика (gray
box)

По степени автоматизированности:

· Ручное тестирование (manual testing)

· Автоматизированное тестирование
(automated testing)

· Полуавтоматизированное тестирование
(semiautomated testing)

По степени изолированности компонентов:

· Компонентное (модульное) тестирование
(component/unit testing)

· Интеграционное тестирование
(integration testing)

· Системное тестирование
(system/end-to-end testing)

По времени проведения тестирования:

· Альфа тестирование (alpha testing)

· Тестирование при приёмке (smoke
testing)

· Тестирование новых функциональностей
(new feature testing)

· Регрессионное тестирование
(regression testing)

· Тестирование при сдаче (acceptance
testing)

· Бета тестирование (beta testing)

По признаку позитивности сценариев:

· Позитивное тестирование (positive
testing)

· Негативное тестирование (negative
testing)

По степени подготовленности к тестированию:

· Тестирование по документации
(formal testing)

· Эд Хок (интуитивное) тестирование
(ad hoc testing)

Уровни тестирования

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

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

Системное тестирование — тестируется
интегрированная система на её соответствие
требованиям.

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

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

Часто для свободного/открытого ПО стадия
Альфа-тестирования характеризует
функциональное наполнение кода, а Бета
тестирования — стадию исправления
ошибок. При этом как правило на каждом
этапе разработки промежуточные результаты
работы доступны конечным пользователям.

Тестирование «белого ящика» и «чёрного
ящика»

В терминологии профессионалов тестирования
(программного и некоторого аппаратного
обеспечения), фразы «тестирование белого
ящика» и «тестирование чёрного ящика»
относятся к тому, имеет ли разработчик
тестов доступ к исходному коду тестируемого
ПО, или же тестирование выполняется
через пользовательский интерфейс либо
прикладной программный интерфейс,
предоставленный тестируемым модулем.

При тестировании белого ящика (англ.
white-box testing, также говорят — прозрачного
ящика), разработчик теста имеет доступ
к исходному коду программ и может писать
код, который связан с библиотеками
тестируемого ПО. Это типично для
юнит-тестирования (англ. unit testing), при
котором тестируются только отдельные
части системы. Оно обеспечивает то, что
компоненты конструкции — работоспособны
и устойчивы, до определённой степени.
При тестировании белого ящика используются
метрики покрытия кода.

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

Если «альфа-» и «бета-тестирование»
относятся к стадиям до выпуска продукта
(а также, неявно, к объёму тестирующего
сообщества и ограничениям на методы
тестирования), тестирование «белого
ящика» и «чёрного ящика» имеет отношение
к способам, которыми тестировщик
достигает цели.

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

Статическое и динамическое тестирование

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

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

Также к статическому тестированию
относят тестирование требований,
спецификаций, документации.

Регрессионное тестирование

Регрессио́нное тести́рование (англ.
regression testing, от лат. regressio — движение
назад) — собирательное название для
всех видов тестирования программного
обеспечения, направленных на обнаружение
ошибок в уже протестированных участках
исходного кода. Такие ошибки — когда
после внесения изменений в программу
перестает работать то, что должно было
продолжать работать, — называют
регрессионными ошибками (англ. regression
bugs).

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

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

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

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

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

«Фундаментальная проблема при
сопровождении программ состоит в том,
что исправление одной ошибки с большой
вероятностью (20-50%) влечет появление
новой. Поэтому весь процесс идет по
принципу «два шага вперед, шаг назад».

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

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

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

Тестовые скрипты

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

Покрытие кода

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

Критерии

Существует несколько различных способов
измерения покрытия, основные из них:

· Покрытие операторов — каждая ли
строка исходного кода была выполнена
и протестирована?

· Покрытие условий — каждая ли
точка решения (вычисления истинно ли
или ложно выражение) была выполнена и
протестирована?

· Покрытие путей — все ли возможные
пути через заданную часть кода были
выполнены и протестированы?

· Покрытие функций — каждая ли
функция программы была выполнена

· Покрытие вход/выход — все ли
вызовы функций и возвраты из них были
выполнены

Для программ с особыми требованиями к
безопасности часто требуется
продемонстрировать, что тестами
достигается 100 % покрытие для одного из
критериев. Некоторые из приведённых
критериев покрытия связаны между собой;
например, покрытие путей включает в
себя и покрытие условий и покрытие
операторов. Покрытие операторов не
включает покрытие условий, как показывает
этот код на Си:

printf(«this is «);

printf(«a positive integer»);

Если здесь bar = −1, то покрытие операторов
будет полным, а покрытие условий — нет,
так как случай несоблюдения условия в
операторе if — не покрыт. Полное покрытие
путей обычно невозможно. Фрагмент кода,
имеющий n условий содержит 2n путей;
конструкция цикла порождает бесконечное
количество путей. Некоторые пути в
программе могут быть не достигнуты
из-за того, что в тестовых данных
отсутствовали такие, которые могли
привести к выполнению этих путей. Не
существует универсального алгоритма,
который решал бы проблему недостижимых
путей (этот алгоритм можно было бы
использовать для решения проблемы
останова). На практике для достижения
покрытия путей используется следующий
подход: выделяются классы путей (например,
к одному классу можно отнести пути
отличающиеся только количеством итераций
в одном и том же цикле), 100 % покрытие
достигнуто, если покрыты все классы
путей (класс считается покрытым, если
покрыт хотя бы один путь из него).

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

Практическое применение

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

Степень покрытия кода обычно выражают
в виде процента. Например, «мы протестировали
67 % кода». Смысл этой фразы зависит от
того какой критерий был использован.
Например, 67 % покрытия путей — это лучший
результат чем 67 % покрытия операторов.
Вопрос о связи значения покрытия кода
и качеством тестового набора ещё до
конца не решён.

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

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

Введение

В среднем тестирование отнимает 50%
времени и 50% стоимости от общей сметы
проекта (обязательно учитывайте это,
закладывая бюджет). В больших компаниях
(Intel, IBM, Microsoft) за каждым разработчиком
закреплен личный тестировщик. Прошло
то время, когда эту работу выполнял
второсортный программист, которого еще
не подпускали к самостоятельному
кодированию (мол, прежде чем допускать
свои ошибки, сначала пусть учатся на
чужих). Сегодня тестировщик — это
высококвалифицированный и хорошо
оплачиваемый специалист, в услугах
которого нуждаются тысячи фирм и который
никогда не сидит без работы.

Когда вам скажут, что жизненный цикл
продукта состоит из проектирования,
реализации, тестирования и поддержки
— не верьте! Тестирование сопровождает
проект всю его жизнь — от момента рождения
до самой смерти. Проектировщик закладывает
механизмы самодиагностики и вывода
«телеметрической» информации.
Разработчик тестирует каждую
запрограммированную им функцию
(тестирование на микроуровне). Бета-тестеры
проверяют работоспособность всего
продукта в целом. У каждого из них должен
быть четкий план действий, в противном
случае тестирование провалится, еще не
начавшись.

В идеале для каждой функции исходного
кода разрабатывается набор автоматизированных
тестов, предназначенных для проверки
ее работоспособности. Лучше всего
поручить эту работу отдельной группе
программистов, поставив перед ними
задачу: разработать такой пример, на
котором функция провалится. Вот, например,
функция сортировки. Простейший тест
выглядит так. Генерируем произвольные
данные, прогоняем через нее и если для
каждого элемента N условие N =
N + 1 для сортировки по убыванию) истинно,
считаем, что тест пройдет правильно. Но
ведь этот тест неправильный! Необходимо
убедиться, что на выходе функции
присутствуют все исходные данные и нет
ничего лишнего! Многие функции нормально
сортируют десять или даже тысячу
элементов, но спотыкаются на одном или
двух (обычно это происходит при сортировке
методом деления напополам). А если будет
ноль сортируемых элементов? А если одна
из вызываемых функций (например, malloc),
возвратит ошибку — сможет ли тестируемая
функция корректно ее обработать? Сколько
времени (системных ресурсов) потребуется
на сортировку максимально возможного
числа элементов? Неоправданно низкая
производительность — тоже ошибка!

Существует два основных подхода к
тестированию — черный и белый ящики.
«Черный ящик» — это функция с закрытым
кодом, проверка которого сводится к
тупому перебору всех комбинаций
аргументов. Очевидно, что подавляющее
большинство функций не могут быть
протестированы за разумное время
(количество комбинаций слишком велико).
Код белого ящика известен и тестировщик
может сосредоточить свое внимание на
пограничных областях. Допустим, в функции
есть ограничение на предельно допустимую
длину строки в MAX_LEN символов. Тогда
следует тщательно исследовать строки
в MAX_LEN — 1, MAX_LEN и MAX_LEN + 1 символов, поскольку
ошибка «в плюс-минус один байт» —
одна из самых популярных.

Тест должен задействовать все ветви
программы, чтобы после его выполнения
не осталось ни одной незадействованной
строчки кода. Соотношение кода, который
хотя бы раз получил выполнение, к общему
коду программы, называется покрытием
(coverage) и для его измерения придумано
множество инструментов — от профилировщиков,
входящих в штатный комплект поставки
компиляторов, до самостоятельных
пакетов, лучшим из которых является
NuMega True Coverage.

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

Всегда транслируйте программу с
максимальным уровнем предупреждений
(для Microsoft Visual C++ это ключ /W4), обращая
внимание на все сообщения компилятора.
Некоторые, наиболее очевидные ошибки
обнаруживаются уже на этом этапе.
Сторонние верификаторы кода (lint, smatch)
еще мощнее и распознают ошибки, с которыми
трансляторы уже не справляются.

Регистрация ошибок

Завалить программу — проще всего.
Зафиксировать обстоятельства сбоя
намного сложнее. Типичная ситуация:
тестировщик прогоняет программу через
серию тестов. Непройденные тесты
отправляются разработчику, чтобы тот
локализовал ошибку и исправил баги. Но
у разработчика эти же самые тесты
проходят успешно! А, он уже все переделал,
перекомпилировал с другими ключами и
т.д. Чтобы этого не происходило, используйте
системы управления версиями — Microsoft
Source Safe или никсовый CVS.

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

Самыми коварными являются «плавающие»
ошибки, проявляющиеся с той или иной
степенью вероятности — девятьсот прогонов
программа проходит нормально, а затем
неожиданно падает без всяких видимых
причин. Эй, кто там орет, что такого не
бывает? Машина, дескать, детерминирована,
и если железо исправно, то баг либо есть,
либо нет. Ага, разбежались! Многопоточные
приложения и код, управляющий устройствами
ввода/вывода, порождают особый класс
невоспроизводимых ошибок, некоторые
из которых могут проявляться лишь раз
в несколько лет! Вот типичный пример:

f1() {int x = strlen(s); s[x] = «*»; s = 0;} // поток 1

f2() {printf(«%sn», s);} // поток 2

Листинг 1. Пример плавающей ошибки.

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

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

Вот к чему приводят ошибки проектирования
при загрузке системы реальными данными

Рисунок 1. Вот к чему приводят ошибки
проектирования при загрузке системы
реальными данными.

Бета-тестирование

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

Уронив программу (или добившись от нее
выдачи неверных данных), бета-тестер
должен суметь воспроизвести сбой, т.е.
выявить наиболее короткую последовательность
операций, приводящую к ошибке. А сделать
это ой как непросто! Попробуй-ка вспомнить,
какие клавиши были нажаты! Что? Не
получается?! Су… Используйте клавиатурные
шпионы. На любом хакерском сайте их
навалом. Пусть поработают на благо
народа (не вечно же пароли похищать).
Шпионить за мышью намного сложнее —
приходится сохранять не только позицию
курсора, но координаты всех окон или
задействовать встроенные макросредства
(по типу Visual Basic»a в Word»е). В общем, мышь —
это саксь и маст дай. Нормальные
бета-тестеры обходятся одной клавиатурой.
Полный протокол нажатий сокращает круг
поиска ошибки, однако с первого раза
воспроизвести сбой удается не всегда
и не всем.

В процессе тестирования приходится
многократно выполнять одни и те же
операции. Это раздражает, ненадежно и
непроизводительно. В штатную поставку
Windows 3.x входил клавиатурный проигрыватель,
позволяющий автоматизировать такие
операции. Теперь же его приходится
приобретать отдельно. Впрочем, такую
утилиту можно написать и самостоятельно.
В этом помогут функции FindWindow и SendMessage.

Тестируйте программу на всей линейке
операционных систем: Windows 98, Windows 2000,
Windows 2003 и т.д. Различия между ними очень
значительны. Что стабильно работает
под одной осью, может падать под другой,
особенно если она перегружена кучей
конфликтующих приложений. Ладно, если
это кривая программа Васи Пупкина (тут
на пользователя можно и наехать), но
если ваша программа не уживается в MS
Office или другими продуктами крупных
фирм, бить будут вас. Никогда не меняйте
конфигурацию системы в процессе
тестирования! Тогда будет трудно
установить, чей это баг. Хорошая штука
— виртуальные машины (VM Ware, Microsoft Virtual
PC). На одном компьютере можно держать
множество версий операционных систем
с различной комбинацией установленных
приложений — от стерильной до полностью
захламленной. При возникновении ошибки
состояние системы легко сохранить на
жесткий диск, обращаясь к нему впоследствии
столько раз, сколько потребуется.

Тестирование

Тестирование (англ. test — испытание, проверка) — эксперементальный метод психродиагностики, применяемый в эмпирических социологических исследованиях, а также метод измерения и оценки различных психологических качеств и состояний индивида.

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

Основоположники тестирования — Ф.Гальтон, Ч.Спирман, Дж.Каттел, А.Бине, Т.Симон. Сам термин «умственный тест» придумал Кеттел в 1890 г. Начало развития современной тестологии массового применения тестов на практике связано с именем французского врача Бине, разработавшего в соавторстве с Симоном метрическую шкалу умственного развития, известную под названием «тест Бине-Симона».

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

Тесты предъявляют требования:

Строгая формализация всех этапов тестирования,

Стандартизация заданий и условий их выполнения,

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

Интерпретации результатов на основе предварительно полученного распределения по изучаемому признаку.

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

1) стандартная инструкция для испытуемого о цели и правилах выполнения заданий,

2) ключ шкалирования — соотнесение пунктов заданий со шкалами измеряемых качеств, указывающее, какой пункт заданий к какой шкале относится,

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

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

Для преодоления основного недостатка большинства тестов применяются различные приемы:

1) увеличение базовой выборки с целью повышения ее репрезентативности по большему числу параметров,

2) введение поправочных коэффициетнов с учетом характеристик выборки,

3)введение в практику тестирования невербального способа предъявления материала.

Тест состоит из двух частей:

а) стимулирующего материала (задача, инструкция или вопрос)

б) указаний относительно регистрации или интнграции полученых ответов.

Типичная для тестов стандартизация ситуации обеспечивает им в отличие от «свободного» наблюдения поведения большуюю объективность результатов.

Тесты классифицируются по разным признакам.

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

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

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

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

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

Разработка теста состоит из четырех этапов.

На первомэтапе развивается исходная концепция с формулировкой основных пунктов испытания или основных вопросов, носящих предварительный характер;

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

На третьем этапе тест проверяется повторно на той же самой популяции;

На четвертом — калибруется по отношению к возрасту, уровню образования и другим признакам популяции.

На всех этапах разработки теста необходимо учитывать:

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

б) связанную с этим валидизацию метода, т.е. опpеделение того, насколько он измеpяет тpебуемое свойство;

в) величину выбоpки из популяции, на котоpой должна пpоводиться оценка метода;

г) стимулиpующий матеpиал (таблички, изобpажения, игpушки, фильмы);

д) влияние исследователя в пpоцессе инстpуктиpования, постановки задач, pазъяснений, ответов на вопpосы;

е) условия ситуации;

ж) такие фоpмы поведения испытуеого, котоpые свидетельствуют об измеpяемом свойстве;

з) шкалиpование pелевантных фоpм поведения;

и) сведение pезультатов по отдельным измеpяемым пунктам в общие значения (напpимеp, суммиpование ответов типа «Да»);

к) фоpмулиpовку pезультатов в ноpмиpованной шкале оценок.

Одним из вариантов теста может быть опросник, но при условии, что он отвечает требованиям, предъявляемым к тестам. Опросник — это сборник вопросов, которые выбираются и располагаются по отношению друг к другу в соответствии с требуемым содержанием. Опросники используются, например, в целях психодиагностики, когда от испытуемого требуется самооценка его поведения, привычек, мнений и т.д. При этом испытуемый, отвечаяя на вопросы, выражает свои положительные и отрицательные предпочтения. С помощью опросников можно измерять у испытуемых и оценки ими других людей. Задание обычно выступает, как прямая реакция на вопросы, на которые надо ответить путем сожаления или опровержения. Возможности для ответа в большинстве случаев заданы и требуют лишь отметки в виде крестика, крижочка и т.п. Недостаток опросника состоит в том, что испытуемый может симулировать или диссимулировать те или иные свойства личности. Преодолеть указанный недостаток (хотя и не полностью) исследователь может посредством контрольных вопросов, контрольных шкал, шкал «лжи». Опросники применяются преимущественно для диагностики характера, диагностики личности (например, экстроверсии — интроверсии, интересов, установок, мотивов).

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

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

Использованная литература:

1.Соц.справочник,Киев,1990.

2.Соц.словарь,Минск,1991.

3.Фонд времени и мероприятия в соц.сфере,М:Наука,1989.

Существуют различные методологии динамического тестирования ПО. В зависимости от наличия у тестировщика доступа к исходному коду программы, выделяют следующие методы тестирования:

  • · Метод черного ящика
  • · Метод белого ящика
  • · Метод серого ящика

Метод черного ящика.

Впервые термин «черный ящик» упоминается психиатром У. Р. Эшби в книге «Введение в кибернетику» в 1959 г. Он писал, что метод черного ящика позволяет изучать поведение системы абстрагируясь от ее внутреннего устройства.

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

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

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

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

Метод белого ящика.

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

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

Метод серого ящика.

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

Тестирование


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

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

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

1)
информирование испытуемого о целях
проведения тестирования;

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

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

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

5)
предупреждение распространения
полученной в результате тестирования
психодиагностической информации,
обеспечение ее конфиденциальности;

6)
ознакомление испытуемого с результатами
тестирования, сообщение ему или
ответственному лицу соответствующей
информации с учетом принципа «Не
навреди!»; в этом случае возникает
необходимость решения серии этических
и нравственных задач;

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

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

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

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

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

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

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

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

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

свойство.
Применяются разные способы проверки
надежности тестов.

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

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

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

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

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

Изучение
продуктов деятельности


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

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

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

Жизненный цикл разработки программного обеспечения – это процедурный процесс в разработке программного продукта. Этот процесс осуществляется серией шагов, которые объясняют в целом идею, лежащую в основе разработки программного продукта.

Классификация жизненного цикла процесса разработки программного обеспечения происходит следующим образом:

  1. Планирование
  2. Анализ
  3. Дизайн
  4. Разработка программного обеспечения
  5. Реализация
  6. Развертывание
  7. Техническое обслуживание

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

Введение в тестирование программного обеспечения

Ошибка:
ошибка или заблуждение — это человеческое действие, которое производит неправильный или неверный результат.

Дефект (баг, неисправность):
сбой в системе или продукте, который может привести к сбою или неисправности компонента.

Отказ:
это разница между фактическим и ожидаемым результатом.

Риск:
риск — это фактор, который может привести к отрицательным результатам или возможности убытка, или ущерба.

Таким образом, тестирование программного обеспечения — это процесс поиска дефектов/ошибок в системе, которые происходят из-за ошибок в программе, которые могут привести к выходу из строя результирующего продукта. Короче говоря, тестирование программного обеспечения имеет различные цели и задачи, которые часто включают в себя:

  1. Обнаружение дефектов
  2. Обретение уверенности и предоставление информации об уровне качества
  3. Предотвращение дефектов

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

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

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

Ключевые понятия

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

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

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

Верификация и Валидация:
тестирование программного обеспечения проводится с учетом этих двух факторов.

  1. Верификация: проверяет, разработан ли данный продукт согласно спецификации.
  2. Валидация: проверяет, соответствует ли продукт требованиям клиентов.

Обеспечение качества ПО:
тестирование программного обеспечения является важной частью обеспечения качества. Обеспечение качества — это деятельность, которая подтверждает пригодность продукта, заботу о качестве товара и обеспечение соблюдения требований заказчика.

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

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

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

Инструкции по сценарию тестирования:

  • Black Box (черный ящик) тестирование
  • White Box (белый ящик) тестирование
  • Gray Box (серый ящик) тестирование

Уровни тестирования программного обеспечения жизненного цикла включают в себя:

  • Модульное тестирование
  • Интеграционное тестирование
  • Системное тестирование
  • Приемочное тестирования (альфа-тестирование и бета-тестирование)

Другими видами тестирования программного обеспечения являются:

  • Функциональное тестирование
  • Тестирование производительности (нагрузочное тестирование и стресс-тестирование)
  • Дымовое тестирование
  • Санитарное тестирование (проверка согласованности)
  • Регрессионное тестирование
  • Тестирование восстановления.
  • Юзабилити-тестирование
  • Тестирование на совместимость
  • Тестирование конфигурации
  • Исследовательское тестирование

Автоматизированное тестирование

Ручное тестирование — трудоемкий процесс. Автоматизация тестирования предполагает автоматизировать ручной процесс. Автоматизация тестирования — это процесс написания компьютерной программы в виде скриптов для тестирования, который обычно делается вручную. Некоторыми популярными средствами автоматизации являются Winrunner, Quick Test Professional (QTP), LoadRunner, SilkTest, Rational Robot, и т. д. Средства автоматизации также включает в себя сервисные инструменты, такие как TestDirector и многие другие.

Методологии тестирования программного обеспечения

Существуют различные методики тестирования доступные для разработки и тестирования программного продукта. Этими моделями являются:

  • Каскадная модель
  • V Модель
  • Спиральная модель
  • Рационального унифицированный процесс
  • Гибкая модели
  • Быстрая разработка приложений

Тестовые артефакты

В процессе тестирования программного обеспечения можно произвести различные артефакты, такие как:

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

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

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

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

Сценарий тестирования:
тестовый сценарий представляет собой сочетание теста, процедуры тестирования и данных испытаний.

Тестовый набор:
это сборник тестовых случаев.

Процесс тестирование программного обеспечения

Процесс тестирования программного обеспечения осуществляется в следующей последовательности, для того чтобы найти недостатки в программном обеспечении системы:

  1. Создание плана тестирования
  2. Дизайн тест-кейсов
  3. Описание тестовых случаев
  4. Обзор тестовых случаев
  5. Выполнение теста
  6. Изучение результатов тестов
  7. Составление конечного обзора

Ниже приведены примеры тестирования:

Тестирование программного обеспечения для входа на страницу системы:

цель:
пользователь должен иметь возможность перейти на главную страницу.

Предпосылки:

  1. Программное обеспечение должно быть совместимо с операционной системой.
  2. Должна появиться страница «ввода логина».
  3. Текстовые поля идентификатора пользователя и пароля должны быть доступны с соответствующими метками.
  4. Должны быть в наличии кнопки «Войти» и «Отмена» с соответствующими подписями.

Тест 1

Название теста:
проверка требований пользовательского интерфейса.

Шаги/действия:
Пользователь просматривает страницу, чтобы проверить, включает ли она в себя ID пользователя и пароль в текстовых полях с соответствующими наклейками. Кроме того, кнопки «Войти» и «Отмена» должны быть доступны с соответствующими подписями.

Ожидаемые результаты:
экран отображает интерфейс пользователя согласно требованиям пользователя.

Тест 2

Название теста:
Текстовое поле для идентификатора пользователя следует: 1) разрешить только буквенные символы {от a до z, и от A до Z}, 2) не разрешать специальные символы, такие как {«$»,»#»,»!»,»~»,»*»,…}, 3) не разрешать цифровые символы {0-9}.

Шаги/действия:
1) Пользователь вводит числа в текстовое поле. 2) Пользователь вводит алфавитно-цифровые данные в текстовом поле.

Ожидаемые результаты:
я) для числовых данных отображается сообщение об ошибке. 2) текст принимается, когда пользователь вводит алфавитные данные в текстовое поле.

Тест 3

Название теста:
проверка функциональности текстового поля для пароля: 1) текстовое поле для пароля должно принять шесть или более символов. 2) данные должны отображаться в зашифрованном виде.

Шаги/действия:
1) Пользователь вводит только два символа в текстовом поле пароля. 2) Пользователь вводит более шести символов в текстовом поле пароля. 3) Пользователь проверяет отображаются ли данные в зашифрованном виде.

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

Тест 4

Название теста:
проверка функциональности кнопки «Войти».

Шаги/действия:
1) Пользователь проверяет, включена или отключена кнопка «Войти». 2) Пользователь нажимает на кнопку «Войти» и ожидает, просмотра главной страницы приложения.

Ожидаемые результаты:
1) система отображает кнопку «Войти». 2) Система перенаправляет пользователя на главную страницу приложения, как только он нажимает на кнопку «Войти».

Тест 5

Название теста:
проверка функциональности кнопки «Отмена».

Шаги/действия:
1) Пользователь проверяет, включена или отключена кнопка «Отмена». 2) Пользователь проверяет, сбрасываются ли текстовые поля ID пользователя и пароль при нажатии кнопки «Отмена».

Ожидаемые результаты:
1) система отображает кнопки «Отмена». 2) система сбрасывает данные текстовых полей идентификатора пользователя и пароля, когда пользователь нажимает на кнопку «Отмена».

Методы поиска неисправностей при тестировании программного обеспечения

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

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

Метрика программного обеспечения

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

Метрика программного обеспечения поможет избежать таких подводных камней, как:

  1. Перерасход средств
  2. Определение, источника проблемы
  3. Уточнение целей

Даст ответы на такие вопросы как:

  1. Какова оценка каждого процесса деятельности?
  2. Каково качество кода, который был разработан?
  3. Как можно улучшить слаборазвитый код?

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

Некоторыми общими метриками программного обеспечения являются:

  • Покрытие кода
  • Цикломатическая сложность
  • Сплоченность
  • Связь
  • Функция точечного анализа
  • Время выполнения
  • Источник строк кода
  • Ошибка в строках кода

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

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

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

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

Андрей Колесов

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

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

Нужно отметить парадоксальную ситуацию: при обилии методической литературы и курсов по проектированию и кодированию ПО наблюдается практически полное отсутствие материалов по тестированию и отладке! Как сказал известный американский автор книг по разработке ПО Джон Роббинс: «Даже если у вас есть специальное образование, бьюсь об заклад, что вы никогда не сталкивались со специальным курсом, посвященным отладке» (см. PC Week/RE, № 9/2004, с. 61).

Однако ситуация несколько меняется, одним из свидетельств чего являются проведенные в конце февраля в Москве компанией «Аплана» при поддержке московского представительства IBM практические семинары «Эффективная организация процессов тестирования в ходе разработки и сопровождения корпоративных систем». Тема оказалась настолько актуальной, что Центр технологий IBM не смог вместить всех желающих в один день, поэтому семинар пришлось проводить дважды. Изначально мероприятие было ориентировано на ИТ-подразделения корпораций, ведущие собственные внутрифирменные разработки, однако большой интерес к нему проявили и специализированные фирмы — создатели заказного и тиражируемого ПО. В общей сложности в семинарах приняли участие более 80 руководителей и специалистов корпоративных и ведомственных центров разработки и внедрения, а также ИТ-компаний.

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

Особенности организации тестирования

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

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

Есть еще один важный момент. Тестирование, в свою очередь, является лишь составляющей частью отладки — процесса доводки ПО после его написания до эксплуатационного состояния. Процесс этот включает две основные процедуры: обнаружение ошибок (тестирование) и поиск и устранение их причин. Однако, даже учитывая все возможные взаимосвязи этих работ (например, поиск причин ошибок требует проведения специального дополнительного тестирования), нужно подчеркнуть, что тестирование является достаточно автономным, независимым этапом жизненного цикла ПО. При этом подчеркнем, что повышение качества разработки (которое обратно пропорционально количеству ошибок в приложении) напрямую снижает затраты на устранение ошибок, но на объем тестирования влияет совсем не так сильно: его нужно проводить в любом случае и желательно «по полной программе».

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

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

  1. Объем тестирования очень велик. Дело в том, что именно в случае внутрифирменных разработок очень часто вносятся изменения (многие слушатели семинара говорили о непрерывном потоке корректировок по запросам подразделений-заказчиков). А ведь, как известно, классическое правило разработки ПО гласит: изменение одной строки кода требует повторного проведения полного цикла тестирования.
  2. Как это ни цинично звучит, но разработчики очень часто не заинтересованы в снижении количества ошибок в ПО, передаваемом в эксплуатацию. Руководство компаний оценивает работу ИТ-отдела в первую очередь по его умению уложиться в бюджет (время и деньги), а проблемы эксплуатации программ его волнуют значительно меньше. Поэтому получается, что увеличение объемов тестирования повышает издержки ИТ-подразделения без выделения соответствующих ресурсов со стороны начальства ** .
  3. Проведение качественного тестирования требует наличия специалистов и инструментов соответствующего профиля. А из п. 2 следует, что ИТ-подразделениям держать собственные группы тестировщиков просто невыгодно.

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

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

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

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

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

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

Тестирование — процесс также итерационный. После обнаружения и исправления каждой ошибки обязательно следует повторение тестов, чтобы убедиться в работоспособности программы. Более того, для идентификации причины обнаруженной проблемы может потребоваться проведение специального дополнительного тестирования. При этом нужно всегда помнить о фундаментальном выводе, сделанном профессором Эдсжером Дейкстрой в 1972 г: «Тестирование программ может служить доказательством наличия ошибок, но никогда не докажет их отсутствие!».

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

Функциональное и нагрузочное тестирование. Работы первого вида можно отнести к традиционным — проверка ПО на соответствие требованиям по функционалу *** . В последние годы заметно возросла актуальность относительно новых задач, таких, например, как анализ совместимости разрабатываемого продукта с различными программными и аппаратными платформами, приложениями и пр. Второй тип обычно связывают с задачами оценки производительности и масштабирования, но на самом деле он затрагивает гораздо более широкий круг проблем; выявление узких мест в коде программы, обнаружение «утечек» ресурсов и т. д.

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

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

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

Решение проблемы — центры тестирования

Как уже было сказано, ведущую роль в вопросах тестирования играют методология и организационная составляющая. Что же касается инструментария, то его роль в этом процессе вторична и выбор того или иного продукта для автоматизации задач тестирования определяется уже в зависимости от целей и специфики проекта, существующих предпочтений заказчика, бюджета. На рынке сейчас представлен целый спектр средств автоматизированного тестирования, в котором лидируют IBM Rational, Mercury, Segue, Compuware.

В рамках семинара специалистами компании «Аплана» рассматривались возможности автоматизированного тестирования на примере средств тестирования IBM Rational, которые в настоящее время получили значительное распространение среди российских разработчиков (см. врезку «Методология и инструментарий IBM Rational»). Обсуждались также различные сценарии их применения при создании ПО корпоративного уровня. Среди конкретных программных продуктов особое внимание было уделено наиболее популярной сегодня системе IBM Rational Robot.

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

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

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

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

В заключение стоит отметить еще один любопытный момент: проведя семинары, компания «Аплана» одной из первых в нашей стране фактически объявила о продвижении нового вида услуг в области разработки ПО. Первопроходцы же довольно часто попадают в двойственное положение. Так и на этом семинаре: бесплатный курс консалтинга и обучения пришлось дать не только потенциальным заказчикам, но и конкурентам…

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

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

*** Говоря о тестировании, надо также обязательно упомянуть о важности верификации ПО (систематической процедуры проверки правильности). Тонкое различие между этими понятиями заключается в том, что тестирование базируется на возможности сравнения полученных результатов с эталонными. Однако есть достаточно большой класс задач, когда эталонных данных попросту нет. Классический пример такого варианта — построение сложных математических моделей с решением десятков тысяч дифференциальных уравнений, хотя аналогичные ситуации возникают и тогда, когда имеешь дело с бизнес-приложениями. В этом случае требуется включение в ПО дополнительных функций и проведение специальных исследований, чтобы у пользователя появилась уверенность (пусть даже не 100-%), что программа действительно работает правильно.

Методология и инструментарий IBM Rational
Общая методология разработки ПО Rational Unified Process выделяет довольно большой набор видов тестирования (см. рисунок). Их можно с известной долей условности разделить следующим образом:
Функциональное тестирование (Function testing)

  • тестирование целостности данных (Data integrity testing);
  • тестирование на разных платформах (Configuration testing);
  • тестирование отказоустойчивости (Failover & recovery testing);
  • тестирование доступа (Security testing);
  • инсталляционное тестирование (Installation testing);
  • тестирование пользовательского интерфейса (User interface testing)

Нагрузочное тестирование (Load testing)

  • профилирование производительности (Performance profiling);
  • тестирование цикла работы (Business cycle testing);
  • тестирование при большой пользовательской нагрузке (Stress testing);
  • тестирование на больших объемах данных (Volume testing).

Для решения этих задач предлагаются следующие основные инструменты:

  • IBM Rational TestManager — управление тестированием;
  • IBM Rational PurifyPlus (Purify, PureCoverage, Quantify) — анализ работы системы в режиме RunTime;
  • IBM Rational Robot — функциональное и нагрузочное тестирование;
  • IBM Rational TestFactory — автоматизация создания тестов;
  • IBM Rational XDE Tester — функциональное тестирование Java и web-приложений.

Из сопоставления двух этих списков видно, что каждый продукт покрывает несколько типов тестирования. Вот краткая характеристика этих инструментов.
IBM Rational TestManager
необходим на всех этапах тестирования, предоставляет в распоряжение команды общие средства планирования, проектирования, исполнения и анализа тестов с использованием единой панели управления. Данный продукт имеет собственное хранилище данных, что обеспечивает более качественное управление версиями. Любой инструмент тестирования ПО, обладающий собственным API, не сложно интегрировать в единую систему, при этом может поддерживаться большинство исполняющих платформ тестирования.
IBM Rational PurifyPlus
включает три инструмента, предназначенных для анализа в режиме реального времени приложений и компонентов, разработанных с помощью Visual C/C++, C#, VB, VB .NET, Java, Java .NET. Purify обеспечивает автоматическое выявление ошибок, связанных с памятью, при этом выделяются источник и расположение ошибки. Если доступен исходный код, то его можно исправить непосредственно из Purify. Запатентованная технология Object Code Insertion позволяет выявлять ошибки доступа к памяти не только в исходном коде, но и в двоичных программных компонентах (DLL, объекты COM/DCOM, ODBC). PureCoverage — средство автоматического определения непротестированного кода. Quantify выполняет оценку производительности, определяя узкие места приложений и компонентов, как с исходным кодом, так и без него. Встроенные средства анализа данных помогают проводить сравнение результатов тестовых прогонов для различных вариантов кода.
IBM Rational Robot
— средство создания, изменения и выполнения автоматизированных тестов Интернет-приложений, ERP-систем и клиент-серверных решений. С его помощью обеспечивается объектно-уровневая поддержка при создании приложений на различных средствах разработки. Сценарии функциональных тестов генерируются в среде SQABasic, синтаксически совместимой с VB; встроенный редактор позволяет расширить сценарии тестов необходимыми процедурами и логическими условиями. Предусмотрена возможность создания специализированных тестов для различных типов программных объектов. Для формирования скриптов используется собственный Си-подобный язык.
IBM Rational TestFactory
— инструмент автоматической генерации скриптов тестирования посредством всестороннего анализа запущенного приложения для выявления дефектов надежности. Поскольку в программах имеется огромное число путей выполнения, проблема заключается в том, чтобы создать тесты, которые проверяют полный функционал приложения за минимальное число шагов.
IBM Rational XDE Tester
— специализированный инструмент для тестирования Java-приложений (J2EE, J2SE, SWT, AWT/JFC) и Web-приложений (HTML, DHTML, XML, JavaScript, апплеты Java). Текстовые сценарии пишутся на Java, технология ScriptAssure обеспечивает проверку достоверности динамических данных. Среда тестирования реализована в оболочке Eclipse, при этом имеется возможность встраивания инструмента в WebSphere Studio и Rational XDE Developer.

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

Тестирование программного обеспечения является неотъемлемой частью цикла разработки программного обеспечения.

Что такое тестирование программного обеспечения?

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

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

Методика тестирования

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

3) Системное тестирование

4) Приемочные испытания

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

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

Системное тестирование

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

Приемочные испытания

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

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

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

Тестирование методом черного ящика

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

Тестирование методом белого ящика

Тестирование методом «Белого ящика», в отличие от «черного ящика», учитывает внутреннее функционирование и логику работы кода. Для выполнения этого теста, тестер должен иметь знания кода, чтобы узнать точную часть кода, имеющую ошибки. Этот тест также известен как White-box, Open-Box или Glass box тестирование.

Тестирование методом серого ящика

Тестирование методом серого ящика или Gray box тестирование, это что-то среднее между White Box и Black Box тестированием, где тестер обладает лишь общими знаниями данного продукта, необходимыми для выполнения теста. Эта проверка осуществляется посредством документации и схемы информационных потоков. Тестирование проводится конечным пользователем, или пользователям, которые представляются как конечные.

Нефункциональные тесты

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

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

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

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

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

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

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

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

Тесты в процессе разработки программного обеспечения

Каскадная модель использует подход «сверху-вниз», независимо от того, используется ли она для разработки программного обеспечения или для тестирования.

Основными шагами, участвующими в данной методике тестирования программного обеспечения, являются:

  • Анализ потребностей
  • Тест дизайна
  • Тест реализации
  • Тестирование, отладка и проверка кода или продукта
  • Внедрение и обслуживание

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

Agile Model

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

Rapid Application Development (RAD). Методология быстрой разработки приложений

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

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

Спиральная модель

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

Rational Unified Process (RUP). Рациональный унифицированный процесс

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

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

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

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

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

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

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

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

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

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

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

Программно-компьютерная экспертиза востребована во многих сферах:

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

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

  • Компьютерное оборудование: компьютеры, ноутбуки, планшеты, смартфоны, серверы, маршрутизаторы, принтеры и другое оборудование.
  • Программное обеспечение: операционные системы, прикладное программное обеспечение, базы данных, программы для обработки графики и звука, браузеры, антивирусные программы и т.д.
  • Сетевые технологии: сетевое оборудование, протоколы передачи данных, системы защиты сетей, веб-серверы, почтовые серверы и т.д.
  • Информационные системы: системы управления базами данных, системы управления контентом, электронные документообороты, системы управления проектами и т.д.
  • Электронные носители: жесткие диски, USB-накопители, CD/DVD-диски, карты памяти и другие носители информации.
  • Электронная почта, мессенджеры и социальные сети: их использование, а также данные, хранящиеся на серверах и на компьютерах пользователей.
  • Электронные доказательства: электронные документы, электронная почта, метаданные, логи и другие данные, которые могут быть использованы в судебных процессах.

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

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

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

  • Специальное программное обеспечение: для анализа программного кода и данных, а также для восстановления удаленной информации могут использоваться различные программы, такие как дизассемблеры, декомпиляторы, утилиты для анализа памяти и дискового пространства.
  • Криптографические методы: для исследования зашифрованных данных может применяться криптоанализ, который включает в себя методы анализа статистических характеристик, дифференциального и линейного криптоанализа, методы атаки на шифры с открытым текстом и другие.
  • Методы реверс-инжиниринга: для изучения принципов работы программного обеспечения может применяться реверс-инжиниринг, который позволяет провести анализ исполняемого кода, восстановить исходный код и оценить структуру программы.
  • Эмуляция: для изучения вредоносного программного обеспечения может применяться эмуляция, которая позволяет запустить программу в контролируемой среде и проанализировать ее поведение.
  • Форензические методы: для проведения судебно-технической экспертизы и восстановления удаленной информации может использоваться набор методов и технологий, известных как компьютерная форензика.
  • Методы инженерии обратного проектирования: позволяют анализировать программный код и получать из него ценную информацию о программе, которая может быть использована для восстановления исходного кода.
  • Анализ данных: для выявления скрытых зависимостей и структур в данных может применяться метод анализа данных (Data Mining), который позволяет автоматически извлекать информацию из больших объемов данных.

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

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

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

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

  • Соответствует ли программное обеспечение заданным требованиям и стандартам?
  • Насколько точны результаты работы программного обеспечения?
  • Существуют ли ошибки и уязвимости в программном обеспечении, которые могут привести к сбоям или нарушению безопасности?
  • Были ли произведены изменения в программном обеспечении без соответствующего уведомления пользователей?
  • Были ли удалены или скрыты какие-либо данные из программного обеспечения?
  • Какие действия были совершены с использованием программного обеспечения и какие данные были обработаны?
  • Можно ли восстановить удаленные данные или историю использования программного обеспечения?
  • Есть ли возможность восстановления функционирования программного обеспечения после сбоя или атаки?
  • Какова хронология внесения модификаций в исследуемое программное обеспечение?
  • Какова хронология применения исследуемого программного обеспечения, начиная с момента установки?
  • Каковы возможные последствия дальнейшего применения представленного для экспертизы программного продукта?
  • Какова причина изменений в программном обеспечении – действия пользователя, влияние вредоносной программы, ошибки программной среды, сбой аппаратуры и пр.?

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

Сотрудничество с независимой экспертной организацией АНО «СЗЭПЦ» при проведении программно-компьютерной экспертизы имеет ряд преимуществ и возможностей.

Преимуществом сотрудничества с АНО «СЗЭПЦ» является использование современных технологий и методов проведения экспертизы. Это позволяет ускорить процесс исследования, снизить затраты на проведение экспертизы и повысить точность результатов.

Сотрудничество с АНО «СЗЭПЦ» позволяет оптимизировать расходы на проведение экспертизы, так как заказчик может выбрать наиболее подходящий для себя вариант услуг, исходя из своих потребностей и бюджета.

АНО «СЗЭПЦ» гарантирует полную конфиденциальность проводимых исследований и результатов экспертизы, что особенно важно для организаций, работающих с конфиденциальной информацией.

Получение объективной и независимой оценки качества программного обеспечения и оборудования. Это особенно важно для компаний, которые используют программное обеспечение и оборудование разных производителей, поскольку эксперты АНО «СЗЭПЦ» могут дать объективную оценку совместимости и корректности работы системы в целом.

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

Наконец, при сотрудничестве с АНО «СЗЭПЦ» заказчик получает комплексный подход к решению своих задач, профессиональную консультацию и поддержку на всех этапах проведения экспертизы, а также качественные и точные результаты исследований.

Узнать стоимость экспертизы

Экспертиза программного обеспечения – это разновидность инженерно-технической экспертизы. Данный вид исследования чрезвычайно актуален, поскольку программное обеспечение – один из наиболее динамично развивающихся сегментов технологической сферы. Еще одна причина, по которой экспертиза программного обеспечения пользуется большим спросом, это контрафактные продукты и недобросовестная конкуренция. Именно этот вид экспертизы позволяет установить, нарушались ли права гражданина (компании) в рамках Кодекса административных правонарушений (глава 7, статья 7.12 «Нарушение авторских и смежных прав, изобретательских и патентных прав»), а также Уголовного кодекса (статья 146 «Нарушение авторских и смежных прав»). Специалисты в области экспертизы программного обеспечения изучают, проверяют и анализируют компьютерный продукт. Также они могут отследить случаи появления ненадлежащего программного обеспечения.

Специалистам приходится решать широкий круг вопросов:

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

Что является объектом экспертизы программного обеспечения?

В рамках данного типа экспертизы исследованию подлежат:

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

Какие материалы необходимо предъявить для экспертизы программного обеспечения?

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

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

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

Проведение экспертизы по уголовному делу

Согласно Постановлению Пленума Верховного Суда Российской
Федерации от 21 декабря 2010 г. N 28 «О судебной
экспертизе по уголовным делам» экспертиза по уголовному делу может быть проведена либо государственным
экспертным учреждением, либо некоммерческой организацией, созданной в соответствии с Гражданским кодексом
Российской Федерации и Федеральным законом «О некоммерческих организациях», осуществляющих
судебно-экспертную деятельность в соответствии с принятыми ими уставами.

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

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

Так как АНО «Судебный эксперт» является автономной некоммерческой организацией, а проведение судебных
экспертиз является её основной уставной деятельностью (см. раздел «Документы
организации»), то она имеет право проводить экспертизы в том числе и по уголовным делам.

Возможно, вам также будет интересно:

  • Оффлайн проверка сайта на ошибки
  • Оформления страницы ошибок на сайте
  • Оформление цитаты это какая ошибка
  • Оформление трудовой книжки при ошибке
  • Оформление страницы с ошибкой 500

  • Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии