2.3. Верификация программ.
2.3.1. Методы доказательства правильности программ.
Как известно, универсальные вычислительные машины могут быть запрограммированы для решения самых разнородных задач — в этом заключается одна из основных их особенностей, имеющая огромную практическую ценность. Один и тот же компьютер, в зависимости от того, какая программа находится у него в памяти, способен осуществлять арифметические вычисления, доказывать теоремы и редактировать тексты, управлять ходом эксперимента и создавать проект автомобиля будущего, играть в шахматы и обучать иностранному языку. Однако успешное решение всех этих и многих других задач возможно лишь при том условии, что компьютерные программы не содержат ошибок, которые способны привести к неверным результатам.
Можно сказать, что требование отсутствия ошибок в программном обеспечении совершенно естественно и не нуждается в обосновании. Но как убедиться в том, что ошибки, в самом деле, отсутствуют? Вопрос не так прост, как может показаться на первый взгляд.
К неформальным методам доказательства правильности программ относят отладку и тестирование, которые являются необходимой составляющей на всех этапах процесса программирования, хотя и не решают полностью проблемы правильности. Существенные ошибки легко найти, если использовать соответствующие приемы отладки (контрольные распечатки, трассировки).
Тестирование – процесс выполнения программы с намерением найти ошибку, а не подтвердить правильность программы. Суть его сводится к следующему. Подлежащую проверке программу неоднократно запускают с теми входными данными, относительно которых результат известен заранее. Затем сравнивают полученный машиной результат с ожидаемым. Если во всех случаях тестирования налицо совпадение этих результатов, появляется некоторая уверенность в том, что и последующие вычисления не приведут к ошибочному итогу, т.е. что исходная программа работает правильно.
Мы уже обсуждали понятие правильности программы с точки зрения отсутствия в ней ошибок. С интуитивной точки зрения программа будет правильной, если в результате ее выполнения будет достигнут результат, с целью получения которого и была написана программа. Сам по себе факт безаварийного завершения программы еще ни о чем не говорит: вполне возможно, что программа в действительности делает совсем не то, что было задумано. Ошибки такого рода могут возникать по различным причинам.
В дальнейшем мы будем предполагать, что обсуждаемые программы не содержат синтаксических ошибок, поэтому при обосновании их правильности внимание будет обращаться только на содержательную сторону дела, связанную с вопросом о том, достигается ли при помощи данной программы данная конкретная цель. Целью можно считать поиск решения поставленной задачи, а программу рассматривать как способ ее решения. Программа будет правильной, если она решит сформулированную задачу.
Метод установления правильности программ при помощи строгих средств известен как верификация программ.
В отличие от тестирования программ, где анализируются свойства отдельных процессов выполнения программы, верификация имеет дело со свойствами программ.
В основе метода верификации лежит предположение о том, что существует программная документация, соответствие которой требуется доказать. Документация должна содержать:
спецификацию ввода-вывода (описание данных, не зависящих от процесса обработки);
свойства отношений между элементами векторов состояний в выбранных точках программы;
спецификации и свойства структурных подкомпонентов программы;
спецификацию структур данных, зависящих от процесса обработки.
К такому методу доказательства правильности программ относится метод индуктивных утверждений, независимо сформулированный К. Флойдом и П. Науром.
Суть этого метода состоит в следующем:
1) формулируются входное и выходное утверждения: входное утверждение описывает все необходимые входные условия для программы (или программного фрагмента), выходное утверждение описывает ожидаемый результат;
2) предполагая истинным входное утверждение, строится промежуточное утверждение, которое выводится на основании семантики операторов, расположенных между входом и выходом (входным и выходным утверждениями); такое утверждение называется выведенным утверждением;
3) формулируется теорема (условия верификации):
из выведенного утверждения следует выходное утверждение;
4) доказывается теорема; доказательство свидетельствует о правильности программы (программного фрагмента).
Доказательство проводится при помощи хорошо разработанных математических методов, использующих исчисление предикатов первого порядка.
Условия верификации можно построить и в обратном направлении, т.е., считая истинным выходное утверждение, получить входное утверждение и доказывать теорему:
из входного утверждения следует выведенное утверждение.
Такой метод построения условий верификации моделирует выполнение программы в обратном направлении. Другими словами, условия верификации должны отвечать на такой вопрос: если некоторое утверждение истинно после выполнения оператора программы, то, какое утверждение должно быть истинным перед оператором?
Построение индуктивных утверждений помогает формализовать интуитивные представления о логике программы. Оно и является самым сложным в процессе доказательства правильности программы. Это объясняется, во-первых, тем, что необходимо описать все содержательные условия, и, во-вторых, тем, что необходимо аксиоматическое описание семантики языка программирования.
Важным шагом в процессе доказательства является доказательство завершения выполнения программы, для чего бывает достаточно неформальных рассуждений.
Таким образом, алгоритм доказательства правильности программы методом индуктивных утверждений представляется в следующем виде:
1) Построить структуру программы.
2) Выписать входное и выходное утверждения.
3) Сформулировать для всех циклов индуктивные утверждения.
4) Составить список выделенных путей.
5) Построить условия верификации.
6) Доказать условие верификации.
7) Доказать, что выполнение программы закончится.
Этот метод сравним с обычным процессом чтения текста программы (метод сквозного контроля). Различие заключается в степени формализации.
Преимущество верификации состоит в том, что процесс доказательства настолько формализуем, что он может выполняться на вычислительной машине. В этом направлении в восьмидесятые годы проводились исследования, даже создавались автоматизированные диалоговые системы, но они не нашли практического применения.
Для автоматизированной диалоговой системы программист должен задать индуктивные утверждения на языке исчисления предикатов. Синтаксис и семантика языка программирования должны храниться в системе в виде аксиом на языке исчисления предикатов. Система должна определять пути в программе и строить условия верификации.
Основной компонент доказывающей системы — это построитель условий верификации, содержащий операции манипулирования предикатами, алгоритмы интерпретации операторов программы. Вторым компонентом системы является подсистема доказательства теорем.
Отметим трудности, связанные с методом индуктивных утверждений. Трудно построить «множество основных аксиом, достаточно ограниченное для того, чтобы избежать противоречий, но достаточно богатое для того, чтобы служить отправной точкой для доказательства утверждений о программах» (Э. Дейкстра). Вторая трудность — семантическая, заключающаяся в формировании самих утверждений, подлежащих доказательству. Если задача, для которой пишется программа, не имеет строгого математического описания, то для нее сложнее сформулировать условия верификации.
Перечисленные методы имеют одно общее свойство: они рассматривают программу как уже существующий объект и затем доказывают ее правильность.
Метод, который сформулировали К. Хоар и Э. Дейкстра основан на формальном выводе программ из математической постановки задачи.
Методы верификации программного обеспечения
Программное обеспечение в настоящее время используются практически во всех сферах жизни. Однако, разработка программного обеспечения — это сложный и трудоемкий процесс, который может содержать ошибки. Ошибки программного обеспечения могут привести к критическим последствиям, таким как потеря данных или даже опасность для жизни людей. Для того чтобы минимизировать риски и обеспечить надежность программного обеспечения, используются методы верификации.
В данной статье мы рассмотрим различные методы верификации программного обеспечения, такие как методы на основе спецификации, тестирования и проверки модели. Мы также обсудим инструменты, которые используются для верификации, стратегии разработки верификации, а также применение методов верификации в индустрии.
Методы на основе спецификации
Методы верификации на основе спецификации — это методы, которые используют формальную спецификацию программного обеспечения для доказательства его корректности. Спецификация программного обеспечения — это описание его поведения и свойств на формальном языке.
Одним из методов верификации на основе спецификации является формальная верификация. Формальная верификация — это процесс доказательства корректности программного обеспечения с использованием формальных методов. Она основана на математических моделях и позволяет доказать, что программа работает правильно для всех возможных входных данных.
Еще одним методом верификации на основе спецификации является использование статического анализа. Статический анализ — это процесс анализа программного кода без его фактического выполнения. Он позволяет выявить ошибки в коде на ранних этапах разработки, такие как неправильное использование переменных или недостаточная проверка ошибок.
Методы верификации программного обеспечения на основе тестирования
Методы верификации программного обеспечения на основе тестирования — это широкий класс методов, используемых для проверки правильности работы ПО на реальных входных данных. Они могут включать в себя различные виды тестирования, такие как функциональное тестирование, тестирование производительности, тестирование на надежность и тестирование безопасности. Все эти методы имеют свои преимущества и ограничения, и выбор метода тестирования зависит от конкретного контекста и требований к программному обеспечению.
Один из подходов к тестированию программного обеспечения — это тестирование черного ящика, когда тестировщик не имеет доступа к исходному коду программы и проверяет ее работу только на основе ее интерфейса и заданных входных данных. Другой подход — это тестирование белого ящика, когда тестировщик имеет доступ к исходному коду и может использовать его для написания тестов.
Одним из популярных методов тестирования является автоматизированное тестирование, которое позволяет автоматизировать процесс создания, выполнения и анализа результатов тестов. Для этого используются специальные инструменты, такие как фреймворки для автоматизированного тестирования, среды тестирования и инструменты для генерации тестовых данных.
Тестирование также может проводиться на различных уровнях, начиная с модульного тестирования отдельных модулей программы и заканчивая интеграционным тестированием системы в целом. В зависимости от целей и контекста проекта, может быть выбран различный уровень тестирования.
Одним из вызовов при использовании методов тестирования является то, что они не могут гарантировать полную корректность программного обеспечения. Для этого необходимо использовать другие методы верификации, такие как формальное доказательство или статический анализ кода.
В целом, методы на основе тестирования являются важным компонентом процесса верификации программного обеспечения и могут помочь обеспечить высокое качество ПО.
Методы верификации программного обеспечения на основе проверки модели
Методы верификации программного обеспечения на основе проверки модели являются еще одним способом обеспечения качества ПО. Они используются для проверки, соответствует ли модель программного обеспечения определенным критериям. Модель может быть представлена в различных формах, таких как диаграммы, графы, математические модели и т.д.
Один из основных подходов к верификации ПО на основе проверки модели — это формальная верификация. Она включает в себя формальное доказательство того, что программа соответствует спецификации или модели. Для этого используются математические методы, такие как логика высказываний, алгебраические методы, автоматические доказательства и т.д.
Еще один метод верификации на основе проверки модели — это модельная проверка. Этот метод используется для проверки, соответствует ли модель программного обеспечения определенным требованиям. Для этого используются инструменты, которые генерируют систему состояний модели программного обеспечения и выполняют автоматическую проверку модели на наличие ошибок или нарушений требований.
Кроме того, существует также метод верификации программного обеспечения на основе анализа модели. Он заключается в том, чтобы анализировать модель программного обеспечения на наличие ошибок, противоречий или других проблем, которые могут привести к неправильной работе программы. Для этого используются различные методы, такие как статический анализ кода, символьное выполнение и т.д.
Каждый метод верификации программного обеспечения на основе проверки модели имеет свои преимущества и ограничения, и выбор метода зависит от конкретных требований проекта и доступных ресурсов. Кроме того, эффективность любого метода верификации программного обеспечения зависит от правильного выбора модели программного обеспечения и требований к ней, а также от квалификации и опыта специалистов, занимающихся верификацией.
Разработка стратегии верификации программного обеспечения
Валидация и верификация программного обеспечения — это процесс проверки, соответствует ли программное обеспечение требованиям и спецификациям. Разработка стратегии верификации является важным шагом в процессе разработки программного обеспечения и может существенно повлиять на его качество и эффективность.
Этапы разработки стратегии верификации:
- Определение целей и требований: на этом этапе определяются цели верификации, требования к качеству ПО и ожидаемые результаты верификации.
- Выбор методов и инструментов: на основе целей и требований выбираются методы и инструменты для проверки программного обеспечения. Методы могут включать в себя тестирование, проверку модели и формальную верификацию, а инструменты — средства автоматизации тестирования и анализа кода.
- Разработка плана верификации: на этом этапе разрабатывается план верификации, который включает в себя описание методов и инструментов, используемых для верификации, расписание и сроки выполнения тестирования, описание тестовых сценариев и критериев приемки.
- Реализация и проведение: на этом этапе выполняется тестирование программного обеспечения в соответствии с планом верификации. В процессе тестирования могут быть выявлены ошибки, которые должны быть исправлены и подтверждены повторными тестами.
- Оценка результатов: на этом этапе оцениваются результаты верификации, проверяется соответствие ПО требованиям и спецификации, а также проводится анализ эффективности использованных методов и инструментов верификации.
Заключение
Разработка стратегии верификации программного обеспечения является важным шагом в процессе разработки ПО. Она может существенно повлиять на его качество и эффективность. Она включает в себя определение целей и требований, выбор методов и инструментов верификации, разработку плана верификации, реализацию и проведение верификации, а также оценку результатов верификации. Результатом успешной верификации является уверенность в том, что ПО соответствует требованиям и работает правильно. Это помогает предотвратить ошибки и проблемы, которые могут возникнуть в будущем, а также повышает доверие пользователей к продукту. Поэтому разработка стратегии верификации должна быть тщательно продуманной и осуществляться в тесном сотрудничестве с командой разработчиков. Важно также учитывать изменения в требованиях и внести соответствующие изменения в стратегию верификации в ходе ее реализации. В итоге, правильная стратегия верификации является ключевым фактором в создании качественного и надежного программного обеспечения.
Все о тестировании и качестве ПО
- Критичность и приоритет дефектов
- Валидация и верификация
- Тестирование-QC-QA разбираемся в вопросе
- Что нужно автоматизировать в тестировании ?
- Качество программного обеспечения
Разница между верификацией и валидацией
Верификация в тестировании ПО – процесс просмотра документации, дизайна, кода и программы для того, чтобы проверить, было ли программное обеспечение создано в соответствии с требованиями или нет. Основная цель процесса верификации – обеспечить качество приложения, дизайна, архитектуры и т.д. Процесс верификации включает в себя такие действия, как ревью, пошаговое руководство и инспекция.
Валидация в разработке ПО – динамический механизм тестирования и проверки того, действительно ли программный продукт соответствует точным потребностям заказчика или нет. Этот процесс помогает гарантировать, что ПО выполняет желаемое использование в подходящей среде. Процесс валидации включает в себя такие действия, как модульное тестирование, интеграционное тестирование, системное тестирование и пользовательское приемочное тестирование.
- Процесс верификации включает в себя проверку документации, дизайна, кода и программы, в то время как процесс валидации включает в себя тестирование и проверку самого продукта.
- Верификация не требует исполнения кода, в то время как валидация требует.
- Верификация использует такие методы, как ревью, пошаговое руководство, инспекцию и отладку, в то время как валидация использует такие методы, как тестирование чёрного ящика, белого ящика и нефункциональное тестирование.
- Верификация проверяет, соответствует ли ПО спецификации, в то время как валидация проверяет, соответствует ли ПО требованиям и ожиданиям.
- Верификация находит баги на раннем этапе цикла разработки, в то время как валидация находит баги, которые верификация не может.
- Сравнивая валидацию и верификацию в тестировании ПО, процесс верификации нацелен на архитектуру ПО, дизайн, базу данных и др., в то время как процесс валидации нацелен на реальный программный продукт.
- Верификация выполняется командой QA, в то время как валидация выполняется командой тестирования с командой QA.
- Сравнивая тестирование верификации и валидации, процесс верификации предшествует процессу валидации, в то время как процесс валидации идет после процесса верификации.
Вот основное различие между тестированием верификации и валидации:
Верификация
Валидация
Процесс верификации включает в себя проверку документов, дизайна, кода и программы
Это динамический механизм тестирования и валидации фактического продукта
Не связано с выполнением кода
Всегда связано с выполнением кода
Верификация использует такие методы, как ревью, пошаговые руководства, инспекции, отладку и т.д.
Используются такие методы, как тестирование черного ящика, тестирование белого ящика и нефункциональное тестирование
Проверяется соответствие программного обеспечения спецификации
Проверяется, соответствует ли программное обеспечение требованиям и ожиданиям заказчика
Обнаруживает баги на ранних стадиях цикла разработки
Может обнаружить баги, которые не может обнаружить верификация
Цель — архитектура приложений и программного обеспечения, спецификация, полный дизайн, высокий уровень, дизайн базы данных и т.д.
Цель — это реальный продукт
Команда контроля качества проводит проверку и убеждается, что программное обеспечение соответствует требованиям и спецификации
Валидация программного кода выполняется с привлечением команды тестирования
Идет перед валидацией
Идет после верификации
Примеры верификации и валидации.
А теперь давайте рассмотрим пример, объясняющий планирование проверки и валидации:
В области разработки ПО рассмотрите следующую спецификацию для теста на верификацию и теста на валидацию:
Кликабельная кнопка с именем Submet
Верификация включала бы проверку документа о дизайне и исправление орфографической ошибки.
В противном случае команда разработчиков создаст подобную кнопку:
Таким образом, теперь новая спецификация:
Кликабельная кнопка с именем Submit (Отправить)
Как только код готов, выполняется валидация. Тест на валидацию обнаружил:
Благодаря тесту на валидацию команда разработчиков сделает кнопку кликабельной.
При подготовке материала использовались источники:
https://studfile.net/preview/2927671/page:7/
https://habr.com/ru/articles/691048/