По способу генерации информации по способу генерации информации

Иерархия информационных уровней

Рецепция и генерация информации

Рецепция информациивыбор, продиктованный свыше, т.е. по указанию кого- либо или чего — либо. Иными словами, речь идет о выборе, сделанном на основании информации, которую данный человек (или система) принимает (название происходит от recept — принимать). На языке теории динамических систем рецепция информации означает перевод системы в одно определенное состояние независимо от того, в каком состоянии она находилась раньше. В современных технических устройствах рецепция, как правило, осуществляется с помощью электрического или светового импульсов. Во всех случаях энергия импульса должна быть больше барьера между состояниями.

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

Сперва приведем пример. Учась говорить, ребенок рецептирует информацию об языке от своего окружения, преимущественно от родителей. Овладев языком и грамотностью, молодой человек оказывается перед выбором свой будущей специальности. Сделав свой выбор и овладев специальностью, человек в дальнейшем может неоднократно выбирать, в каком направлении приложить усилия. При этом новые выборы возможны только на основе прежних, более ранних, так как делаются человеком, владеющим не только языком, но и специальностью. Каждый выбор делается либо случайно, либо под влиянием внешних событий, которые часто, на первый взгляд, не относятся к делу. Ценная информация, которой мы пользуемся повседневно и которую порой генерируем, принадлежит верхнему уровню. Для ее восприятия или генерации необходимо владеть языком (хотя бы одним) и знаниями (например, математикой, информатикой и т.д., в зависимости от профессии), т.е. обладать тезаурусом.
Каждый раз выбор делается с целью, которая ставится в данный момент, она и определяет ценность информации. Однако, все промежуточные, сиюминутные цели подчинены одной главной цели. Какова она? Иными словами, какова цель жизни и в чем счастье? Этим вопросам посвящены тома художественной и философской литературы. Мы тоже обсудим их, но позже, когда речь пойдет о возникновении жизни и появлению у живых существ способности к целеполаганию.

Возвращаясь к вопросу об иерархии информаций, отметим, что тезаурус — информация, содержащаяся в системе на данном уровне, необходимая для рецепции (или генерации) информации на следующем уровне. Поясним сказанное на языке теории динамических систем. При этом придется использовать понятия и термины, смысл которых будет пояснен в следующей главе. Тем не менее. считаем это целесообразным ради слитности изложения. В развивающейся системе необходимость выбора возникает, когда она приходит в неустойчивое состояние, т.е. находится в точке бифуркации (для определенности будем считать эту бифуркацию I-тым уровнем). Выбор делается из множества различных вариантов, мощность и характер которого определяется типом бифуркации. В простейшем случае выбор делается из двух вариантов. После сделанного выбора система развивается устойчиво вплоть до следующей бифуркации. Здесь снова делается выбор, но уже из другого множества вариантов (II-ой уровень). Это множество зависит от результата первого выбора. Если система в своем развитии ещё не дошла до первого этапа. то вопрос о выборе варианта на втором этапе вообще теряет смысл. Иными словами, информация первого уровня является тезаурусом для второго и всех последующих уровней. Отсюда ясно, какую роль играет тезаурус в процессе генерации ценной информации. Без него отсутствует множество, из которого надлежит сделать выбор. Выбор из любого другого множества будет иметь нулевую ценность. Несколько сложнее обстоит дело в случае рецепции информации. В простейшем случае информация, поступающая извне, определена на том же множестве вариантов, из которого делается выбор. Именно так обстоит дело в упомянутом выше примере рецепции языка от родителей. Необходимый для этого тезаурус у ребенка присутствует от рождения. На более высоких уровнях информация, поступающая со стороны, имеет отношение ко всем уровням, а не к данному. Тезаурус необходим для того, чтобы выделить из неё ценную информацию, относящуюся к данному уровню. Для иллюстрации этого приведем пример, (заимствован у Ю.М. Шрейдера, цитируется по [31]). «Имеется второй том «Курса высшей математики» В.И.Смирнова. Эта книга содержит богатую информацию. Какова ее ценность? В ответ приходится спросить — для кого? Для дошкольника ценность этой информации нулевая, так как он не обладает достаточной подготовкой, достаточным уровнем рецепции и не в состоянии эту информацию воспринять. Для профессора математики ценность тоже нулевая, так как он все это хорошо знает. Максимальной ценностью эта информация обладает для студентов того курса, которым книга предназначена, — поскольку речь идет об очень хорошем учебнике». В этом примере множество, на котором сформулирован курс высшей математики, к уровню дошкольника не относится, поскольку он ещё не дорос до этого. Что касается профессора, то в примере Шрейдера он знает всё, и никаких целей перед собой уже не ставит. Поэтому любая информация, в том числе и учебник Смирнова, имеет для него нулевую ценность. Особого внимания заслуживает ситуация, когда множество вариантов на следующем уровне ещё не сформировано, хотя цель уже поставлена. Именно так обстоит дело, когда речь идет об исследовании и описании нового явления. Тогда поступающая извне информация не помогает сделать выбор (поскольку выбирать ещё не из чего), но может помочь сформировать нужное множество. В упомянутом примере этому соответствует четвертый участник — ученый. В отличие от первых трех (дошкольник, студент, профессор), он не только знает учебник, но и может ставить вопросы, ответы на которые в учебниках отсутствуют. Из разговоров с коллегами и чтения книг ученый получает большое количество посторонней информации, которая относится к другим задачам. При достаточном тезаурусе ученый может рецептировать эту информацию, переработать её и сформулировать нужное множество, содержащее всего два варианта, таких, что выбор одного из них приближает к достижению цели. В науке это называется постановкой вопроса. Когда вопрос поставлен (множество сформулировано), та же посторонняя информация может помочь выбрать вариант, то есть генерировать ценную информацию. Из этого примера видно, что рецепция и генерация информации тесно связаны друг с другом. Позже мы рассмотрим этот вопрос детальнее на примере игры в рулетку.

Читайте также:  Способы замены плоскостей проекций это

Источник

Атака не клонов, или Генерация и анализ тестовых данных для нагрузки. Часть 2

В предыдущей статье я рассказал о подготовке данных для тестирования, что данные лучше генерировать, а не клонировать. Теперь стоит подробно разобрать, как их генерировать. Есть несколько подходов к генерации данных: c SQL, Python, сериализацией. У всех их них есть свои плюсы, минусы и особенности, которые стоит учитывать.

Генерация данных с PostgreSQL

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

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

Функции-обертки с параметрами генерации данных для сценариев, например, функция load_fill_database_change_password для сценария change_password

Эти количества и шаблоны, конечно, беру из методики, которую заранее подготовили. Параметры передаются в функцию, которая уже на основе этих шаблонов готовит данные для конкретного сценария. В ней цикл от 0 до 10000, чтобы делать INSERT INTO, INSERT INTO и различные вычисления.

Параметризируемая функция генерации данных с циклами генерации данных

Подходы для генерации значений

В Postgres SQL можно добиться того, что все данные будут согласованы, идентификаторы высчитаны, а вычисления реализованы на языке SQL или использованы дополнительные расширения.

Но такой подход реализуем:

Цикл генерации значений, где каждое значение зависит от счетчика цикла

Читайте также:  Способы изготовления яблочного вина

Мы бежим в цикле и на основе индекса вычисляем, например, имя и фамилию пользователя 1. У него будет индекс №1. Для индекса №2 используются аналогичные вычисления. Конечно, данные получатся не такими случайными, как в реальной жизни, но они будут корректными.

Я знаю такие подходы:

Число из интервала

Взять остаток от деления на N: это даст число в интервале от 0 до N-1.

Логин пользователя

Или использовать функцию, которая в SQL для Postgres называется format. Там есть шаблонные строки и параметры.

IP-адрес

Можно объединить, например, format и остаток от деления для того, чтобы вычислять IP-адреса в журнал входов в систему или таблицу аудита.

А всего 15 625 000 значений

GUID через md5

Часто идентификаторами или ключами в таблицах являются GUID’ы. Я придумал способ, чтобы вычислить GUID для теста. Например, если нужен GUID в таблицу users для пользователя №175000 для сценария login, то можно взять

число 175000 , превратить его в строку фиксированной длины через lpad

конкатенировать с именем таблицы ‘users’

и конкатенировать с названием теста ‘login’

Взять от результата md5 хэш и привести его к типу uuid. Так мы получим уникальный GUID:

GUID через конкатенацию строк

Я знаю, что на специально подготовленных данных в md5 бывают проблемы — коллизии. Но при использовании имени таблицы, имени теста и номера строки в тесте, у меня за всю практику ни разу коллизий не было. Поэтому я рекомендую вам md5 для генерации предсказуемых, но при этом уникальных GUID. Если сомневаетесь, можете сформировать md5 с префиксами: идентификатор теста замените на другую подстроку и используйте номер вашей записи. Получится GUID для записи 1, например, префикс + 000000000001:

Выбор констант из массива

Можно выбирать данные из массивов:

Предел на размер массива данных — 1 ГБайт, тестировал на массиве в 10 МБайт. Использую 64 КБайт (примерный размер сценария ниже — 64 КБайт):

Выбор констант из справочной таблицы

Или выбирать данные из целых таблиц с помощью SELECT, которые вы загрузили из CSV файла.

Я рассказал про подходы, но я бы не был нагрузочником, если бы не сказал, как эти подходы ускорить.

Ускорение вставки значений

Чтобы ускорить вставку значений не только за счет использования хранимых процедур, а еще за счет оптимального процесса, я рекомендую до генерирования данных сделать еще 4 предварительных шага:

1) Сохранить схему БД в виде файла — вдруг что-то поломается;

2) Отключить индексы запросом для Postgres:

Здесь мы говорим, что нужные индексы у нас теперь (indisready=false) отключены.

3) Отключить триггеры, если они есть:

4) Удалить ключи:

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

5) Сгенерировать данные «хранимками»:

Далее нужно выполнить шаги обратные шагам 4, 3, 2.

5) Создать ключи (ADD CONSTRAINT):

6) Включить триггеры, если мы их отключали:

7) Включить индексы:

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

Читайте также:  Что такое фронтальный способ организации детей

8) Переиндексировать:

Теперь Postgres будет знать о всех новых записях, индексы перестроятся и можно сравнить сохраненную схему, которая была на шаге 1, и схему, которая получилась после того, как мы выполнили все шаги.

9) Сравнить схему до и после.

Но данные можно генерировать не только с Postgres. Иногда нужно генерировать сложные данные, например, списки сотрудников, которые получают зарплату, в виде документа Excel. Тогда мне на помощь приходит Python и проект под названием Pandas.

Генерация данных с Python

Я работал с Pandas и проектом, который раньше назывался Elizabeth, а сейчас Mimesis:

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

В Elizabeth создается случайная персона и для нее можно получить фамилию и имя

В цикле формируется 600000 строк, и чтобы Mimesis сгенерировал русские имена и фамилии, мы в строке 16 задаем персону для русского языка. В классе person у нас появляются все псевдослучайные персональные данные. Если мы возьмем, например, поле surname или name и вставим их в наши поля Pandas, то получим женскую фамилию и женское имя. Несложным алгоритмом можно получить отчество.

Подбираем отца перебором, пока имя отца не будет заканчиваться на к, н, г, з, ф, в, п, р, л, д, ч, с, м, т или б. Для Павла и Льва — особые условия формирования отчества

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

Аналогично генерируются мужские отчества — Иван — «ович».

На Python можно генерировать другие данные, выполнять транслитерацию и генерировать номера.

Генерация имени для пластиковой карты из 23 символов

Ещё Pandas предоставляет удобный интерфейс для того, чтобы удалить дубликаты в одну строку.

Или для того, чтобы массово обновить все поля всех строк, например, сказать, что в этом датасете все родились 25 ноября:

Массовое добавление полей

Я использовал Pandas для того, чтобы не разбираться с форматами Excel, а сохранить готовые данные в CSV или XLS файлы.

Выгрузка в csv

Генерация данных с сериализацией классов

Если вы генерируете данные со стороны API, и эти данные представляют структуры данных сервиса, то переиспользуйте их. Например, вам нужно отправить много JSON файлов в вашу систему. Часто тестировщики соединяют строки и вставляют параметры, чтобы в результате получился валидный JSON. Это плохой путь.

Хороший путь — это пойти к разработчикам или скачать исходники, взять Data Transfer Object, которые уже написаны, версионируются и поддерживаются вместе с вашим сервисом, где есть специальные методы, чтобы только имя заполнить, а все остальное сгенерировать, проверить и рассчитать.

И самое главное — Data Transfer Object в одну строку превращаются в XML-файл или JSON-файл. Вам не нужно для этого делать конкатенацию. Возможно, это будет чуть дольше, но вы сэкономите много времени на отладке.

Промежуточные итоги

генерация данных на SQL — наиболее производительный способ генерации, который работает максимально быстро, если предварительно настроить базу данных на быструю вставку

генерацию данных в формате Excel/CSV удобно делать с Pandas, а для псевдоперсональных данных удобно использовать Mimesis из python

для формирования XML/JSON, при генерации данных через API, сериализация объектов системы дает более стабильный результат, чем формирование XML/JSON через конкатенацию строк

В следующей части я расскажу об анализе данных и логировании запросов PostgreSQL.

Конференция об автоматизации тестирования TestDriven Conf 2022 пройдёт в Москве, 28-29 апреля 2022 года. Если вы хотите выступить на конференции, то до окончания приема заявок осталось 8 дней.

Кроме хардкора об автоматизации и разработки в тестировании, будут и вещи, полезные в обычной работе. Принятые доклады можно посмотреть здесь, а купить билет — здесь.

Источник

Оцените статью
Разные способы