Показаны сообщения с ярлыком Call Tree. Показать все сообщения
Показаны сообщения с ярлыком Call Tree. Показать все сообщения

пятница, 23 августа 2019 г.

Перегрузки

После прочтения статьи "Как спроектировать нагрузочный тест" Кристины Джеквони (Kristin Jackvony) в переводе Ольги Алифановой возникли нижеследующие дополнения.
* Для тестирования нагрузки базы в первую очередь обращаюсь к Explain Plan.
* Далее смотрим на наличие полезных индексов. Очень познавательный рассказ про индексирование есть в "Вся правда об индексах в PostgreSQL" от Олега Бартунова и Александра Короткова.
* Не менее важно использование кэширования. А в области данных вам в помощь станут CRUD матрицы.
* Если можете проверять белый ящик, то обращайте внимание на отсутствие излишних перерисовок интерфейса (Flowchart и Call Tree диаграммы покажут зацикленность и бесполезные повторы).

пятница, 19 октября 2018 г.

Cheat sheet for Oracle Table

Тест таблицы делится на две части: структура и использование.
Если имеется ТЗ, то структуру можно всего лишь сравнить с ним. Иначе, придётся подключить знания DDL, оценить связанные таблицы и построенные индексы.
Данные в базе Oracle можно редактировать тремя способами: вручную (SQL*Plus, SQL Developer, или ином приложении типа TOAD и SQLDetective), автоматически через триггеры этой таблицы, механически через хранимые подпрограммы и элементы приложения типа Oracle Forms.
Из этого списка формируется и чек-лист по версиям Oracle DB в разрезе DDL, DML и PL/SQL. Сочетание структуры таблицы и её использование в триггерах и хранимых процедурах удобно проверять через Call Tree и ERD диаграммы, CRUD матрицы. Можете воспользоваться утилитами ClearSQL (аудитор кода PL/SQL) и ClearDB (аудитор базы Oracle).
Когда CRUD матрица даст вам список связанных таблиц и хранимых процедур, то чек-лист расширится типами хранимых подпрограмм: standalone procedure, standalone function, package procedure, package function, type object, type procedure, type function, job/sched.job/sched.program. Call Tree диаграммы дадут список триггеров и синонимов, особенно полезных для выявления мутаций данных. 
К функциональной части тестирования относится Explain Plan, применённый ко всем DML командам в хранимых подпрограммах, триггерах и модулях приложения.
Безопасность проверяется по привилегиям на таблицу и её части.
В негативные тесты включите команду truncate.

понедельник, 18 июня 2018 г.

Easy "white-box" testing

(Смотрите запись https://vimeo.com/226001966  или читайте текст ниже)

Расскажу о лёгкости тестирования "белым ящиком".
Многие уверены, что проверкой кода должен и может заниматься только высокий профессионал, имеющий опыт написания сложных программ и досконально знающий язык программирования. Но вскоре вы поймёте, что эту работу вполне можно дать вчерашнему школьнику со знаниями Информатики и Мат-Анализа.
Надеюсь, вам известно, что основными причинами серьёзных багов являются элементарные опечатки, недоправки копи-пастов и даже отсутствие кода, поэтому предлагаю проводить тестирование «белого ящика» при помощи утилит аудиторов кода:
* даже юниоры убедятся, что проверка сорсника – это не сложно;
* определим полезные визуализаторы и метрики кода;
* в процессе будут подсказки по выбору и использованию утилит.

Неколько примечаний:
- примеры кода написаны на языке PL/SQL Oracle;
- Все умозаключения по применению основаны на собственном опыте;
- Дабы избежать маркетинговых проблем и не поощрять вашу лень при интернет-поиске, никаких конкретных названий продуктов упомянуто не будет. А также советов, как у программиста взять код для теста, это «интимный» вопрос. Даже профи-аудитору код дают после утряски юридических вопросов. Предположим, что сорсник хотя бы на чтение уже в нашем распоряжении;
- Под юнитом/сорсником/подпрограммой/кодом будем иметь ввиду обычный текстовый файл с листингом программы.


Как работают утилиты, которыми пользуются аудиторы кода:
- Сначала Парсер разбивает текст на строки: значимые (сами команды) и вспомогательные (комментарии, пустые строки);
- Потом Лексер по значимым строкам определяет структуру кода: подпрограммы, команды, параметры и тому подобное;
- Визуализатор генерит диаграммы;
- Анализатор высчитывает метрики кода и по этим данным формирует предупреждения о нарушенных правилах кодирования. Списком таких «нарушений» удобно пользоваться при проведении code review, но не всегда утилиты статического анализа имеют подробные расшифровки и рекомендации по устранению ошибок. Поэтому при подборе утилит обращайте внимание на то, есть ли возможность создать свои правила проверки кода и устанавливать иные лимиты на метрики.


Приведу несколько примеров помощи тестировщику от визуализаторов кода.
Самый простой визуализатор, как ни странно, - комментарии. Их игнорируют программисты, оправдываясь правильно-названными компонентами кода, хотя, не все считают обязательным удалять закомментированные строки кода. А поскольку они не являются полезными комментами, то от них надо избавляться, благо есть система контроля версий. При наличии полезных комментов не так опасно потерять СКВ или баг-трекинговую систему (историю задачи можно восстановить по комментариям).
Если к правильным комментариям добавить специальные теги, то получится документор кода или псевдокод. Когда же чистая выборка документора совпадает с текстом аналитика хотя бы по логичности распределения команд в коде, тестировщик может автоматически закрывать чек-лист про покрытие кодом спецификации задачи. А поскольку некоторые утилиты по комментам псевдокода строят блок-схемы, то сравнение с UML диаграммой аналитика даст объём тех-задания, не покрытого кодом, моментально.
Ясное дело, наличие комментов зависит только от программиста, который не очень-то любит писать обычные тексты, но его можно легко уговорить на ведение комментов, если составлять их как план подпрограммы из текста аналитика, а потом к ним дописывать код. Они помогут следующему кодеру разобраться в программе.
При тестрировании через комментарии, юниору не нужны знания синтаксиса языка, и даже более того – по ним можно изучать программирование.
К слову сказать, крупные компании ведут комментарии кода в обязательном порядке и по своим правилам/шаблонам. Когда же StartUp-у захочется сертифицироваться, то код уже придётся документировать.


Вторая группа визуализаторов, полезных тестировщику, показывает ход программы. Это: блок-схемы, Flowchart, UML диаграммы по готовому листингу.
Мощнейшая утилита из портфеля аудитора! По нарисованному коду, даже без знаний синтаксиса языка, сразу видна масса багов или тем на рефакторинг:
- количество блоков всегда можно подсчитать, и в некоторых утилитах выставить лимит. Если диаграмма большая, то сорсник длинный. А «лапша» всегда была поводом для оптимизации кода;
- находите дубликаты блоков через поиск текста в блоках и подсветку путей, чтобы проверить их на проблемы после копи-паста (недоредактированный код), либо оформить внутреннюю задачу для рефакторинга по выносу повторений в отдельную функцию (повторяющиеся блоки - причина будущих опечаток и недоправок, а унифицированные функции ускоряют правки и переделки);
- сворачиваемость блоков и подсветка определённых путей ("Да", "Нет", "Исключение") более чётко покажут недостаточно обработанные условия и отсутствие кода. А когда фича не дописана, то тестировщику нет смысла тратить время на проверку пустот (сразу возвращайте на доработку);
- мёртвый код ищется два месяца «чёрным ящиком», а при использовании flowchart определяется за пару минут путём сравнения с диаграммой или текстом от аналитика;
- кликабельность из блоков в строки кода помогает обнаружить замедления, которые бывают от наличия комментариев или обращений к базе внутри цикла (обычно в схеме flowchart не показывается текст комментариев, поэтому их наличие придётся выявлять в самом коде, а визуализацию циклов легче определить по диаграмме);
- глазастые заметят в примере переменные без присвоенного значения или неочищенные в конце (проблем от некорректного обращения с переменными множество - от переполнения буфера и до некорректного расчёта и передачи в другие модули).
Утилиту для построения блок-схем чаще других можно найти в среде разработки программиста. Также много аналогов в свободном доступе.


Третья группа визуализаторов – демонстрирует вызовы одних подпрограмм другими и показывает связи объектов данных с кодом. Их называют обычно Call Tree, References&Dependencies диаграммы (направления стрелок показывают вызовы объектов) и CRUD матрица (Create/Read/Update/Delete операции над данными из подпрограмм).
Сорсники и таблицы всего проекта попадают без повторений в диаграмму. Поэтому простым поиском по имени выявляйте лишние и недостающие обращения к объектам. Например, в диаграмме о кадрах может быть лишней процедура "tech_proc_2", а в матрице бухгалтерии или финансового отдела часто можно обнаружить нехватку процедур или таблиц с ордерами прихода/расхода (если существует корпаративные стандарты наименований объектов).
Для генерации диаграмм и матриц берите чистый исходный код, не прошедший обфускацию или компиляцию, потому что замена имён не даст нужного результата.
Пользуйтесь детализацией связей, подсветкой вызовов и сменой уровней связей при поиске зацикленных процедур (в примере процедура "tech_proc_2" должна быть проверена на все вызовы процедурами "emp_proc_1" и "emp_proc_3", так как при определённых условиях вполне может случится зацикливание), а также шагов, приводящих к мутации данных (в примере показан триггер "emp_trg" и процедура "emp_proc_3", влияющие на данные в таблице "emp_tbl", а поскольку процедура через несколько шагов может быть выполнена из триггера, то вполне вероятно совместное обращение к одним и тем же данным).
Если формат выходной диаграммы SVG, XML или VDX, то более вероятно воспользоваться всеми полезностями (поиск по диаграмме, подсветка путей, кликабельность из диаграммы в код, сворачиваемость блоков диаграмм).


А теперь немного о метриках кода, то есть о качестве в цифрах. Если визуализаторы более полезны на начальном этапе разработки, то на метрики кода влияют каждые изменения подпрограммы. К сожалению, идеального кода не существует и добиться невозможно, как и КПД-100%. Чем же мы, тестировщики, в состоянии помочь кодеру?
Самая простая метрика - количество строк в сорснике до компиляции. С этим файлом работает программист в среде разработки – правит, отлаживает, компилирует. А большой объём файла совсем не на руку ни компилятору, ни системе контроля версий, ни тем более среде разработки.
Хороший редактор раскрашивает синтаксис, показывает начало-конец цикла и иными способами помогает кодеру, а все эти примочки требуют ресурсов. В один прекрасный день вчерашний код не откроется в среде разработки – и конец всем фиксам.
В СКВ дешевле хранить некоторые маленькие файлы, нежели один и тот же большой дописывать, потому что место на сервере слишком быстро закончится.
Слияние изменений (merge) выполнять в СКВ на мелких отдельных файлах проще, и конфликты случаются реже - как в коде, так и между сотрудниками.
Вторая простая для подсчёта величина – количество параметров (и особенно глобальных), которое рекомендуют не более 7 (5 входящих, 2 на выход). Цифра пришла из чистой психологии - единовременно человек запоминает не более 7 объектов. Для работы с бОльшим количеством параметров придётся взводить хинты-подсказки, требующие ресурсов и времени.


С 70-х годов XX века благодаря T.J.McCabe, Maurice Halstead, и чуть позже Don M Coleman и Paul Oman с Jack Hagemeister стало возможным измерить качество кода и спрогнозировать его развитие. Величины, выведенные этими людьми, стали носить их имена.
Thomas J.McCabe вывел формулу цикломатической сложности юнита как разность рёбер и узлов с добавлением удвоенного количества компонент связности.
При грубой оценке граф цикломатической сложности совпадает с диаграммой flowchart, где стрелки выполняют роль рёбер (на рисунке - зелёные), овалы и многоугольники считаются узлами (на рисунке - красные звёздочки), а целый законченный блок – компонент связности (на рисунке - серым цветом ограничены два графа для примеров кода).
Не для всех случаев граф цикломатической сложности идентичен flowchart, потому что если используется сложное условие (через OR/AND), то каждое из них может считаться узлом (в примере граф для процедуры "threeinone" станет идентичен графу для процедуры "oneinthree").
Максимальное значение величины McCabe утверждено Американским Национальным Институтом Стандартов и Технологий (NAST), равно 10, но последнее время расширяют до 15.
Нам тестировщикам это значение говорит о необходимом количестве юнит-тестов.


Все величины Мариуса Халстеда рассчитываются по операторам и операндам, и поэтому утилита должна быть версионно-зависимой для языка программирования, а лучше встроенной в среду разработки.
Что есть операторы и операнды помним, да? В выражении «a+b»: "+" – оператор, "a" и "b" – операнды.
Не удивляйтесь, если подсчитанные строки в листинге не совпадают с длиной программы по Халстеду, потому что длина программы – это сумма всех операторов и всех операндов.
Словарь юнита он определил как сумму уникальных операторов и операндов.
А помножив длину программы на логарифм словаря, Халстед получил объём подпрограммы (или ещё эту величину называют "сложностью Халстеда"). Она максимально не должна превышать 1000 (лимит не утверждён никаким стандартом).
Если же исследовать функцию сложности, приняв уникальными все операнды и операторы, то в самом сложном юните должно быть примерно – 45 операторов и 90 операндов, как это видно на графике. Фактически - это невообразимая программка.


Maintainability Index перевожу для себя не как ремонтопригодность, а как «важность и устойчивость», потому что он  прогнозирует развитие подпрограммы  (сколько ещё можно править или расширять юнит).
Индекс значимости подпрограммы, выведенный Доном Колеманом и Паулем Оманом, дополненный Джеком Хейгмейстером, зависит от всех составляющих листинг: операторов и операндов, блоков и их связей, значимых  и вспомогательных строк кода.
Предел индекса никакими институтами пока не утверждён, но для стабильно-устойчивых подпрограмм рекомендуется писать код так, чтобы индекс был более 85. Когда индекс падает ниже 65, то ваш юнит совсем плох.
Если поисследовать функцию, рассчитывающую индекс, то при максимальных величинах Халстеда, МакКейба и комментов в одном юните - не стоит делать более 1500 строк. Это видно на среднем графике.
Формула имеет две модели: с учётом комментариев (обе строки формулы:" MI = 171 - 5.2*ln(HV) - 0.23*CC - 16.2*ln(LOC) + 50*sin(sqrt(2.4*COM)) ") и без учёта комментариев (только первая строка: " MI = 171 - 5.2*ln(HV) - 0.23*CC - 16.2*ln(LOC) "). Поскольку величина комментариев зависит от функции синуса, то при отношении объёма комментов к строкам кода в процентах, синусоида сложно извивается на отрезке от 0 до 100 (левый график показывает несколько вариантов подбора - максимумы). Если же брать долевое исчисление комментов - от 0 до 1 (правый график), то 3/10 комментированных строк дадут максимум полезности. Юнит должен быть легко-читаемым. И даже цифры подтверждают, что нет смысла экономить за счёт комментариев: "+50 всегда лучше трёх минусов для стремящихся к 85 и выше".


В таблице-шпаргалке перечислены формулы для исчисления качества кода. Особым шрифтом выделены две формулы для прогноза количества багов (вывел Халстед).


При использовании аудита кода, как части среды разработки, никаких дополнительных вложений от вас не потребуется: ни в обучение, ни в покупку, ни в дальнейшую поддержку утилит, как это приходится делать с юнит-тестами.
Если результаты юнит-тестов дают понимание о том, «каков код здесь и сейчас», то аудит говорит о перспективах развития подпрограммы.
Code Audit - для комплексного тестирования всего проекта, Unit testing – для точечного.
Одно другим подменить невозможно, но совместное использование только улучшит качество конечного продукта.
Мечтающие взлететь в bug-bounty, воспользуйтесь тем, что завалялось у вашего программиста, а именно утилитами аудиторов кода, вшитые в среду разработки.

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

понедельник, 11 июня 2018 г.

Call Tree диаграммы в ClearSQL

Подсказки по работе с Call Tree диаграммами в приложении ClearSQL (https://www.sqldev.tech/clearsql)

1. Для любых скриптов проекта, имеющих в коде вызовы объектов базы данных Oracle, ClearSQL генерит диаграммы Call Tree. Главный объект диаграммы выделен цветом по значению опции "main menu / Options / Code Analyzer Options / Diagram Options / Call Tree / Call Tree Colors / Selected subroutine". Объекты в диаграмме сгруппированы по владельцу и опционально по "родительскому" (подпрограммы пакета или объектного типа). Группировка утяжеляет генерацию диаграмм. Объекты по имени и владельцу попадают в диаграммы уникально для всего проекта. На перегенерацию при анализе скрипта не влияют некоторые локальные опции диаграммы, если включена "main menu Options / Preferences / Project Analysis / Carts, Diagrams and Matrices / Keep diagram local settings"? но их смена применяется при перерисовке диаграммы в самом окне диаграммы по кнопке Redraw.

2. Существует два окна с диаграммами Call Tree в интерфейсе – уровень проекта (закладка All Call Trees) и уровня скрипта (закладка Script: Editor and Analyzer Info / Call Trees). В отчёт эти диаграммы попадают "as is" в зависимости от опций интерфейса и отчёта "main menu / Tools / Project Report Assistant". Обе закладки состоят из двух частей – дерево диаграмм и окно просмотра выбранных в дереве диаграмм. Выбор объектов в дереве диаграмм автоматически подсвечивает скрипты в дереве проекта с основным объектом диаграммы.

3. Примечания к титрам видеоролика (https://www.youtube.com/watch?v=7qsJYZQKVbo):

* 3 сек "Call Trees in ClearSQL" - название продукта неполноценно отформатировано (часть Clear должна быть italic-format = ClearSQL);

* 12 сек "Purpose ClearSQL draws subroutine calls and called-by path of PL/SQL code in call tree diagrams." – уровень вложенности вызовов настраивается в "main menu / Options / Code Analyzer Options / Diagram Options / Call Tree / Call Tree Appearance / Call level", по-умолчанию равен 3 в обе стороны. Подписи обращений к объектам данных показаны по-умолчанию опцией "main menu / Options / Code Analyzer Options / Diagram Options / Call Tree / Call Tree Appearance / Show data flow labels";

* 26 сек "Statements  Data flows show how subroutines get data from data objects (table, view) with SELECT statement, and how they put data back with INSERT or UPDATE statements, delete data with DELETE statements." – суб-команды из выражения MERGE тоже попадают в схему как самостоятельные связки, но никакие команды не попадают в диаграмму из строкового значения какой-либо переменной кода и из EXECUTE IMMEDIATE;

* 40 сек "Clicking call tree blocks locates subroutine in the Code Editor, so you have the source code at hand." – навигация из диаграммы в текст кода работает в одностороннем порядке, т.е. из кода в диаграммы навигации не существует, но из дерева диаграмм автоматически подсвечиваются срипты в дереве проекта;

* 45 сек "For example, clicking the CREATETRN function opens the DNTS1 package, where you can see from where the INSERT INTO transactions table flows." – на закладке All Call Trees для демо проекта откройте дерево диаграмм до ноды "Dataset Objects / TRANSACTIONS", при этом в дереве проекта позиционируется скрипт "Package Body.sql", по клику в диаграмме на блоке "CREATETRN" активный курсор из закладки All Call Trees перейдёт в окно "Script: Editor and Analyzer Info / Code Editor" и подсветит первую строку подпрограммы "CreateTRN", в которой имеется первый из вызовов объекта "TRANSACTIONS". Поскольку один и тот же объект в скрипте может вызываться в нескольких местах, то локатор из Call Tree диаграммы в код находится в стадии доработки и частично реализован в ClearDB Documenter (http://www.conquestsoftwaresolutions.com/page/cleardb_screen_shots  - Docu | PL/SQL code in diagrams — Slide 2/4: Call Trees), или например в доке (http://www.conquestsoftwaresolutions.com:8082/docus/), из пакета "HR.DBG_DEMO.PROC1" вызывается процедура "HR.DBG_DEMO.PROC2" и её упоминание в пакете есть на 47 и 55 строках тела пакета;

* 1 мин 3 сек "Clicking the MAKETRANS procedure will help you identify the SELECT statement FROM this table." – следует читать как " Clicking the MAKETRANS block in diagram navigates you to the SELECT statement for this table in code text.";

* 1 мин 15 сек "Legend The diagram legend won't let you forget what all these colorful arrows & boxes mean." – цвета блоков по типам объектов совпадают с настройками, если диаграмма генерилась с включенной группировкой, иначе – блоки вызываемых и вызывающих объектов покрашены в красный и терракотовый цвета, для которых не существует юзерских настроек;

* 1 мин 24 сек "Flexible GUI  Zoom out a complex diagram net to see the overall picture or magnify its separate parts to see the details closer." – зуммер и лупа доступны не только в Call Tree, но и в Flowchart диаграммах. Осторожно: кнопки "Zoom diagram" и "Magnifier" никак не синхронизированы с встроенным списком в нижнем правом углу процентного просмотра html-вьювера. При регенерации диаграмм зуммер сбрасывается в дефолт – 100%;

* 1 мин 37 сек "Flexible GUI  For better usability, turn on the Highlight Elements feature to see the separate data flows and not to get lost in the maize of lines & blocks. Note: Highlight is available in SVG format only!" – формат диаграмм SVG является дефолтным, но сменить можно в "main menu / Options / Code Analyzer Options / Diagram Options / Output Diagram Format" перед генерацией.