Частные 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");
narkhov.pro