Тестирование и сопровождение
| English | Русский |
|---|---|
| run-time error/rʌn taɪm ˈerə/ | ошибка во время выполнения |
| syntax error/ˈsɪntæks ˈerə/ | синтаксическая ошибка |
| logic error/ˈlɒdʒɪk ˈerə/ | логическая ошибка |
| dry run/draɪ rʌn/ | сухой прогон |
| walkthrough/ˈwɔːkθruː/ | прохождение по коду |
| white-box testing/waɪt bɒks ˈtestɪŋ/ | тестирование белого ящика |
| black-box testing/blæk bɒks ˈtestɪŋ/ | тестирование черного ящика |
| integration testing/ˌɪntɪˈɡreɪʃn ˈtestɪŋ/ | интеграционное тестирование |
| stub/stʌb/ | заглушка |
| alpha testing/ˈælfə ˈtestɪŋ/ | альфа-тестирование |
| beta testing/ˈbiːtə ˈtestɪŋ/ | бета-тестирование |
| acceptance testing/əkˈseptəns ˈtestɪŋ/ | приемочное тестирование |
| test strategy/test ˈstrætədʒi/ | стратегия тестирования |
| test plan/test plæn/ | план тестирования |
| normal data/ˈnɔːml ˈdeɪtə/ | нормальные данные |
| abnormal data/əbˈnɔːml ˈdeɪtə/ | аномальные данные |
| extreme data/ekˈstriːm ˈdeɪtə/ | крайние данные |
| boundary data/ˈbaʊndəri ˈdeɪtə/ | граничные данные |
| corrective maintenance/kəˈrektɪv ˈmeɪntənəns/ | корректирующее сопровождение |
| adaptive maintenance/əˈdæptɪv ˈmeɪntənəns/ | адаптивное сопровождение |
| perfective maintenance/pəˈfektɪv ˈmeɪntənəns/ | совершенствующее обслуживание |
| regression testing/rɪˈɡreʃn ˈtestɪŋ/ | регрессионное тестирование |
Тридцать семь секунд
- 4 июня 1996 первая ракета Ariane 5 стартовала с Французской Гвианы. Через тридцать семь секунд она отклонилась от курса и разрушилась. Погрузкой были четыре спутника стоимостью $370 миллионов.
- Причиной стала одна строка кода, переиспользованная из Ariane 4, которая преобразовывала 64-битное число в 16-битный целочисленный тип. Ariane 5 летела быстрее, число было больше, и преобразование привело к переполнению: ошибка выполнения в рутине, которая даже не требовалась после запуска.
- Этот код никогда не тестировался с данными полета Ariane 5. Никто не выбирал тестовые данные на границах нового диапазона ракеты.
- Этот урок охватывает три вида ошибок, методы тестирования, выбор тестовых данных и то, как поддерживать работу программы после релиза.
Три вида ошибок
- Синтаксическая ошибка нарушает грамматику языка: пропущенная скобка, неправильно написанное ключевое слово. Она обнаруживается при трансляции, поэтому программа не запустится до исправления.
- Ошибка выполнения происходит во время работы программы: деление на ноль, несуществующий файл, индекс массива вне допустимого диапазона. Программа завершается аварийно или выбрасывает исключение; исправление — проверка перед опасной операцией.
- Логическая ошибка позволяет программе работать и выдавать неправильные результаты:
+вместо-, цикл со смещением на единицу, условия в неправильном порядке. Ничто не сигнализирует об этом; только тестирование и трассировка раскрывают её.

Обнаруживается при трансляции, обнаруживается во время выполнения, обнаруживается только в результате
Соотнесите каждый вид ошибки с тем, как она проявляется.
Синтаксис = обнаруживается при компиляции; логика = неверный вывод; ошибка выполнения = сбой во время работы программы.
Разобранный пример: найдите и исправьте ошибки
Total ← 0
FOR i ← 1 TO Count
Total ← Total + Marks[i]
NEXT i
Average ← Total / Count
IF Average > 50 THEN
OUTPUT "Pass"
- Синтаксис: у
IFнетENDIF. Транслятор отвергает его. Выполнение: еслиCountравно 0, деление не удастся; защитите его с помощьюIF Count > 0 THEN. Логика: если оценка равна 50 или более,> 50не засчитывает студента ровно на 50; должно быть>= 50. - Назовите тип, скажите, почему это именно этот тип, и дайте исправление. Три части, три балла.
Программа делит общую сумму на количество записей и завершается ошибкой, когда входной файл пуст. Это:
Деление на ноль происходит во время выполнения программы и останавливает её. Защита, например IF Count > 0, исправляет это.
Методы тестирования: чтение кода
- Сухой прогон (dry run) прослеживает выполнение кода на бумаге, записывая значение каждой переменной в таблицу трассировки после каждой строки.
- Walkthrough (обход/ревью) — это командная проверка: программист объясняет код построчно, пока коллеги ищут ошибки.
- Белый ящик проектирует тесты на основе внутренней структуры кода, чтобы каждый оператор, ветвь и цикл были протестированы. Черный ящик проектирует тесты только по спецификации: подавайте входные данные, сравнивайте выходные с ожидаемыми, не глядя на код.

Снаружи внутрь, или изнутри по каждому пути
Разработка тестовых случаев только по спецификации (входные данные и ожидаемые результаты), без учета внутреннего кода, называется ______-тестированием.
Тесты черного ящика основаны на спецификации; белого ящика используют внутреннюю структуру кода для покрытия операторов и ветвлений.
Методы тестирования: сборка и выпуск
- Интеграционное тестирование объединяет модули, протестированные отдельно, и проверяет интерфейсы между ними. Заглушка (stub) заменяет модуль, который еще не написан, возвращая фиксированные значения, чтобы остальное можно было протестировать сверху вниз.
- Альфа-тестирование α проводится внутри компании разработчиками перед релизом. Бета-тестирование β предоставляет ограниченную группу реальных пользователей программу в их собственной среде.
- Приемочное тестирование выполняется заказчиком согласно требованиям для определения, подходит ли продукт для своей цели.
Лаборатория программного процесса
Классифицируйте примеры разработки по этапе или инструменту, к которым они относятся.
Разобранный пример: какой метод для какой ситуации
- Модуль отчетности готов, но модуль базы данных, который он вызывает, еще не существует: протестируйте его с помощью заглушки, возвращающей фиксированные данные.
- Два модуля проходят собственные тесты, но несовместимы при передаче вывода одного в другой: интеграционное тестирование интерфейса.
- Программное обеспечение завершено; компания хочет найти ошибки в реальных условиях перед общим релизом: бета-тестирование ограниченной группой пользователей.
- Клиент решает, платить ли: приемочное тестирование на соответствие согласованным требованиям. Назовите метод и его назначение.
Соотнесите каждую ситуацию с методом тестирования, который требуется.
Заглушка для отсутствующей части, бета для реальных пользователей, приемочное для заказчика, интеграционное для соединений.
Стратегия тестирования и план тестирования
- Стратегия тестирования — это подход высокого уровня: какие виды тестирования будут проводиться, кем, когда и что должно быть успешно пройдено перед следующим этапом.
- План тестирования — это подробный список тестов. Для каждого: цель, входные данные, ожидаемый результат и столбец для фактического результата при выполнении теста.
- Тест без ожидаемого результата не является тестом. Он лишь показывает, что сделала программа, но не то, правильно ли она это сделала.
План тестирования перечисляет для каждого теста входные данные и ожидаемый результат.
Цель, входные данные, ожидаемый результат и столбец для фактического результата. Стратегия — это общий подход; план — это детальный список.
Выбор тестовых данных
- Нормальные данные: типичные допустимые значения в пределах диапазона, которые должны приниматься и обрабатываться корректно.
- Аномальные данные: значения, которые должны быть отклонены, вне диапазона или неправильного типа.
- Экстремальные данные: наибольшее и наименьшее значения, все еще принимаемые, на границах диапазона. Граничные данные: пары, охватывающие каждую границу, принимаемое экстремальное значение и отклоняемое значение непосредственно за ним, где скрываются ошибки «off-by-one».

Внутри, снаружи и прямо на линии
Для поля, принимающего оценки от 0 до 100, какие значения являются граничными?
Граничные данные находятся на краях допустимого диапазона (и сразу за его пределами) — там, где скрываются ошибки «на единицу».
Разобранный пример: тестовые данные для оценки от 0 до 100
| Вид | Данные | Ожидаемый результат |
|---|---|---|
| нормальные | 50, 75 |
принимаются и обрабатываются |
| аномальные | -10, 200, "abc" |
отклоняются: вне диапазона или неправильный тип |
| экстремальные | 0, 100 |
принимаются: наименьшее и наибольшее допустимые значения |
| граница | -1 и 0, 100 и 101 |
-1 отклонён, 0 принят; 100 принят, 101 отклонён |
- Каждая строка требует ожидаемого результата; таблица только с входами дает половину баллов. Экстремальные значения принимаются:
-1является граничным, а не экстремальным.
Поле принимает оценки от 0 до 100. Какие значения являются экстремальными тестовыми данными? Выберите все, что подходит.
Экстремальные значения — это наименьшее и наибольшее из все еще принимаемых. -1 отклоняется, поэтому это граничное или аномальное значение; 50 — нормальное.
Поддержка (Maintenance)
- Большая часть стоимости жизненного цикла программы тратится после релиза. Корректирующая поддержка устраняет ошибки, найденные в процессе использования.
- Адаптивная поддержка сохраняет работоспособность программы в меняющейся среде: новая операционная система, новый API, изменение законодательства.
- Совершенствующая поддержка улучшает уже работающую программу: более высокая производительность, новая функция, о которой просили пользователи. Программа может нуждаться во всех трех видах на протяжении всего своего жизненного цикла.

Исправить, поддерживать работу, улучшить
Корректирующее обслуживание устраняет неисправности, совершенствующее улучшает функции, а адаптивное поддерживает работу программного обеспечения в измененной среде.
Три вида обслуживания: корректирующее (устранение багов), совершенствующее (улучшение), адаптивное (новая ОС/оборудование/правила).
Программа для начисления зарплаты изменяется из-за изменения налогового законодательства. Какой вид обслуживания это?
Программа не содержала ошибок и не улучшалась; изменилась ее среда. Это адаптивное обслуживание.
Изменение существующей программы
- Прочитайте существующий код, пока не поймете алгоритм и поток данных. Найдите место изменения: какая подпрограмма, какие строки.
- Внесите изменения как можно меньше; не переписывайте работающий код. Обновите все связанные части: каждого вызывателя измененного списка параметров, каждую рутину, использующую измененную структуру данных.
- Протестируйте новое поведение и старое: регрессионное тестирование проверяет, что ничего из того, что раньше работало, не сломалось. Затем задокументируйте изменения.
После изменения программы регрессионное тестирование проверяет, что:
Регрессионное тестирование заново запускает старые тесты, чтобы подтвердить, что существующее поведение по-прежнему работает после изменений.
Расставьте шаги изменения существующей программы в правильном порядке.
Поймите, найдите, внесите небольшое изменение, распространите, протестируйте всё, зафиксируйте. Пропуск регрессионного тестирования — причина, по которой исправление ломает что-то еще.
Потерянные баллы
- Экстремальные принимаются; аномальные отклоняются.
0и100являются экстремальными;-1и101— граничные значения со стороны отклонения. - Логическая ошибка не вызывает сбой программы. Если бы она вызвала сбой, это была бы ошибка времени выполнения.
- Альфа — внутренняя; бета — реальные пользователи снаружи. Заглушка заменяет отсутствующий модуль; это не метод тестирования готового кода.
- Строка плана тестирования без ожидаемого вывода не приносит очков. Регрессионное тестирование следует за каждым изменением.
Вы поняли
- Синтаксические ошибки останавливают трансляцию · ошибки времени выполнения вызывают сбой работающей программы · логические ошибки выполняются и выдают неверный вывод, находятся только путем тестирования
- методы: сухая прогонка, проход по коду, белый ящик (из кода), черный ящик (из спецификации), интеграционное (интерфейсы, с заглушками для отсутствующих модулей), альфа (внутренняя), бета (реальные пользователи), приемочное (клиент)
- тестовые данные: нормальные принимаются, аномальные отклоняются, экстремальные — принимаемые границы, граничные по обе стороны от каждой границы; у каждого теста есть ожидаемый результат
- поддержка: корректирующие исправления, адаптивная поддерживает актуальность среды, совершенствующая улучшает; вносите небольшие изменения, обновляйте вызывателей, проводите регрессионное тестирование