Konstantin Narkhov
Pheix 0.8.96
@condemnedcell
konstantinnarkhov.pro

Частные PoA сети на базе Parity Ethereum — часть 4: тестирование смарт-контракта CRUD приложения

04 июля, 2019


Для смарт-контракта 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");

Blog entries

Check out latest blog entries: most interesting stories about past events & activities.

Quick feedback

Letters and spaces only