Лекция 6. Конспект лекций

### Лекция 6. Обеспечение качества программных продуктов

6.1. Качество программного продукта
6.2. Тестирование программного продукта в VSTS
6.3. Рефакторинг
6.4. Дизайн программного продукта

### 6.1. Качество программного продукта

Качество программного продукта определяется по нескольким критериям:

1. отвечать функциональным и нефункциональным требованиям, в соответствии с которыми он создавался;

2. соответствовать стандартам (международным и корпоративным);

3. иметь ценность для бизнеса и отвечать ожиданиям пользователей.

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

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

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

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

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

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

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

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

### 6.2. Тестирование программного продукта в VSTS

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

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

- Модульное тестирование – предназначено для проверки правильности функционирования методов классов ПО. Модульные тесты пишутся и исполняются разработчиками в процессе написания кода. Модульное тестирование применяется как для проверки качества кода приложения, так и для проверки объектов баз данных.

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

- Интеграционное тестирование – используется для проверки корректности совместной работы компонентов программного продукта.

- Функциональное тестирование – предполагает проверку конкретных требований к ПО и проводится после добавление к системе новых функций.

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

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

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

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

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

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

- проект с веб-тестами производительности и нагрузочными тестами;

- проект с закодированными тестами пользовательского интерфейса.

Инструментарием тестировщика в Visual Studio 2012 и выше является Microsoft Test Manager (MTM). MTM предназначен для управления жизненным циклом тестирования программного обеспечения, включая планирование, тестирование и мониторинг. MTM интегрирован с TFS. При создании плана тестирования в него добавляются наборы тестов, тестовые случаи и конфигурации, необходимые для тестирования. Microsoft Test Manager позволяет выполнять ручные и автоматические тесты, поддерживает исследовательское тестирование. Результаты тестирования сохраняются в операционном хранилище данных, что позволяет подготавливать различные аналитические отчеты. Ошибки, выявленные в процессе тестирования, фиксируются, документируются и передаются разработчикам для их устранения. При регрессионном тестировании MTM автоматически формирует план тестирования, определяя какие тесты должны быть повторно выполнены.

Для тестировщиков и разработчиков программного обеспечения Visual Studio 2012 и выше включает диспетчер виртуальной среды Lab Management. Инструментарий тестирования Lab Management позволяет создать инфраструктуру, которая максимально близко эмулирует реальную среду планируемого использования программного продукта. Такие среды могут использоваться для выполнения автоматических построений, автоматизации тестов и выполнения разработанного кода.

### 6.3. Рефакторинг

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

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

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

### 6.4. Дизайн программного продукта

Некачественный дизайн кода определяется по ряду признаков:

• жесткость – характеристика программы, выражающая затруднение внесения изменений в код;

• хрупкость – свойство программы повреждаться во многих местах при внесении единственного изменения;

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

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

• ненужные повторения – состоят в повторяющихся фрагментах кода в программе;

• непрозрачность, которая характеризует трудность кода для понимания.

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

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

Паттерны проектирования (повторимая архитектурная конструкция, представляющая собой решение проблемы проектирования в рамках некоторого часто возникающего контекста) предлагают универсальные, проверенные практикой решения. Среди которых следует выделить те, которые целесообразно применять при гибкой разработке программного обеспечения. Это паттерны Команда, Стратегия, Фасад, Посредник, Одиночка, Фабрика, Компоновщик, Наблюдатель, Абстрактный сервер/адаптер/шлюз, Заместитель и Шлюз, Посетитель и Состояние.

Использование паттернов при разработке позволяет создавать легко модифицируемое и сопровождаемое ПО.

Ключевые термины

Модульное тестирование | тестирование, предназначенное для проверки правильности функционирования методов классов ПО.
Исследовательское тестирование | тестирование, при котором тестировщик не имеет заранее определенных тестовых сценариев и пытается интуитивно исследовать возможности программного продукта и обнаружить и зафиксировать неизвестные ошибки.
Интеграционное тестирование | тестирование, предназначенное для проверки корректности совместной работы компонентов программного продукта.
Функциональное тестирование | тестирование, предназначенное для проверки конкретных требований к ПО, которое проводится после добавление к системе новых функций.
Нагрузочное тестирование | тестирование, предназначенное для проверки работоспособности программного продукта при предельной входной нагрузке.
Нагрузочное тестирование | тестирование, предназначенное для проверки работоспособности программного продукта при предельной входной нагрузке.
Регрессионное тестирование | тестирование, применяемое при внесении изменений в программное обеспечение, с целью проверки корректности работы компонентов системы, которые потенциально могут взаимодействовать с измененным компонентом.
Комплексное тестирование | тестирование, предназначенное для проверки соответствия функциональных и нефункциональных требований всей системы программного продукта.
Приемочное тестирование | тестирование, представляющее собой функциональные испытания, которые должны подтвердить то, что программный продукт соответствует требованиям и ожиданиям пользователей и заказчиков.
MicrosoftTestManager | инструментарий Microsoft, предназначенный для управления жизненным циклом тестирования программного обеспечения.
LabManagement | диспетчер виртуальной среды тестирования.

Краткие итоги

Качество программного продукта определяется по нескольким критериям и качественный программный продукт должен отвечать функциональным и нефункциональным требованиям. В жизненном цикле приложения качество должно отслеживаться на всех его этапах. Тестирование программного продукта позволяет на протяжении всего жизненного цикла ПО гарантировать, что программные проекты отвечают заданным параметрам качества. На протяжении всего жизненного цикла разработки ПОприменяются различные типы тестирования. Инструментарием тестировщика в Visual Studio 2012 и выше является MicrosoftTestManager идиспетчер виртуальной среды LabManagement. Для улучшения качества кода программных приложений применяют рефакторинг.