В ходе тестирования 1000 строк программного кода за 3000 часов обнаружено 80 строк с ошибками

Любая программа может содержать в себе ошибки. Компилятор способен выявлять только синтаксические ошибки, но не способен отслеживать семантику. Большинство ошибок проявляется в ходе работы программы, при этом они могут возникать не всегда, а лишь при определенных условиях. Таким образом, успешная компиляция программы и выполнение этой программы в одних и тех же условиях не гарантируют отсутствие ошибок.

Рис. 1. V-образная модель жизненного цикла разработки ПО

При рассмотрении вопросов анализа программного кода порой удобнее применять ранее рассмотренную в разделе 1 модель жизненного цикла. Ее часто называют V-образной из-за расположения блоков на рисунке (рис. 1).

На втором этапе производится комплексная верификация (CV) реализованного программного обеспечения по отношению к требованиям. Наконец, производится комплексная интеграция (CI) и проверка всей системы: пользователь, аппаратура и программное обеспечение. При грамотном процессе разработки уже на этапах нисходящей ветви для каждого требования определяется, на каком уровне верификации должна будет проводиться проверка его соблюдения.

При этом следует исходить из предположения, что ошибки всегда есть. Тестирование можно считать успешным, если найдены ошибки, а не наоборот. В достаточно сложном ПО все ошибки могут не обнаруживаться даже после длительного тестирования, однако чем тщательнее ведется тестирование, тем меньше ошибок остается и тем менее вероятно возникновение невыявленных ошибок.

Тестовый план

Тестовый пример (набор) должен включать в себя как минимум:

Кроме указанных данных удобно, если каждый тестовый пример имеет дополнительно:

Для упрощения локализации ошибок и последующей модификации тест-плана нужно, чтобы тестовые примеры были независимы друг от друга, т. е. чтобы каждый последующий тестовый пример никак не использовал результаты работы предыдущего. Для этого необходимо провести установки всех начальных условий перед выполнением каждого тестового примера.

Проблема полноты тестирования

В основном для сложных программ тестирование является неполным, но даже неполное тестирование может выявить большинство ошибок, если выработать грамотную стратегию их поиска. Часто используют метод деления входных значений на области эквивалентности, так чтобы внутри каждой области для всех значений программа «вела себя» похоже. Тогда при написании тестовых примеров рассматриваются все значения на границах областей и по одному произвольному значению из каждой области (области определяются для каждого входного параметра).

Тестирование. Метод «черного ящика»

При тестировании «черного ящика» удобно использовать методы трех, пяти или семи точек. При тестировании по требованиям используется понятие «покрытие» требований тестами. Тест покрывает требования, если он полностью проверяет выполнение каждого отдельного требования. При этом возможны как случаи, когда для проверки одного требования необходимо несколько тестовых примеров, так и случаи, когда достаточно одного тестового примера для проверки нескольких требований.

Рассмотрим, например, следующее требование к функции умножения двух целых чисел.

Тесты для проверки значений из диапазона могут выглядеть, например, следующим образом.

Таблица 1. Часть тест-плана
Входы Действия Ожидаемый выход
Множитель 1 Множитель 2
15 15 Вызов функции 225
15 700 Вызов функции 10500
15 1500 Вызов функции 22500
700 15 Вызов функции 10500
700 700 Вызов функции 490000
700 1500 Вызов функции 1050000
1500 15 Вызов функции 22500
1500 700 Вызов функции 1050000
1500 1500 Вызов функции 2250000
14 14 Вызов функции 0
1501 14 Вызов функции 0
14 1501 Вызов функции 0
14 700 Вызов функции 0
700 14 Вызов функции 0
1501 700 Вызов функции 0
700 1501 Вызов функции 0

Для проверки поведения функции за границами диапазона стоит проверить, например, значения 14 и 1501 для каждого входа.

Необходимо отметить, что не всегда можно покрыть все требования по тем же причинам, по которым невозможно добиться полноты тестирования, поэтому не всегда возможно доказать правильность работы программы. Кроме того, некоторые требования могут быть так сформулированы, что их нельзя протестировать. Например, требования могут касаться алгоритмов работы (а алгоритмы не видны при тестировании «черного ящика») или каких-нибудь внутренних переменных, не доступных извне. Некоторые требования вообще могут оказаться некорректными при тестировании, хотя могли быть интуитивно понятны при разработке, например требование «программа должна иметь дружественный интерфейс» протестировать невозможно. Для исключения таких ситуаций необходимо уже на этапе составления требований формулировать их как можно более конкретно и однозначно.

Метод тестирования «черного ящика» выявляет все несоответствия между требованиями к ПО и поведением самого ПО.

Тестирование. Метод «белого ящика»

Например, для написанного ниже фрагмента программы, где A, B и C рассматриваются как входные значения:

Достаточно одного тестового примера (ТП1: A=1, B=2, C=3). В этом случае выполнятся все операторы. Но если программист допустил ошибку и неверно написал условие, например так:

То тогда код будет работать неверно (переменной X всегда будет присваиваться значение 5), хотя показанный выше тестовый пример приведет к выполнению всех операторов и не выявит ошибки.

Покрытие по условиям требует проверок всех условий на TRUE/FALSE, т. е. каждое условие в ходе тестирования должно проверяться на оба возможных значения. Для покрытия по условиям приведенного примера кода необходимо уже два тестовых примера:

Эти тестовые примеры позволяют найти ошибку.

Не все блоки кода всегда удается покрыть тестами. Это может быть связано с защитным программированием (когда входные значения функции проверяются на корректность, но передаются ей только корректные данные, так как передающая функция тоже проверяет их корректность); операторами выхода (закрывающая скобка «>» после оператора exit); мертвым кодом (код, который заведомо никогда не выполняется).

Проверка таких блоков кода и анализ их «безопасности» может происходить без выполнения самого кода, в этом случае группа экспертов читает и анализирует программный код, делая выводы о существовании или несуществовании ошибок. Результаты подобного анализа могут установить причины появления непокрытого кода.

Заглушки

В таких ситуациях реальная функция getTemperature заменяется новой функцией, которая разрабатывается специально для конкретного (конкретных) тестового примера, и выполняет только то, что необходимо для теста, возвращая нужное значение. Т. е. в данном примере функция getTemperature заменяется на функцию, которая не будет опрашивать датчик, а сразу вернет значение 20. Функции или программы, которыми заменяются используемые при тестировании SUT функции и программы, называют заглушками.

Стоит отметить, что если SUT использует какие-либо функции, которые не заменяются заглушками в ходе тестирования, то такие функции также должны быть предварительно протестированы. Это приводит к так называемому «восходящему» тестированию. Что, в свою очередь, предполагает такую же последовательность реализации модулей системы. Чаще как раз подобные getTemperature процедуры реализуются в последний момент, так как зависят от периферийного оборудования, которое не изготавливается, а закупается или характеристики которого специально подгоняются под условия эксплуатации системы. В этих случаях написание моделей (заглушек) программ неизбежно.

Процесс тестирования

Как уже говорилось, тест состоит из набора тестовых примеров. Перед написанием теста необходимо подготовить сценарий каждого тестового примера. Такие сценарии описываются в тест-плане. Тест-план представляет собой документ, последовательно определяющий всю совокупность тест-примеров с указанием конкретных значений всех входных данных, действий, а также ожидаемых значений выход-ных данных (см. выше про то, что включает в себя тестовый пример).

В тест-плане отражается основная логика тестирования, а сам тест (набор тестовых примеров) является реализацией тест-плана. Вполне возможно построить универсальный тест-драйвер, который будет использовать в качестве входных данных тест-план, создавать на его основе все необходимые условия для каждого тестового примера и выполнять заданные сценарии, сравнивая реальные выходные значения с ожидаемыми. Этот подход часто применяется для автоматизации процесса тестирования.

Если в тест-плане для каждого тестового примера указываются ссылки на тестируемые им требования, то можно говорить о трассировке или о соответствии тестового примера тест-плана требованию. Аналогично при кодировании теста для каждого тест-примера удобно указывать ссылку на номер его описания в тест-плане.

Такая трассировка позволит при выявлении ошибки каким-либо тестовым примером определить, перейдя к тест-плану, при каких условиях проявилась ошибка, и далее, перейдя к требованиям, выяснить, какие требования нарушены. Так как в ходе разработки документация может меняться, то при трассировке необходимо сохранять соответствие версий трассируемых документов. Это, в свою очередь, позво-ляет определять область влияния внесенных изменений, например определить, какие тесты должны быть модифицированы или перепроверены при изменении части требований к системе.

Результатом выполнения теста является отчет о прогоне теста, в котором отражается, сколько всего было выполнено тестовых примеров, сколько ошибок найдено, какие тестовые примеры выявили ошибки. Удобно помещать в отчет о прогоне теста ожидаемые и ре-альные значения всех выходных данных после выполнения каждого тестового примера, чтобы в случае выявления ошибки можно было их сравнить.

Пример верификации

Третий этап работы

Тестирование программной реализации

Соображения

Общие требования к тест-плану состоят в определении входных воздействий на программу достаточных для контроля всех требований по проверке функций программной реализации как «черного ящика» (полнота покрытия требований). Дополнительно желательно определить входные воздействия, обеспечивающие выполнение всех ветвей программной реализации (программа проверяется как «белый ящик»). Часто удобно представлять тест-план в виде таблицы.

Выводы

Далее приведен неполный пример тест-плана (табл. 2).

Замечание

Приведенный выше тест-план не проверяет (явно) вывод предупреждающего сообщения о вводе новой строки. Такое требование не было явно определено в разделе 4. Это недоработка требований по проверке функций программной реализации. Хороший тестировщик должен сам включить подобную проверку в свой тест-план. Дополнительные пункты плана явно зависят от конкретного программного кода и поэтому не приведены в данном примере.

Исправляем ошибку «Код события 1000» в Windows

Некоторые пользователи наталкиваются на ошибку «Код события 1000» в системном приложении «Просмотр событий». Данный код означает, что приложение внезапно завершило свою работу по неизвестной причине. Помимо кода ошибки, пользователю предоставляется директория к исполнительному файлу приложения, которое вылетело.

Причины ошибки «Код события 1000»

Причин для подобной ошибки может быть действительно множество, но мы все же смогли составить список наиболее из наиболее вероятных.

Методы решения «Код события 1000»

Метод №1 Сканирование программой SFC

Для начала мы рекомендуем попробовать провести сканирование такой системной утилитой, как System File Checker. Если у вас в системе действительно есть поврежденные файлы или модули, то данная программа поможет найти их и восстановить. Чтобы запустить ее, сделайте следующее:

Вам придется подождать некоторое время между выполнением команд, но если в вашей Windows действительно присутствовали какие-то поврежденные файлы, то этот метод должен был помочь. Перезагрузите компьютер и снова загляните в «Просмотр событий». Возможно, «Код события 1000» перестала появляться.

Метод №2 Удаление конкретного приложения

Также вы можете попробовать удалить или же заменить приложение, которое вызывает данную проблему. Как правило, вы должны сразу же понять, какое именно приложение виновно, проверив лог, т. е. там же, где вы нашли «Код события 1000». Если у вас получилось определить нужное приложение, то вы можете удалить его со своего компьютера следующим образом:

Метод №3 Выполнение чистой загрузки

Если вы не смогли обнаружить нужное приложение в «Просмотре событий», то можно воспользоваться иным, несколько более сложным методом, который поможет определить виновника. Метод этот имеет название «чистая загрузка». Выполняется подобная загрузка следующим образом:

Теперь вам нужно проверить, пропал ли «Код события 1000». Если да, то одна из программ/служб была виновна в проблеме. Активируйте поочередно все отключенные элементы и проверяйте, когда появится ошибка.

Метод №4 Обновление Windows до последнего билда

Если никакой из вышеперечисленных методов не смог помочь с вашей проблемой, то пора попробовать просто обновить свою операционную систему. Отсутствие тех или иных обновлений для Windows может вызывать разнообразные ошибки. Вот что вам нужно сделать:

Мы надеемся, что хотя бы какой-то из четырех представленных здесь методов смог помочь вам в решении проблемы с «Код события 1000».

Источники:

Https://webnvpks. github. io/files/vnedrenie_i_podderzhka_kompyuternyh_sistem/lectures/osnovnye_metody_vnedreniya_i_analiza_funkcionirovaniya_programmnogo_obespecheniya7.html

Https://gamesqa. ru/kompyutery/kod-sobytiya-1000-13969/

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: