Частные PoA сети на базе Parity Ethereum — часть 4: тестирование смарт-контракта CRUD приложения
04 июля, 2019
Предыдущие части
Частные PoA сети на базе Parity Ethereum — часть 3: смарт-контракт CRUD приложения
Частные PoA сети на базе Parity Ethereum — часть 2: настройка и запуск
Частные PoA сети на базе Parity Ethereum — часть 1: общие тезисы и особенности установки
Для смарт-контракта CRUD приложения был разработан набор тестов, полностью покрывающий исходный код смарта-контракта в части функций (методов). В тестах отражена специфика данных, характерных для веб-приложений. Набор тестов может быть представлен в виде двух сущностей: собственно набора модульных тестов для множества методов смарт-контракта CRUD приложения и нагрузочного теста, выполняющего сохранение в blockchain текстовых данных различного объема. В качестве текстовых данных используется выборка реального веб-содержимого с функционирующих в интернете сайтов.
В модульные тесты смарт-контракта CRUD приложения входят:
pheix_db_init_drop.js
— итеративный тест, в котором на каждой итерации выполняется методinit()
, а затемdrop()
; результаты контролируются методамиcont_tables()
иtable_exists()
;pheix_db_insert_select_set.js
— в тесте создается типовая таблица (прототипом является таблица учета посещений веб-сайта, в которой сохраняются IP-адрес посетителя, referrer, разрешение экрана, данные о браузере, url посещенной страницы и гео-данные посетителя) с помощью методаnew_table()
, заполняется случайными значениями (в тесте предопределены массивы с реальными данными для каждого столбца) с помощью методаinsert()
, выполняется проверка корректности данных в blockchain с помощью методаselect()
и перезаписывается новыми данными с помощью методаset()
;pheix_db_remove.js
— в тесте создается типовая таблица, заполняется данными и выполняется удаление случайных строк с помощью методаremove()
; корректность оставшихся в таблице данных проверяется с помощью методаselect()
;pheix_db_select_all.js
— тест реализует выборку всех данных из таблицы;pheix_db_heavy_test.js
— итеративный тест, в котором на каждой итерации выполняется создание нескольких таблицы, заполнение таблиц данными, удаление данных и проверка оставшихся в таблице данных.
Файлы данных и сценарии нагрузочного теста располагаются в каталоге t/pheix_database/txt
:
convert-to-js.sh
— bash сценарий, генерирующий общий js-файл (datasets.js
) со всеми текстовыми данными из каталоговt/pheix_database/set_0*
в виде массива строк;lzw.js
- реализация алгоритма Лемпеля-Зива-Велча (Lempel-Ziv-Welch) для сжатия текстовых данных перед сохранением в blockchain;dataset-deploy.js
— собственно сценарий нагрузочного теста.
Нагрузочный тест может быть дополнительно сконфигурирован с помощью глобальных переменных, для этого в консоле geth
следует просто объявить переменную, например var VAL=1;
Перечень конфигурационных переменных для нагрузочного теста:
_TAB_S
— номер таблицы, с которой следует начать тестирование;_TAB_E
— номер таблицы, на которое следует закончить тестирование;_GAS_CAP
— увеличение газа на транзакцию в процентах от величины, измеренной функциейestimateGas()
.
Переменные _TAB_S
и _TAB_E
необходимы для выполнения теста на заданных таблицах (множестве таблиц), без необходимости выполнения теста целиком.
В процессе тестирования в частной сети из двух удаленных узлов выяснилась следующая занимательная особенность: часть транзакций завершались с ошибкой “Out of gas”. При этом количество газа рассчитывалось функцией estimateGas()
перед выполнением транзакции. При запуске теста в локальной сети все транзакции проходили успешно. Оказалось, что если увеличить количество газа хотя бы на 1% от измеренного функцией estimateGas()
, то ошибки уходят. Для задания величины увеличения газа в процентах используется переменная _GAS_CAP
. По умолчанию газ увеличивается на 10%.
Для оптимизации объемов blockchain хранилища выполняется предварительное сжатие текстовых данных с помощью алгоритма LZW (Лемпеля-Зива-Велча). Предварительное сжатие экономит до 40% объема хранилища на текстовых данных более 10кБ.
Запуск модульных тестов выполняется из консоли geth
с помощью команды loadScript("/sс/t/pheix_database/<сценарий_модульного_теста>");
последовательность запуска модульных тестов не принципиальна.
Для запуска нагрузочного теста необходимо:
- Сгенерировать с помощью bash сценария
convert-to-js.sh
файлdatasets.js
с текстовыми данными из каталоговt/pheix_database/set_0*
в виде массива строк; - Установить конфигурационные переменные (по-умолчанию тест выполняется для всех таблиц, газ увеличивается на 10%:
var _GAS_CAP=10;
) - Выполнить загрузку текстовых данных в оперативную память командой
loadScript("/sс/t/pheix_database/txt/datasets.js");
- Инициализировать объект, предоставляющий функции компрессии/декомпрессии алгоритма LZW, командой
loadScript("/sс/t/pheix_database/txt/lzw.js");
(если нет необходимости в сжатии данных, то это шаг следует пропустить); - Выполнить нагрузочный текст в
geth
консоли с помощью командыloadScript("/sс/t/pheix_database/txt/dataset-deploy.js");