Динамический анализ кода - это способ анализа программы непосредственно при ее выполнении. Процесс динамического анализа можно разбить на несколько этапов - подготовка исходных данных, проведение тестового запуска программы и сбор необходимых параметров, анализ полученных данных. При тестовом запуске исполнение программы может выполняться как на реальном, так и на виртуальном процессоре. Для этого из исходного кода в обязательном порядке должен быть получен исполняемый файл, то есть нельзя таким способом проанализировать код, содержащий ошибки компиляции или сборки.
Динамический анализ может производиться для программ, написанных на различных языках программирования C, C++, Java, C#, PHP, Python, Erlang и многих других.
Для динамического анализа кода используются специальные утилиты, предназначенные для запуска программы, сбора и анализа полученных данных. Многие современные среды разработки уже содержат в своем составе инструменты для динамического анализа кода, например отладчик и профилировщик в Microsoft Visual Studio 2012.
Программы для динамического анализа различаются по способу взаимодействия с проверяемой программой:
Динамический анализ выполняется с помощью набора данных, которые подаются на вход исследуемой программе. Поэтому эффективность анализа напрямую зависит от качества и количества входных данных для тестирования. Именно от них зависит полнота покрытия кода, которая будет получена по результатам тестирования.
С помощью динамического тестирования могут быть получены следующие метрики:
Динамическое тестирование наиболее важно в тех областях, где главным критерием является надежность программы, время отклика или потребляемые ресурсы. Это может быть, например, система реального времени, управляющая ответственным участком производства, или сервер базы данных. В таких областях любая допущенная ошибка может оказаться критической.
Тестирование может производиться по принципу белого или чёрного ящика. Их отличие только в том, что "белый ящик" — имеются данные о программном коде, а "черный ящик" - нет. Так же есть так называемый метод "серого ящика", когда известна структура программы, но в самом тестировании эти данные не используются.
Также при динамическом тестировании требуется позаботиться о минимальном воздействии инструментирования на исполнение тестируемой программы (временные характеристики, потребляемые ресурсы или программные ошибки).
Динамическое тестирование позволяет убедиться, что продукт работает хорошо или выявляет ошибки, показывая, что программа не работает. Вторая цель тестирования является более продуктивной с точки зрения улучшения качества, так как не позволяет игнорировать недостатки программы. Однако если в ходе тестирования не было выявлено дефектов, то это не значит, что их нет совсем. Даже 100% покрытие кода тестами не означает, что в программе нет ошибок, поскольку динамическое тестирование не может выявить логических ошибок. Так же немаловажным аспектом является то, насколько сами утилиты для тестирования не содержат ошибок.
Отдельной задачей, для которой могут использоваться сторонние утилиты - создание входных тестовых данных. Ряд утилит использует такую методику - помечает исходные данные и отслеживает их продвижение при выполнении программы. На следующей итерации запуска тестов утилитой будут сгенерирован новый набор входных параметров и так далее, до достижения требуемого результата.
Таким образом, динамический анализ имеет как слабые, так и сильные стороны.
Достоинства динамического анализа кода:
Недостатки динамического анализа кода:
Имея свои сильные и слабые стороны, динамический анализ наиболее эффективно может быть использован вместе со статическим анализом кода.
0