- •Оглавление
- •Об авторе
- •Благодарности
- •Предисловие
- •Глава 1. Держим оборону
- •На пути к хорошему коду
- •Готовьтесь к худшему
- •Что такое защитное программирование?
- •Этот страшный, ужасный мир
- •Технологии защитного программирования
- •Выберите хороший стиль кодирования и пользуйтесь крепкой архитектурой
- •Пишите код без спешки
- •Не верьте никому
- •Стремитесь к ясности, а не к краткости
- •Не позволяйте никому лезть туда, где ему нечего делать
- •Включайте вывод всех предупреждений при компиляции
- •Пользуйтесь средствами статического анализа
- •Применяйте безопасные структуры данных
- •Проверяйте все возвращаемые значения
- •Аккуратно обращайтесь с памятью (и другими ценными ресурсами)
- •Инициализируйте все переменные там, где вы их объявили
- •Объявляйте переменные как можно позже
- •Пользуйтесь стандартными средствами языка
- •Пользуйтесь хорошими средствами регистрации диагностических сообщений
- •Выполняйте приведение типов с осторожностью
- •Подробности
- •Ограничения
- •Какие ограничения налагать
- •Снятие ограничений
- •Резюме
- •Контрольные вопросы
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 2. Тонкий расчет
- •Да в чем проблема?
- •Знайте своих клиентов
- •Что такое хорошее представление?
- •Размещение скобок
- •Скобки в стиле K&R
- •Расширенный стиль скобок
- •Стиль Уайтсмита (с отступами)
- •Другие стили скобок
- •Единственно верный стиль
- •Внутрифирменные стили (и когда их придерживаться)
- •Установка стандарта
- •Религиозные войны?
- •Резюме
- •Контрольные вопросы
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 3. Что в имени тебе моем?
- •Зачем нужны хорошие имена?
- •Каким объектам мы даем имена?
- •Игра в названия
- •Описательность
- •Техническая корректность
- •Идиоматичность
- •Тактичность
- •Технические подробности
- •Имена переменных
- •Имена функций
- •Имена типов
- •Пространства имен
- •Имена макросов
- •Имена файлов
- •Роза пахнет розой
- •Соблюдайте единообразие
- •Связывайте имя с содержимым
- •Извлекайте выгоду из выбора имени
- •Резюме
- •Контрольные вопросы
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 4. Литературоведение
- •Самодокументируемый код
- •Техника написания самодокументируемого кода
- •Пишите простой код с хорошим форматированием
- •Выбирайте осмысленные имена
- •Разбивайте код на самостоятельные функции
- •Выбирайте содержательные имена типов
- •Применяйте именованные константы
- •Выделяйте важные фрагменты кода
- •Объединяйте взаимосвязанные данные
- •Снабжайте файлы заголовками
- •Правильно обрабатывайте ошибки
- •Пишите осмысленные комментарии
- •Практические методологии самодокументирования
- •Грамотное программирование
- •Инструментарий документирования
- •Резюме
- •Контрольные вопросы
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 5. Заметки на полях
- •Что есть комментарий в коде?
- •Как выглядят комментарии?
- •Сколько комментариев требуется?
- •Что помещать в комментарии?
- •Не нужно описывать код
- •Не подменяйте код
- •Как сделать комментарии полезными
- •Не отвлекаться
- •На практике
- •Замечание об эстетичности
- •Единообразие
- •Четкие блочные комментарии
- •Отступы в комментариях
- •Комментарии в конце строки
- •Помощь в чтении кода
- •Стиль должен обеспечивать легкость сопровождения
- •Границы
- •Флажки
- •Комментарии в заголовке файла
- •Работа с комментариями
- •Помощь при написании программ
- •Заметки об исправлении ошибок
- •Устаревание комментариев
- •Сопровождение и бессодержательные комментарии
- •Резюме
- •Контрольные вопросы
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 6. Людям свойственно ошибаться
- •Откуда что берется
- •Механизмы сообщения об ошибках
- •Без обработки ошибок
- •Возвращаемые значения
- •Переменные, содержащие состояние ошибки
- •Исключения
- •Сигналы
- •Обнаружение ошибок
- •Обработка ошибок
- •Когда обрабатывать ошибки
- •Варианты реагирования
- •Последствия для кода
- •Подымаем скандал
- •Управление ошибками
- •Резюме
- •Контрольные вопросы
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 7. Инструментарий программиста
- •Что такое инструмент программирования?
- •А зачем они нужны – инструменты?
- •Электроинструменты
- •Выясните, каковы его возможности
- •Научитесь им управлять
- •Выясните, для каких задач он пригоден
- •Убедитесь, что он работает
- •Имейте четкие данные о том, как получить дополнительные сведения
- •Узнайте, как получить новые версии
- •Какой инструмент необходим?
- •Средства редактирования исходного кода
- •Средства построения кода
- •Инструменты для отладки и тестирования
- •Средства поддержки языка
- •Инструменты различного назначения
- •Резюме
- •Контрольные вопросы
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 8. Время испытаний
- •Проверка на подлинность
- •Кто, что, когда, зачем?
- •Зачем тестировать
- •Кому тестировать
- •В чем состоит тестирование
- •Когда тестировать
- •Типы тестирования
- •Выбор контрольных примеров для блочного тестирования
- •Архитектура и тестирование
- •Руками не трогать!
- •Анатомия провала
- •Справлюсь ли я сам?
- •Система контроля ошибок
- •Обсуждение ошибок
- •Резюме
- •Контрольные вопросы
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 9. Поиск ошибок
- •Реальные факты
- •Природа этого зверя
- •Взгляд с высоты птичьего полета
- •Взгляд с поверхности земли
- •Взгляд из глубины
- •Борьба с вредителями
- •Обходная дорога
- •Правильный путь
- •Охота за ошибками
- •Ошибки этапа компиляции
- •Ошибки этапа исполнения
- •Как исправлять ошибки
- •Профилактика
- •Отладчик
- •Средство проверки доступа к памяти
- •Трассировщик системных вызовов
- •Дамп памяти
- •Журналирование
- •Резюме
- •Контрольные вопросы
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 10. Код, который построил Джек
- •Языковые барьеры
- •Интерпретируемые языки
- •Компилируемые языки
- •Делаем слона из мухи
- •Выполнение сборки
- •Что должна уметь хорошая система сборки?
- •Простота
- •Единообразие
- •Повторяемость и надежность
- •Атомарность
- •Борьба с ошибками
- •Механика сборки
- •Выбор целей
- •Уборка
- •Зависимости
- •Автоматическая сборка
- •Конфигурация сборки
- •Рекурсивное применение make
- •Мастер на все руки
- •Резюме
- •Контрольные вопросы
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 11. Жажда скорости
- •Что такое оптимизация?
- •От чего страдает оптимальность кода?
- •Доводы против оптимизации
- •Альтернативы
- •Нужна ли оптимизация
- •Технические подробности
- •Убедитесь, что нужна оптимизация
- •Определите самую медленную часть кода
- •Тестирование кода
- •Оптимизация кода
- •После оптимизации
- •Методы оптимизации
- •Конструктивные изменения
- •Модификация кода
- •Как писать эффективный код
- •Резюме
- •Контрольные вопросы
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 12. Комплекс незащищенности
- •Риски
- •Наши оппоненты
- •Оправдания, оправдания
- •Ощущение незащищенности
- •Опасный проект и архитектура
- •Переполнение буфера
- •Встроенные строки запросов
- •Условия гонки
- •Целочисленное переполнение
- •Дела защитные
- •Технология установки системы
- •Технология конструирования программного обеспечения
- •Технологии реализации кода
- •Технологии процедуры
- •Резюме
- •Контрольные вопросы
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 13. Важность проектирования
- •Программирование как конструкторская работа
- •Что нужно проектировать?
- •Хороший проект программного продукта
- •Простота
- •Элегантность
- •Модульность
- •Хорошие интерфейсы
- •Расширяемость
- •Избегайте дублирования
- •Переносимость
- •Идиоматичность
- •Документированность
- •Как проектировать код
- •Методы и процедуры проектирования
- •Инструменты проектирования
- •Резюме
- •Контрольные вопросы
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 14. Программная архитектура
- •Что такое программная архитектура?
- •План программы
- •Точки зрения
- •Где и когда этим заниматься?
- •Для чего она применяется?
- •Компоненты и соединения
- •Какими качествами должна обладать архитектура?
- •Архитектурные стили
- •Без архитектуры
- •Многоуровневая архитектура
- •Архитектура с каналами и фильтрами
- •Архитектура клиент/сервер
- •Компонентная архитектура
- •Каркасы
- •Резюме
- •Контрольные вопросы
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 15. Программное обеспечение – эволюция или революция?
- •Гниение программного обеспечения
- •Тревожные симптомы
- •Как развивается код?
- •Вера в невозможное
- •Как с этим бороться?
- •Как писать новый код
- •Сопровождение существующего кода
- •Резюме
- •Контрольные вопросы
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 16. Кодеры
- •Мартышкин труд
- •Нетерпеливый
- •Кодер (Code Monkey)
- •Гуру
- •Псевдогуру
- •Высокомерный гений
- •Ковбой
- •Плановик
- •Ветеран
- •Фанатик
- •Монокультурный программист
- •Лодырь
- •Руководитель поневоле
- •Идеальный программист
- •И что из этого следует?
- •Для глупцов
- •Резюме
- •План действий
- •Контрольные вопросы
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 17. Вместе мы – сила
- •Команды – общий взгляд
- •Организация команды
- •Методы управления
- •Разделение ответственности
- •Организация и структура кода
- •Инструменты для групповой работы
- •Болезни, которым подвержены команды
- •Вавилонская башня
- •Диктатура
- •Демократия
- •Большой Каньон
- •Зыбучие пески
- •Лемминги
- •Личное мастерство и качества, необходимые для работы в команде
- •Общение
- •Скромность
- •Разрешение конфликтов
- •Обучение и приспособляемость
- •Знание пределов своих возможностей
- •Принципы групповой работы
- •Коллективное владение кодом
- •Нормы кодирования
- •Определите, что считать успехом
- •Установите ответственность
- •Избегайте истощения
- •Жизненный цикл команды
- •Создание команды
- •Рост команды
- •Групповая работа
- •Роспуск команды
- •Резюме
- •План действий
- •Контрольные вопросы
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 18. Защита исходного кода
- •Управление версиями исходного кода
- •Контроль версий
- •Контроль доступа
- •Работа с хранилищем
- •Пусть растут деревья
- •Краткая история систем контроля за исходным кодом
- •Управление конфигурацией
- •Резервное копирование
- •Выпуск исходного кода
- •Резюме
- •Контрольные вопросы
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 19. Спецификации
- •Что же это такое, конкретно?
- •Типы спецификаций
- •Спецификация требований
- •Функциональная спецификация
- •Спецификация системной архитектуры
- •Спецификация интерфейса пользователя
- •Проектная спецификация
- •Спецификация тестирования
- •Что должны содержать спецификации?
- •Процесс составления спецификаций
- •Почему мы не пишем спецификации?
- •Резюме
- •Контрольные вопросы
- •Вопросы для размышления
- •Вопросы личного характера
- •Когда проводить рецензирование?
- •Нужно ли рецензировать
- •Какой код рецензировать
- •Проведение рецензирования кода
- •Рецензирование на собраниях
- •Интеграционное рецензирование
- •Пересмотрите свое отношение
- •Позиция автора
- •Позиция рецензента
- •Идеальный код
- •За пределами рецензирования кода
- •Резюме
- •Контрольный список
- •Контрольные вопросы
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 21. Какой длины веревочка?
- •Выстрел в темноте
- •Почему трудно делать оценки?
- •Под давлением
- •Практические способы оценки
- •Игры с планами
- •Не отставай!
- •Резюме
- •Контрольные вопросы
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 22. Рецепт программы
- •Стили программирования
- •Структурное программирование
- •Функциональное программирование
- •Логическое программирование
- •Рецепты: как и что
- •Процессы разработки
- •Каскадная модель
- •SSADM и PRINCE
- •Создание прототипов
- •Итеративная и инкрементная разработка
- •Спиральная модель
- •Другие процессы разработки
- •Спасибо, хватит!
- •Выбор процесса
- •Резюме
- •Контрольные вопросы
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 23. За гранью возможного
- •Программирование приложений
- •Коробочные продукты
- •Заказные приложения
- •Программирование игр
- •Системное программирование
- •Встроенное программное обеспечение
- •Программирование масштаба предприятия
- •Численное программирование
- •И что дальше?
- •Резюме
- •Контрольные вопросы
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 24. Что дальше?
- •Но что же дальше?
- •Ответы и обсуждение
- •Глава 1. Держим оборону
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 2. Тонкий расчет
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 3. Что в имени тебе моем?
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 4. Литературоведение
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 5. Заметки на полях
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 6. Людям свойственно ошибаться
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 7. Инструментарий программиста
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 8. Время испытаний
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 9. Поиск ошибок
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 10. Код, который построил Джек
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 11. Жажда скорости
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 12. Комплекс незащищенности
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 13. Важность проектирования
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 14. Программная архитектура
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 15. Программное обеспечение – эволюция или революция?
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 16. Кодеры
- •Вопросы для размышления
- •Глава 17. Вместе мы – сила
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 18. Защита исходного кода
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 19. Спецификации
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 20. Рецензия на отстрел
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 21. Какой длины веревочка?
- •Вопросы для размышления
- •Вопросы личного характера
- •Глава 22. Рецепт программы
- •Вопросы для размышления
- •Глава 23. За гранью возможного
- •Вопросы для размышления
- •Вопросы личного характера
- •Библиография
- •Алфавитный указатель
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
|
|
P |
|
|
|
|
|
NOW! |
o |
|
||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
Типыm |
тестирования |
|||||
|
|
|
|
|||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
195Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
o |
|
|
|
w |
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
.c |
|
||
|
. |
|
|
|
|
|
|
|||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
чтобы сгенерировать все необходимые тестовые данные и прогнать про% грамму со всеми наборами входных данных и внешних условий. Метод полного перебора быстро становится неосуществимым, и возникает со% блазн отказаться от тестирования в надежде, что ошибок не окажется.
Как бы тщательно вы ни проводили тестирование, создать программ% ный продукт, лишенный ошибок, вам не удастся – для написания тес% тового кода нужно потратить столько же сил и изобретательности, сколько для обычного кода. Некоторые ошибки неизменно проскаль% зывают сквозь самые строгие процедуры тестирования (исследования показывают, что наиболее тщательно протестированные продукты со% держат от 0.5 до 3 ошибок на 1000 строк кода) (Myers 86). На практике тестирование гарантирует не 100%процентную надежность программ, а лишь достаточную их адекватность решаемым задачам.
С учетом сказанного эффективнее всего будет сосредоточить свое внима% ние на ключевых тестах, рассчитывая с их помощью отловить большую часть программных ошибок. Ниже мы рассмотрим вопрос их выбора.
Типы тестирования
Есть много разновидностей программных тестов, и ни один из них не обладает превосходством над остальными. В каждом методе код рас% сматривается с определенной стороны и выполняется поиск опреде% ленного класса ошибок. Все тесты необходимы.
Блочное тестирование
Под блочным тестированием обычно понимают тестирование мо# дуля кода (например, библиотеки, драйвера устройства или стека протоколов), но в реальности это тестирование неделимых единиц, таких как классы или функции.
Блочное тестирование проводится строго изолированно. Любой нена% дежный внешний код, с которым взаимодействует блок, заменяется заглушкой, или имитатором; это обеспечивает поиск ошибок только в данном блоке, а не тех, которые обусловлены внешним влиянием.
Тестирование компонент
На следующем шаге – тестировании компонент – проверяется рабо% тоспособность одного или нескольких блоков в составе компонен% ты. Часто именно это подразумевают под блочным тестированием.
Комплексное тестирование
Этот тест проверяет комбинируемость компонент, подключаемых к системе, гарантируя их правильное взаимодействие.
Регрессивное тестирование
Это повторное тестирование, проводимое после исправлений или модификации программного обеспечения или его окружения. Рег% рессивные тесты проверяют, что программное обеспечение работает
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
C |
|
E |
|
|||
|
|
X |
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
||
|
F |
|
|
|
|
|
|
t |
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
r |
|
P |
|
|
|
|
|
NOW! |
o |
||
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|||
|
|
|
|
to |
|
|
|
|
|
w Click |
|
|
|
196m |
|||||
|
|
|
|
||||||
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
. |
|
|
|
|
|
.c |
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
df |
|
|
n |
e |
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
Глава 8. Время испытанийClick |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
o |
|
|
|
w |
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
.c |
|
||
|
. |
|
|
|
|
|
|
|||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
так же, как прежде, и внесенные модификации не нарушили его функций. Если программное обеспечение ненадежно, изменения в одном месте могут привести к непонятным сбоям в другом. Рег% рессивное тестирование призвано бороться с этим.
Определить объем повторного тестирования бывает нелегко, особен% но когда цикл разработки близится к концу. Для такого тестирова% ния особенно полезны автоматизированные средства. Подробнее об этом будет сказано в разделе «Руками не трогать!» на стр. 203.
Испытание под нагрузкой
Испытания под нагрузкой проводятся с целью определить, выдер% жит ли ваш код объем данных, который, предположительно, может на него обрушиться. Легко написать код, который дает правильный ответ, но совсем другое дело, когда этот ответ требуется получить вовремя. Здесь могут вскрыться проблемы, связанные с производи% тельностью системы, такие как неверный выбор размеров буферов, неэффективное использование памяти или неудачная схема базы данных. Испытание под нагрузкой проверяет, что программа долж% ным образом «масштабируется».
Испытание пиковыми нагрузками
Испытание пиковыми нагрузками обрушивает на код огромное ко% личество данных в течение короткого промежутка времени, чтобы посмотреть, как он с этим справится. Оно аналогично испытанию под нагрузкой и часто используется для интенсивно используемых систем. Испытание пиковымих нагрузками проверяет характери% стики системы: насколько она вынослива к перегрузкам. Испытание под нагрузкой проверяет, может ли код справляться с расчетными нагрузками; испытание пиковыми нагрузками проверяет, не загнет% ся ли код, если ему действительно хорошо достанется. При этом не предполагается, что код будет работать безупречно; лишь бы он при% лично отработал отказ и смог восстановить нормальную работу.
Испытание пиковыми нагрузками позволяет определить пропуск% ную способность системы – до какой степени можно ее прижать, прежде чем она сдастся. Особенно уместно такое испытание в мно% гопоточных системах и системах реального времени.
Комплексное испытание под нагрузкой (прогон)
Прогон похож на испытание пиковыми нагрузками. Цель – заста% вить систему работать с высокой загрузкой в течение продолжи% тельного времени – нескольких дней, недель или даже месяцев – и узнать, не отразится ли как%нибудь выполнение большого коли% чества операций на функционировании системы. Прогон позволяет обнаружить проблемы, которые нельзя выявить другими способа% ми: мелкие утечки памяти, приводящие в итоге к аварийному за% вершению, или снижение производительности за счет постепенной фрагментации внутренних структур данных.
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
|
|
P |
|
|
|
|
|
NOW! |
o |
|
||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
Типыm |
тестирования |
|||||
|
|
|
|
|||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
197Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
o |
|
|
|
w |
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
.c |
|
||
|
. |
|
|
|
|
|
|
|||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Альфа, бета, гамма…
А как насчет альфа% и бета%тестирования? Эти термины встреча% ются часто, но относятся к несколько другому кругу проблем, чем рассмотренные выше. Их задачей, скорее, является тестиро% вание окончательного продукта, а не отдельных участков кода. Тем не менее стоит остановиться на этих понятиях.
К счастью, формальных определений у них нет. У каждой компа% нии существуют свои представления о том, что означают альфа% или бета%состояния ее программного продукта. Но обычно про% граммы стадии «альфа» прочны, как лимонное желе, и взрыва% ются при попадании на них света. Альфа% и бета%программы час% то выпускают за пределы территории разработки для предвари% тельной оценки клиентами, чтобы получить первоначальные от% зывы и хоть какую%то уверенность в правильности направления.
Чаще всего термины интерпретируют так:
Альфа версия
Первая стадия «законченного кода». Может иметь бесчислен% ное количество ошибок и быть совершенно ненадежной. Аль% фа%версия дает хорошее представление о том, каким будет ко% нечный продукт, если не обращать внимания на очевидные недочеты.
Бета версия
Она значительно превосходит альфа%версию, будучи почти свободной от ошибок и сохраняя нерешенными очень немно% гие проблемы. Она уже близка к конечному продукту. Бета% тестирование (т. е. тестирование бета%версии) служит для то% го, чтобы решить оставшиеся проблемы в кандидатах на окончательный выпуск. Обычно в бета%тестирование входят реальные полевые испытания.
Кандидат на выпуск
Это последняя стадия перед формальным выпуском программ% ного продукта. Кандидаты на выпуск проходят верификацию и тестирование качества (validation), перед тем как пойти в производство. Кандидаты на выпуск – это внутренние сбор% ки, обычно проверяемые только отделом контроля качества.
Альфа% и бета%версии, выпускаемые для публики, обычно имеют некоторые механизмы защиты (например, ограничение времени функционирования). Кандидаты на выпуск – это «чистые» сбор% ки без такого рода ограничений.
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
C |
|
E |
|
|||
|
|
X |
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
||
|
F |
|
|
|
|
|
|
t |
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
r |
|
P |
|
|
|
|
|
NOW! |
o |
||
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|||
|
|
|
|
to |
|
|
|
|
|
w Click |
|
|
|
198m |
|||||
|
|
|
|
||||||
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
. |
|
|
|
|
|
.c |
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
df |
|
|
n |
e |
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
Глава 8. Время испытанийClick |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
o |
|
|
|
w |
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
.c |
|
||
|
. |
|
|
|
|
|
|
|||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Тестирование юзабилити
Гарантирует, что вашей программой сможет пользоваться даже ту% пой. Есть разные виды тестирования конечными пользователями, часто выполняемые в особых лабораториях, по специальным сце% нариям и с жестким контролем. Кроме того, используются полевые испытания, при которых можно узнать мнение пользователей о ра% боте программы в реальных условиях.
При написании тестов для блоков и компонент есть два главных под% хода к разработке контрольных примеров: тестирование методом чер# ного ящика и тестирование методом белого ящика.
Метод черного ящика
Известен также как функциональное тестирование. В этом методе фактическая функциональность сравнивается с заявленной. Тести% рующий не знает внутреннего устройства кода; он рассматривается как черный ящик. Разработчик и тестирующий могут быть никак не связаны друг с другом.1
Это метод ставит целью не проверку работы каждой строчки кода, а соответствие кода спецификации программы – что при подаче на вход черного ящика допустимых данных на его выходе будет получен нужный результат. Поэтому без ясных спецификаций и документи% рованных API разрабатывать тесты черного ящика очень сложно.
Контрольные примеры для черного ящика можно начать разраба% тывать, как только будет готова спецификация. Они существенно зависят от корректности спецификаций и незначительности изме% нений, вносимых в них после разработки тестов.
Метод белого ящика
Известен также как структурное тестирование. Это подход на ба% зе изучения кода. Каждая строка кода подвергается систематиче% скому исследованию с целью определения ее корректности. Если в черный ящик вы заглянуть не могли, то в этот – можете и долж% ны. Поэтому тестирование методом белого ящика иногда называют тестированием методом стеклянного ящика. Его главная цель – протестировать написанные строки кода, а не проверять их соответ% ствие спецификациям.
Существуют статические и динамические способы тестирования методом белого ящика. В статических тестах код не выполняется; он просматривается и проходится пошагово с целью определить, правильно ли он решает задачу. Динамические тесты выполняют код и нацелены на тестирование путей и ответвлений в попытке по% пасть на все строки кода и выполнить каждое решение. При этом может потребоваться несколько изменить код, чтобы принудитель%
1Однако не всегда эта мысль удачна; обычно программист лучше всего спра%
вится с написанием теста для кода, который сам разработал.
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
|
|
P |
|
|
|
|
|
NOW! |
o |
|
||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
Типыm |
тестирования |
|||||
|
|
|
|
|||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
199Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
o |
|
|
|
w |
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
.c |
|
||
|
. |
|
|
|
|
|
|
|||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
но пройти некоторыми путями. Осуществить такую модификацию бывает проще, чем сконструировать контрольный пример для всех возможных комбинаций обстоятельств.1
Тестирование методом белого ящика трудоемко и значительно до% роже по сравнению с черным ящиком, а потому и прибегают к нему гораздо реже. Даже для планирования тестирования методом бело% го ящика нужно иметь завершенный код. Обычно вначале тестиру% ют методом черного ящика и лишь затем – белого. Последствия ошибки, найденной на этой стадии, обходятся намного дороже. Приходится исправлять код, проводить тест черного ящика, а за% тем разрабатывать и проводить новые тесты белого ящика.
Существует инструментарий для модификации кода и замера ре% зультатов тестирования. Без такого инструментария метод белого ящика был бы вообще немыслим.
Время тестировать
Каждый из этих методов тестирования применяется на разных этапах процесса разработки. Это иллюстрируется таблицей, в ко% торой отмечено, какие тесты наиболее существенны в каждый момент.
|
Стадия |
Черный или |
Стандартные методы тести |
Кто проводит |
|
|
разработки |
белый ящик? |
рования на данной стадии |
тестирование |
|
|
|
|
|
разработки |
|
|
|
|
|
|
|
|
Определение |
Черный |
Разработка тестов черного |
Разработчи% |
|
|
технических |
|
|
ящика |
ки, QA |
|
требований |
|
|
|
|
|
Проектиро% |
Черный |
Разработка тестов белого |
Разработчи% |
|
|
вание кода |
|
|
ящика |
ки, QA |
|
Написание |
Черный, |
Блочный, компонентный, |
Разработчики |
|
|
кода |
белый |
регрессивный |
|
|
|
Интеграция |
Черный, |
Компонентный, комплекс% |
Разработчики |
|
|
кода |
белый |
ный, регрессивный |
|
|
|
Альфа% |
Черный, |
Регрессивный, нагрузки, пи% |
Разработчи% |
|
|
стадия |
белый |
ковый, прогон, юзабилити |
ки, QA |
|
|
Бета%стадия |
Черный, |
Регрессивный, нагрузки, пи% |
QA |
|
|
|
белый |
ковый, прогон, юзабилити |
|
|
|
Кандидат на |
Черный, |
Регрессивный, нагрузки, |
QA |
|
|
выпуск |
белый |
пиковый, прогон |
|
|
|
Выпуск |
Черный, |
Слишком поздно… |
Пользовате% |
|
|
|
белый |
|
ли (удачи им) |
|
|
|
|
|
|
|
|
|
|
|
|
|
1Если вы модифицируете исходный код, то фактически тестируете неокон%
чательный вариант, что вызывает некоторую тревогу.