JEXL-тесты#

JEXL-тесты используются для автоматизации прикладных проверок в Global ERP. Они позволяют описывать сценарии на JEXL, запускать их из интерфейса или через REST-сервис и анализировать результат по ошибкам, предупреждениям и логу выполнения.

В меню Настройки и сервисы > Сервисы JEXL > JEXL-тесты можно создавать, настраивать и выполнять JEXL-тесты.

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

JEXL-тесты применяются для проверки:

  • создания, изменения и поиска объектов;

  • выполнения бизнес-операций и API-методов;

  • корректности расчетов и бизнес-правил;

  • наличия или отсутствия данных в базе данных;

  • результата выполнения SQL-запросов;

  • работоспособности прикладных сценариев после обновления.

Для проверки результата используются методы tst.assertTrue и tst.shouldBeTrue, для записи информации в лог — tst.info, tst.warning, tst.error и tst.raise.

Подготовка тестирования#

Перед созданием JEXL-теста необходимо определить:

  • проверяемый сценарий;

  • состав шагов;

  • входные данные;

  • ожидаемый результат;

  • глобальные переменные, если они нужны;

  • способ запуска: из интерфейса, через REST-сервис или в составе внешнего сценария.

Если тест создает или изменяет данные, заранее определите порядок очистки или используйте уникальные значения.

Создание и настройка#

При создании JEXL-теста задается план тестирования. План состоит из шагов, которые выполняются последовательно.

Для каждого шага указываются:

  • наименование;

  • текст JEXL-скрипта.

Порядковый номер шага проставляется автоматически.

На вкладке Глобальные переменные можно задать переменные, доступные на любом шаге теста через методы tst.setGlobalVar и tst.getGlobalVar.

Для каждой глобальной переменной указываются:

  • системное имя, уникальное в пределах теста;

  • значение в виде JEXL-скрипта, который выполняется перед стартом теста.

Запуск тестов#

Запуск из интерфейса#

Одиночный JEXL-тест можно выполнить из карточки теста или из списка тестов с помощью операции Выполнить тест.

Для запуска группы тестов используется операция Выполнение всех тестов текущей группы.

Запуск через REST-сервис#

Путь для выполнения одиночного теста:

http://{имя_сервера}/app/sys/rest/ss/pkg/Bts_TestPkg/runSingleTest

Путь для выполнения группы тестов:

http://{имя_сервера}/app/sys/rest/ss/pkg/Bts_TestPkg/runTestForGroup

Тело запроса передается в виде JSON-объекта с ключом name. В значении указывается системное имя теста или группы.

Пример обращения для одиночного теста:

curl -H Database:pgDev -u admin:admin -d {\"name\":\"PRS_PurchReqTest\"} -H "Content-Type: application/json" -X POST http://localhost:8080/app/sys/rest/ss/pkg/Bts_TestPkg/runSingleTest

Пример результата:

{"hasErrors":true,"hasWarnings":false,"countErrors":1,"countWarnings":0,"name":"Тест заявок на закупку услуг"}

Запрос выполнения одиночного теста возвращает:

  • name — имя теста;

  • hasErrors — наличие ошибок;

  • hasWarnings — наличие предупреждений;

  • countErrors — количество ошибок;

  • countWarnings — количество предупреждений.

Пример обращения для группы тестов:

curl -H Database:pgDev -u admin:admin -d {\"name\":\"Test1\"} -H "Content-Type: application/json" -X POST http://localhost:8080/app/sys/rest/ss/pkg/Bts_TestPkg/runTestForGroup

Пример результата:

{"hasErrors":true,"hasWarnings":false,"countErrors":2,"countWarnings":0,"tests":[{"hasErrors":false,"hasWarnings":false,"countErrors":0,"countWarnings":0,"name":"test_ok"},{"hasErrors":true,"hasWarnings":false,"countErrors":1,"countWarnings":0,"name":"test333"},{"hasErrors":true,"hasWarnings":false,"countErrors":1,"countWarnings":0,"name":"test22"}]}

Запрос выполнения группы тестов возвращает:

  • hasErrors — наличие ошибок;

  • hasWarnings — наличие предупреждений;

  • countErrors — количество ошибок;

  • countWarnings — количество предупреждений;

  • tests — результаты выполнения всех тестов группы.

Проверка результата#

Результат JEXL-теста проверяется по статусу выполнения, ошибкам, предупреждениям и сообщениям в логе.

Для остановки теста при невыполненном условии используйте tst.assertTrue. Если нужно зафиксировать ошибку без немедленного прекращения шага, используйте tst.shouldBeTrue, tst.error или другие методы логирования.

Особенности JEXL-тестирования#

Доступные методы#

tst.setVar#

Метод записывает значение в контекст выполнения JEXL-теста. Информация об изменении переменной записывается в лог с типом SETVAR.

Пример:

tst.setVar("param_name", param_value); // param_name - имя параметра, param_value - значение параметра

tst.getVar#

Метод получает из контекста значение параметра по имени.

Пример:

var p = tst.getVar("param_name"); // param_name - имя параметра

tst.setGlobalVar#

Метод записывает значение в глобальные переменные выполнения JEXL-теста. Эти переменные доступны на любом шаге теста.

Информация об изменении переменной записывается в лог с типом SETVAR.

Пример:

tst.setGlobalVar("param_name", param_value); // param_name - имя параметра, param_value - значение параметра

tst.getGlobalVar#

Метод получает значение глобальной переменной по имени.

Пример:

var p = tst.getGlobalVar("param_name"); // param_name - имя параметра

tst.findParentContext#

Метод возвращает контекст предыдущего шага выполнения теста.

Пример:

var parent = tst.findParentContext();
var parentParam = parent.getVar("param_name");

tst.info#

Метод записывает в лог выполнения теста текст с типом INFO.

Пример:

tst.info("Текст с информацией");

tst.warning#

Метод записывает в лог выполнения теста текст с типом WARNING.

Пример:

tst.warning("Текст с предупреждением");

tst.error#

Метод записывает в лог выполнения теста текст с типом ERROR.

Пример:

tst.error("Текст с ошибкой");

tst.raise#

Метод выбрасывает ошибку с переданным текстом и записывает ее в лог с типом ERROR.

Пример:

tst.raise("Текст с ошибкой");

tst.assertTrue#

Метод проверяет, что условие истинно. Если условие ложно, выполнение теста прекращается, а в лог записывается ошибка.

Если выполняется группа тестов и проверка не пройдена, система переходит к следующему тесту.

Пример:

tst.assertTrue(1 == 2); // запишет в лог "assertTrue не прошло проверку"

tst.assertTrue(1 == 2, "Число 1 не равно числу 2"); // запишет в лог переданный текст "Число 1 не равно числу 2"

tst.shouldBeTrue#

Метод проверяет, что условие истинно. Если условие ложно, в лог записывается ошибка.

Пример:

tst.shouldBeTrue(1 == 2); // запишет в лог "shouldBeTrue не прошло проверку"

tst.shouldBeTrue(1 == 2, "Число 1 не равно числу 2"); // запишет в лог переданный текст "Число 1 не равно числу 2"

tst.sqlRows#

Метод возвращает количество строк, полученных в результате выполнения запроса.

Пример:

var count = tst.sqlRows(`select t.id from RplTst_AllDbTypes t where t.idObjectType = 120`);

Изоляция и повторяемость#

JEXL-тест должен корректно выполняться при повторном запуске.

Рекомендуется:

  • использовать уникальные значения для создаваемых данных;

  • очищать данные после выполнения теста, если они создаются или изменяются;

  • передавать данные между шагами через tst.setVar и tst.getVar;

  • использовать глобальные переменные только для данных, которые нужны на нескольких шагах;

  • не зависеть от данных, оставшихся после предыдущих запусков.

Интеграция в массовый запуск или CI/CD#

JEXL-тесты можно запускать группами через REST-сервис. Это позволяет включать их во внешние сценарии обновления, CI/CD-процессы или регламентные проверки тестового стенда.

Для автоматического запуска используйте системные имена тестов и групп. Результат выполнения анализируйте по полям hasErrors, hasWarnings, countErrors и countWarnings.

Типовые проблемы#

При разработке и запуске JEXL-тестов часто возникают следующие проблемы:

  • тест зависит от данных, созданных вручную;

  • глобальная переменная имеет неуникальное или неочевидное имя;

  • шаг теста не записывает диагностическую информацию в лог;

  • ошибка фиксируется текстом, но не проверяется через assert-метод;

  • группа тестов продолжает выполнение, но результат не анализируется по ошибкам;

  • REST-запрос запускается с неверным системным именем теста или группы.

Рекомендации#

При разработке JEXL-тестов рекомендуется:

  • разбивать сценарий на понятные шаги;

  • использовать tst.setVar и tst.getVar для передачи данных между шагами;

  • использовать tst.setGlobalVar и tst.getGlobalVar только для данных, которые нужны во всем тесте;

  • добавлять понятные сообщения в tst.assertTrue и tst.shouldBeTrue;

  • записывать диагностическую информацию через tst.info, tst.warning и tst.error;

  • проверять результат REST-запуска по полям ошибок и предупреждений.

Ограничения#

JEXL-тесты удобны для прикладных проверок, но не заменяют unit-, интеграционные, UI- и нагрузочные тесты.

JEXL-тесты не предназначены для:

  • оценки производительности под нагрузкой;

  • проверки визуального состояния интерфейса;

  • полной проверки взаимодействия всех компонентов системы без подготовки окружения.