- •Препроцессор. Директивы препроцессора.
- •Описание, определение и вызов функций. Параметры по умолчанию. Встроенные функции.
- •Особенности работы с указателями разных типов в языке с.
- •Модели памяти. Функции работы с динамической памятью.
- •Шаблоны функций. Перегружаемые функции.
- •Организация ввода-вывода.
- •Разработка надежного программного обеспечения. Обработка исключительных ситуаций.
- •13. Особенности программирования для ос Windows.
- •14. Библиотека динамической компоновки. Области применения. Разработка и использование dll-библиотек.
- •15. Объектно-ориентированное программирование. Классы. Определение спецификации доступа.
- •16. Объектно-ориентированное программирование. Полиморфизм.
- •17. Ооп. Наследование. Области видимости для классов.
- •18. Ооп. Классы. Дружественные функции.
- •19. Понятие компоненты. Типы компонент. Свойства. Контейнерные компоненты.
- •20. Организация процесса конструирования по. Типы по. Стратегии конструирования.
- •21. Понятие жизненного цикла. Модели жизненного цикла.
- •22. Особенности процесса синтеза программных систем.
- •23. Разработка структуры программы. Модульное программирование. Критерии оценки программ.
- •24. Проектирование программ. Методы нисходящего и восходящего проектирования.
- •27. Классические методы анализа проектирования. Метод Джексона.
- •28. Структурные методы проектирования. Sadt.
- •29. Структурные методы проектирования программных систем. Использование dfd и er диаграмм.
- •30. Case-системы. Классификация.
- •31. Методы контроля и тестирования по. Статический и динамический контроль. Функциональное тестирование.
- •32. Методы контроля и тестирования по. Структурное тестирование. Многомодульное тестирование.
- •33. Разработка интерфейса пользователя. Структуры диалога. Критерии выбора структуры диалога.
- •34. Разработка интерфейса пользователя. Описание диалога. Использование сетей переходов для представления структуры диалога. Правила свёртки сети переходов.
- •40. Критерии оценки качества по. Документирование и оценка качества в соответствии с iso 9000.
- •41. Основные понятия сом-технологии.
31. Методы контроля и тестирования по. Статический и динамический контроль. Функциональное тестирование.
Одним из важнейших этапов разработки ПО является тестирование ПО с целью создания надежного отказоустойчивого комплекса. Основные виды контроля ПО: визуальный контроль; статический контроль; динамический контроль.
Визуальный контроль – проверка программы вручную, состоящая из 2-х этапов. На 1-ом этапе внимание уделяется: 1) комментариям и их соответствию тексту программы; 2) условиям в операторах выбора и ветвления; 3) сложным логическим выражениям; 4) возможности незавершенности итерационных циклов. На 2-ом этапе выполняется сквозной контроль (ручная прокрутка на простых заранее подобранных тестах).
Статический контроль – проверка программы по тексту без ее выполнения с помощью инструментальных средств. Выделяют 4 формы статического контроля:
1) Статический контроль, выполненный стандартным компилятором с целью проверки соответствия текста программы правилам языка программирования. Сообщения компилятора делятся на группы в зависимости от тяжести нарушения правил языка: а) могут являться причиной косвенной ошибки; б) работоспособность объектного кода маловероятна; в) объектный код заведомо некорректен; г) дальнейший контроль не возможен и прекращается.
Любой компилятор может пропустить некоторые ошибки, обнаруженная ошибка может быть удалена от реального места, некоторые ошибки вызывают несколько сообщений.
2) Проверка структурированности программы – проверяется правильность организации программы с точки зрения ее модульности.
3) Контроль правдоподобия программы. Выделяются синтаксически правильные конструкции, которые могут нести в себе ошибку. Признаки таких конструкций: а) использование неинициализированных переменных; б) наличие описания элементов, которые в дальнейшем не используются; в) наличие никогда не выполняющихся фрагментов; г) наличие бесконечных циклов.
Присутствие неправдоподобных конструкций может не отразиться на работоспособности программы, но их удаление повысить ее читабельность.
4) Верификация – аналитическое доказательство правильности функционирования ПО. Рассматривают 2 аспекта:
а) Надежность – характеризует как программу, так ее окружение. Допускается определенная вероятность наличия ошибок в программе. Характеристики надежности: а) целостность ПО – способность к защите от отказов; б) живучесть – способность входного контроля данных и их проверки в ходе работы программы; в) работоспособность – способность к восстановлению после сбоев; г) завершенность – 100% появление результата работы программы.
б) Корректность – включает в себя оценку ПО с точки зрения соответствия целям разработки, которые указываются в спецификации (частичная корректность), и с точки зрения завершенности программы. Выделяют 6 задач анализа корректности: доказательство частичной корректности; частичной некорректности; завершенности программы; незавершенности программы; полной корректности; полной некорректности. Для доказательства используются правила логического вывода.
Динамический контроль заключается в проверке правильности работы программы на ВУ. Это процесс обнаружения ошибок. Особенностью является то, что это дедуктивный процесс, противоречащий идее программирования. Это порождает трудности при создании теста. Поэтому следует придерживаться принципов тестирования Майерса:
необходимой частью каждого теста должно являться описание ожидаемых результатов;
по возможности следует избегать тестирования программы ее автором;
организация-разработчик ПО не должна единолично ее тестировать;
нужно подбирать тесты не только для предусмотренных входных данных;
при анализе результатов каждого теста нужно проверять, не делает ли программа того, чего она делать не должна;
следует сохранять используемые тесты для повышения эффективности повторного тестирования;
следует учитывать принцип «скопления» ошибок – вероятность обнаружения ошибок в некоторой части программы прямо пропорционально числу ошибок, уже обнаруженных в ней;
необходимо досконально изучать результаты каждого теста для того, чтобы не пропустить маленькие ошибки.
При построение тестов выделяют два подхода:
1) функциональное тестирование – ПО рассматривается как «черный ящик». Для проверки работоспособности на вход должен подаваться весь набор возможных параметров
2) структурное тестирование – базируется на анализе логики ПО. Используется такой набор входных данных, который позволит пройти по всем ветвям графа состояний вычислительного процесса.
Выделяют следующие методы функционального тестирования:
1) эквивалентное разбиение. Основная цель данного метода – минимизация тестового набора без потери его эффективности. Тестовый набор считается эффективным, если позволяет обнаружить ошибку в программе. Каждый тест должен включать столько входных условий с тем, чтобы минимизировать общее число необходимых тестов. Разработка тестов состоит из 2-х этапов:
а) Выделение классов эквивалентности. Если тест из некоторого класса обнаруживает ошибку А, то все остальные тесты этого класса должны тоже ее обнаружить. Их выделяют путем выбора входного условия. Формируется как минимум 2 класса: правильный и неправильный класс эквивалентности. При выделении следует придерживаться следующих правил:
если входное условие описывает допустимую область значений, то формируется один правильный класс эквивалентности, соответствующий области, и несколько неправильных;
если входное условие описывает множество допустимых значений, то для каждого допустимого значения определяется правильный класс и формируется один неправильный класс для значений, не принадлежащих множеству;
если входное условие описывает ситуацию «должно быть», то выделяется один правильный и один неправильный класс;
если различные элементы классов эквивалентности трактуются программой неодинаково, то класс разбивается на подклассы.
б) Непосредственное построение теста. Первоначально проектируется тест, покрывающий правильные классы эквивалентности. Чем больше правильных классов он покрывает, тем он эффективнее. Затем для каждого неправильного класса разрабатывается индивидуальный тест.
2) анализ граничных условий. Базируется на методе эквивалентных разбиений, но для создания тестового набора использует ситуации, возникающие непосредственно на, чуть выше или чуть ниже границы входных и выходных классов эквивалентности. При выборе тестового значения входного параметра стараются, чтобы он проверял границу класса эквивалентности, причем проверяются как входные, так и выходные значения. Если вход или выход программы есть упорядоченное множество, то для анализа граничных условий выбирают первый и последний элемент множества.
3) применение функциональных диаграмм. В отличие от предыдущих, этот метод исследует комбинации входных условий. Функциональная диаграмма представляет собой формальный язык, на котором транслируется спецификация ПО. Формирование функциональных диаграмм выполняется в несколько этапов:
спецификация разбивается на рабочие участки для упрощения построения диаграмм;
в спецификации определяются причины и следствия. Причины – входные условия или классы эквивалентности, следствия – выходные условия;
спецификация преобразуется в булевый граф, связывающий причины и следствия;
функциональная диаграмма снабжается примечаниями, задающими ограничения и описывающими комбинации причин, которые являются невозможными;
путем прослеживания состояний условий функциональная диаграмма преобразуется в таблицу решений, которая соответствует тесту.
4) предположение об ошибке. Интуитивно предполагаются вероятные типы ошибок на основании опыта. Выделяются ситуации, в которых наиболее вероятно появление ошибок в программе.
Достоинства тестирования по принципу «черного ящика»:
Сокращение необходимого количества тестовых вариантов.
Выявление категорий ошибок, не доступных способу «белого ящика».
Недостатки тестирования по принципу «черного ящика»:
Невозможно исчерпывающее тестирование.
Не реагирует на многие особенности программных ошибок.
