Несмотря на достаточную сложность процесса верификации программы и на то, что даже успешно завершенная верификация не дает гарантий качества программы (так как ошибка может содержаться и в верификации), применение методов аналитического доказательства правильности очень полезно для уточнения смысла разрабатываемой программы, а знание этих методов благотворно сказывается на квалификации программиста.
Динамический контроль программы — это проверка правильности программы при ее выполнении на компьютере, т. е. тестирование. Минимальное автономное тестирование подпрограммы должно обеспечивать прохождение всех путей вычислений.
Проектная процедура тестирования подпрограммы заключается в следующем:
— по внешним спецификациям модуля подготовьте тесты для каждой ситуации и каждого недопустимого условия;
— просмотрите текст подпрограммы, чтобы убедиться, что все условные переходы будут выполняться в каждом направлении; при необходимости добавьте тесты;
— убедитесь по тексту подпрограммы, что тесты охватывают достаточно много путей; для циклов должны быть тесты без повторения, с одним повторением и с несколькими повторениями;
— проверьте по тексту подпрограммы ее чувствительность к особым значениям данных (наиболее опасные числа — это ноль и единица), в случае необходимости добавьте тесты.
11.8. ПРОЕКТИРОВАНИЕ КОМПЛЕКСНОГО ТЕСТА
В комплексном тесте должны проводиться следующие виды тестирования:
• работоспособности;
• стрессов;
• предельного объема вводимых данных;
• конфигурации различных технических средств;
• совместимости;
• защиты;
• требуемой памяти;
• производительности;
• настройки;
• надежности;
• средств восстановления при отказе;
• удобства обслуживания;
• программной документации;
• психологических факторов;
• удобства эксплуатации.
11.9. СРЕДСТВА АВТОМАТИЗАЦИИ ТЕСТИРОВАНИЯ
Генераторы тестов (automatic unit test) случайным образом генерируют данные.
Статические анализаторы программ, анализируют исходный тест и строят диаграммы маршрутов; анализируют присваивание данных и делают попытки построений данных, приводящих к ошибке.
Средства периода выполнения обычно производят статистический подсчет количества выполнения каждого оператора и позволяют контролировать полноту тестов.
ВЫВОДЫ
• Тестирование программ — главное, что определяет важнейшее качество программ — надежность.
• На тестирование расходуется основная часть средств и времени проекта.
• При разработке любой программы или системы тестирование отбирает большую часть времени и денег. Учитывая это, необходимо определить не очень большое количество тестов, обеспечивающих высокую вероятность обнаружения тех или иных ошибок.
• Аксиомы тестирования определяют основные цели и принципы тестирования.
• Если из текста исключить отладочные печати, то существенно усложнится сопровождение.
• Существуют два крайних подхода к проектированию тестов: стратегия "черного ящика" и стратегия "белого ящика". Бесполезно следовать только одному подходу. Необходимо строить стратегию тестирования только на основе сочетания подходов.
• При проектировании многомодульных программ используется восходящее тестирование (автономное тестирование нижних модулей, не вызывающих других модулей) и нисходящее тестирование (применение заглушек нижних уровней). Но у каждого из них есть свои достоинства и недостатки. Возможны также варианты:
— модифицированный нисходящий метод — согласно этому методу каждый модуль автономно тестируется перед включением в программу, собираемую сверху вниз;
— метод большого скачка — каждый модуль тестируется автономно, далее модули просто интегрируются в готовую программную систему;
— метод сандвича — по этому методу реализация и тестирование ведутся одновременно сверху и снизу, и два этих процесса встречаются в заранее намеченной временной точке;
— модифицированный метод сандвича — нижние модули тестируются строго снизу вверх, а модули верхних модулей сначала тестируются автономно, а затем собираются нисходящим методом. Этот метод апробирован при создании ОС.
• Существует деление тестирования на публичное и приватное. Часто используются оба способа: сначала программа проходит приватное тестирование, а затем, когда все крупные "проколы" уже выявлены, начинается ее публичное тестирование, чтобы собрать отзывы широкого круга пользователей.
Контрольные вопросы
1. Назовите основные аксиомы тестирования.
2. В чем преимущество отладочной печати?
3. Какие свойства программного обеспечения оказывают наибольшее влияние на процесс обнаружения ошибок при тестировании?
4. Для чего нужны эмпирические модели? Как производится их анализ?
5. Какова связь между процессами тестирования и проектирования?
6. В чем достоинства и недостатки восходящего и нисходящего проектирования? Ответ обосновать на примере конкретной программы.
7. Какой тест максимально быстро обнаружит зацикливание?
8. Выделите несколько основных критериев при выборе параметров тестирования.
Глава 12
МЕНЕДЖМЕНТ ПРОГРАММНЫХ РАЗРАБОТОК
12.1. УПРАВЛЕНИЕ РАЗРАБОТКОЙ ПРОГРАММНЫХ СИСТЕМ
Управление разработкой программных систем (software management) — это деятельность, направленная на обеспечение необходимых условий для работы коллектива разработчиков программного обеспечения (ПО), на планирование и контроль деятельности этого коллектива с целью обеспечения требуемого качества ПО, выполнения сроков и бюджета разработки ПО. Часто эту деятельность называют также управлением программным проектом (software project management). Здесь под программным проектом (software project) понимают всю совокупность работ, связанную с разработкой ПО, а ход выполнения этих работ называют развитием программного проекта (software project progress).
К необходимым условиям работы коллектива относят помещения, аппаратно-программные средства разработки, документацию и материально-финансовое обеспечение. Планирование и контроль предполагают разбиение всего процесса разработки ПО на отдельные конкретные работы (задания), подбор и расстановку исполнителей, установление сроков и порядка выполнения этих работ, оценку качества выполнения каждой работы. Финальной частью этой деятельности является организация и проведение аттестации (сертификации) ПО, которой завершается стадия разработки ПО.
Хотя виды деятельности по управлению разработкой ПО могут быть весьма разнообразными, в зависимости от специфики разрабатываемого ПО и организации работ по его созданию можно выделить некоторые общие процессы (виды деятельности) по управлению разработкой ПО:
— составление плана-проспекта по разработке ПО;
— планирование и составление расписаний по разработке ПО;
— управление издержками по разработке ПО;
— текущий контроль и документирование деятельности коллектива по разработке ПО;
— подбор и оценка персонала коллектива разработчиков ПО.
Составление плана-проспекта по разработке ПО включает формулирование предложений о том, как выполнять разработку ПО. Прежде всего должно быть зафиксировано, для кого разрабатывается ПО:
• для внешнего заказчика;
• для других подразделений той же организации;
• является инициативной внутренней разработкой.
В плане-проспекте должны быть установлены общие очертания работ по созданию ПО и оценена стоимость разработки, а также предоставляемые для разработки ПО материально-финансовые ресурсы и временные ограничения. Кроме того, он должен включать обоснование, какого рода коллективом должно разрабатываться ПО (специальной организацией, отдельной бригадой и т. п.). И наконец, должны быть сформулированы необходимые технологические требования (включая, возможно, и выбор подходящей технологии программирования).