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-тесты не предназначены для:
оценки производительности под нагрузкой;
проверки визуального состояния интерфейса;
полной проверки взаимодействия всех компонентов системы без подготовки окружения.