Автотесты алгоритмов по работе со сторонними http сервисами через юнит-тесты и мок сервер soapUI

02.11.20

Интеграция - WEB-интеграция

Полезный кейс по использованию скриптов в soapui и тестированию http-сервиса с конкретным практическим примером.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Пример обработки юнит теста
.epf 26,63Kb
1
1 Скачать (1 SM) Купить за 1 850 руб.
проект в soapUI:
.xml 37,87Kb
1
1 Скачать (1 SM) Купить за 1 850 руб.

Всем здравствуйте!

Цель:

Иметь возможность без связи с http сервисом на стороне, на своей стороне держать рабочие алгоритмы по работе с различными ответами со стороны.

Так же корректно обрабатывать наши запросы к ним, но через подготовленный МОК сервер согласно описанному интерфейсу взаимодействия. (какие договоренности передачи данных по тем или иным запросам.)

То есть мы независимо от другой стороны можем быть уверены в работе своей части. 

Входные данные:

Конфигурация ERP, программа SoapUI, Мок сервер и скрипт, конфигурация "Тестирование 3.0".

Платформа 1с версии 8.3.14 и выше.

 

Кому может быть интересно:

 Тем кто в своей работе разрабатывает http сервисы или взаимодействует с другими и хотел бы их покрыть автотестами. 

 И быть в курсе работоспособности своего продукта.

 

Практическая часть

Задача.
Существует набор REST-запросов, которые мы хотим проверить.
В нашем случае это url адреса с параметрами, по котороым мы ожидаем получить определенный ответ в формате json.

Пример запроса:
/api/receipts/4b558ad8-c4dd-11ea-b84e-00d8617b0c84/?testname=Test1in1
где параметр совпадает с именем теста. (?testname=Test1in1)

Пример ответа в формате json:
 

{
    "code": "УП-34425",
    "guid": "4b558ad8-c4dd-11ea-b84e-00d8617b0c84",
    "buildingCode": "Склад основной(без ячеек)",
    "typeCode": "1",
    "expDate": "2020-07-13T00:00:00",
    "supplier": "Комплектующие",
    "notes": null,
    "transportTask": "",
    "lines": [
        {
            "productCode": "069000000009",
            "lineNumber": "ca0bda06-79ce-4494-b078-08796038e83c",
            "expQuantity": 5,
            "actQuantity": 5,
            "serial": "1112",
            "details": null,
            "prodDate": "2019-07-01T00:00:00"
        }
          {
            "productCode": "069000000004",
            "lineNumber": "10f05205-a1fb-40b5-85e3-49f5cda43c0e",
            "expQuantity": 1,
            "actQuantity":1,
            "serial": "",
            "details": null,
           "prodDate": "0001-01-01T00:00:00"
        }
    ]
}

 

1. Настраиваем проект в SoapUI. Мы организуем механизм обработки входной строки и подбора подходящего ответа. Сам алгоритм создания простого проекта смотрите по ссылке ( //infostart.ru/1c/articles/1182541/  ),
тут мы рассмотрим как выбрать необходимый ответ.


В SoapUI у нас хранится набор заданных ответов. Для того чтобы выбрать необходимый ответ и отправить пользователю мы используем код на языке "gerkin".

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

// Match based on query parameter
def queryString = mockRequest.getRequest().getQueryString() ?: "TestName=Test1in1"

TestName =  queryString.substring(9); 
log.info "TestName: " + TestName;
 
return TestName

 

 

2. Настраиваем в Тестировании 3.0

Фреймворк "Тестирование 3.0 (более подробное описание на https://testingtool.ru/

 

Процедура создания задания в тестировании 3.0 следующая:

а) Создается новое задание и в нее последовательно добавляются три действия

б) Все действия с произвольным кодом на сервере 1С, тексты приведены ниже

 

Вот они 3 действия.

 1.  Запуск МОК сервера через набор команд.

 2.  Выполнение юнит тестов

 3.  Завершение мок сервера через килл процесса

 

1. Запуск МОК сервера через набор команд

По сути все сводится к запуску конкретного сохраненного проекта через mockservicerunner от soapui

// I) если открыт, то закроем
Сообщение = "";
PID = ПланировщикЗаданийСервер.ПолучитьЗначениеПользовательскойПеременной(Неопределено,"SoapUI MockServer");

Если НЕ PID=Неопределено Тогда
	ПланировщикЗаданийКлиентСервер.ЗавершитьПроцессЛокально(PID,Сообщение);
КонецЕсли;

// II) запустить и сохранить в параметр
Сообщение = "";
ПутьККоманде = """C:\Program Files\SmartBear\SoapUI-5.3.0\bin\mockservicerunner.bat"" ""F:\Vissarov\git\erp-tests\WebServicesUnitTests\WMS\REST-WMS-soapui-project for unittest.xml""";
PID = ПланировщикЗаданийКлиентСервер.ЗапуститьПриложениеЛокально(ПутьККоманде,Сообщение);
Если PID>0 Тогда
	ПланировщикЗаданийСервер.УстановитьЗначениеПользовательскойПеременной(Неопределено,"SoapUI MockServer",PID);
КонецЕсли;

 

2. Выполнение юнит тестов

Тут было принято решение разбить их на несколько обработок по структурным соображениям. 

По видам запросов. И последовательно их запускать из определенной папки.
Команда так и называется "Все юнит-тесты из каталога UnitTest (WMS)".

В каждом тесте заводим тестовые случаи. И при падении теста мы точно знаем какой вариант теста не сработал из пройденных.

Вот как это выглядит:

Как результат теста сравниваем полученный документ и эталонный, который предварительно был выгружен в макет через обработку СериализаторMXL.epf  (он еще известен по проекту  https://github.com/xDrivenDevelopment/xUnitFor1C Аюханова Артура).

Правда в команде мы его доработали под свои нужды и служит для генерации первоначальных данных или эталонных макетов.

// создаем эталонный документ
СозданныеДанные = СериализаторMXL.СоздатьДанныеПоТабличномуДокументу(МакетДанные);
	
ПриходныйОрдер_Эталон = СозданныеДанные.ПриходныйОрдерНаТоварыУП_00034425От13_07_202010_48_52;


// проверяем результат работы алгоритма и подготовленный эталонный документ
УтвержденияПроверкаТаблиц.ПроверитьРавенствоТаблиц(
			ПриходныйОрдер_Эталон.Товары.Выгрузить(,СтрокаНужныхКолонок),
			ПриходныйОрдерТоварыПослеОбработки);

 


    // переменные по данному тесту передаем в рабочую обработку, для того чтобы она поняла что это тестовый прогон
    // и передала в адрес запрос нужный параметр.
	ВнешняяОбработка.НастройкиОбменаWMS.Вставить("РежимТеста",Истина);
	ВнешняяОбработка.НастройкиОбменаWMS.Вставить("ИмяПроверкиЮнитТеста",ИмяПроверкиЮнитТеста);	
	
	//Поменяем путь к МОК серверу.
	//Исходный адрес вернется при откате транзакции
	СтруктураЗаписи = Новый Структура;
	СтруктураЗаписи.Вставить("Корреспондент",УзелWMS);
	СтруктураЗаписи.Вставить("WSURLВебСервиса","http://SRV-msk-test1c1.ppl.loc:8098");
	РегистрыСведений.НастройкиТранспортаОбменаДанными.ДобавитьЗапись(СтруктураЗаписи);

	ГУИД_РО = "4b558ad8-c4dd-11ea-b84e-00d8617b0c84";
	Ордер = Документы.ПриходныйОрдерНаТовары.ПолучитьСсылку(Новый УникальныйИдентификатор(ГУИД_РО));
	КлючЗапроса = "/receiptUpdated/"+ГУИД_РО;
	РезультатВыполнения = ВнешняяОбработка.ВыполнитьЮнитТест_ЗагрузкаИзWMSПоКлючОбъекта(КлючЗапроса, ТелоЗапроса);

 

//Часть кода добавленного в рабочем алгоритме для работы автотестов

	Если НастройкиОбменаWMS.РежимТеста = Истина 
		И ЗначениеЗаполнено(НастройкиОбменаWMS.ИмяПроверкиЮнитТеста) Тогда
		СтруктураПараметров.АдресРесурса = СтруктураПараметров.АдресРесурса +"/"+	
		  СтрШаблон("?%1=%2", "TestName", НастройкиОбменаWMS.ИмяПроверкиЮнитТеста);
	КонецЕсли;

// то есть получится на выходе примерно так
/api/receipts/4b558ad8-c4dd-11ea-b84e-00d8617b0c84/?TestName=Test1in1

 

3. Завершение мок сервера через килл процесса

Тут помогла статья от автора //infostart.ru/1c/articles/1014870/ Сергея Гарина. Но 1 в 1 не встали идеи.

Была изначально идея с завершением по PID, но там батник вызывает новый процесс и его PID отлавливать тоже задача.

Пришлось перейти на ком объект и вызов следующего метода.

Scr = Новый COMОбъект("MSScriptControl.ScriptControl");
Scr.Language = "vbscript";
Scr.AddCode("

Option Explicit
Dim objWMIService, objProcess, colProcess
Set objWMIService = GetObject(""winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2"")
Set colProcess = objWMIService.ExecQuery(""Select * from Win32_Process Where (CommandLine Like '%SoapUIMockServiceRunner%')"")
For Each objProcess in colProcess
objProcess.Terminate()
Next
");

 

Если инициализация com объекта не будет происходить, то нужно выполнить установку tsc64.dll
https://tablacus.github.io/scriptcontrol_en.html

 

По тестирование своего http есть хорошая статья:

//infostart.ru/1c/articles/1182541/

 

П.С. 
Это моя первая статья, любую критику буду стараться принимать.

Юнит тесты http-сервисы тестирование качество разработки

См. также

WEB-интеграция Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Функциональное решение для торговли на всех популярных маркетплейсах. Работает со схемами FBO и FBS. Простое в использовании и установке, не вносит изменения в код программы. Существенно упрощает работу с товарным ассортиментом, обработку заказов с площадок, работу с поставками, а также ведение аналитики по продажам и остаткам.

72000 руб.

19.07.2024    1435    52    0    

3

WEB-интеграция Программист Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Внешняя обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.0

12000 руб.

02.02.2021    17786    49    50    

29

WEB-интеграция 8.3.8 Конфигурации 1cv8 Автомобили, автосервисы Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

Расширение предназначено для конфигурации "1С:Предприятие 8. Управление Автотранспортом. ПРОФ". Функционал модуля: 1. Заполнение регистров сведений по подсистеме "Мониторинг", а именно: события по мониторингу, координаты по мониторингу, пробег и расход по мониторингу, текущее местоположение ТС по мониторингу 2. Заполнение путевого листа: пробег по мониторингу, время выезда/заезда, табличная часть ГСМ, места стоянок по геозонам. 3. Отчеты по данным загруженным в регистры сведений. 4. Предусмотрена автоматическая загрузка данных в фоновом режиме (условия работы данной загрузке читайте в описании товара) Модуль работает без включенной константы по настройкам мониторинга. Модуль формы предоставляется с открытым кодом, общий модуль защищен. Любой заинтересованный пользователь, имеет возможность скачать демо-версию расширения.

22656 руб.

25.05.2021    14167    41    8    

16

DevOps и автоматизация разработки Тестирование QA Программист Пользователь Платформа 1С v8.3 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Платные (руб)

Автотесты 1С - готовые тестовые сценарии, предназначенные для регресс-тестирования функционала конфигурации после обновления типовым релизом. Сценарии проверяют интерактивное заполнение форм документов, справочников и результат проведения документов. Сценарий – feature-файл, разработанный с помощью vanessa-automation. Запуск сценария выполняется интерактивно с помощью vanessa-automation или с помощью vanessa-runner в CI-системах. Доступно тестирование тонкого клиента. Поддерживаемые версии конфигураций 1С:Зарплата и Управление Персоналом 3 и версии КОРП: 3.1.30.57.

2160 руб.

05.08.2024    935    10    1    

6

Обмен с ГосИС Мастера заполнения WEB-интеграция Бухгалтер Пользователь Платформа 1С v8.3 Бухгалтерский учет Оперативный учет Управляемые формы 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Универсальное расширение конфигурации для автоматической загрузки и заполнения реквизитов контрагентов (партнеров) из ОГРН для 1С:ERP Управление предприятием 2 (1С:ERP Управление предприятием 2, редакция 2.4), 1С:ERP Управление предприятием 2 (1С:ERP Управление предприятием 2, редакция 2.2), 1С:Управление торговлей 8 (Управление торговлей, редакция 11.5), 1С:Управление торговлей 8 (Управление торговлей, редакция 11.4), 1С:Управление торговлей 8 (Управление торговлей, редакция 11.3), 1С:Управление торговлей 8 (Управление торговлей, редакция 11.2), 1С:Комплексная автоматизация 8 (1С:Комплексная автоматизация, редакция 2.4), 1С:Комплексная автоматизация 8 (1С:Комплексная автоматизация, редакция 2.2), 1С:Комплексная автоматизация 8 (1С:Комплексная автоматизация, редакция 2.0) и 1С:Бухгалтерия 8 (Бухгалтерия предприятия, редакция 3.0).

3900 руб.

08.11.2017    63128    404    295    

72

Тестирование QA DevOps и автоматизация разработки Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет Налоговый учет Платные (руб)

Готовые тестовые сценарии, предназначенные для регресс-тестирования функционала конфигурации после обновления типовым релизом. Сценарии проверяют интерактивное заполнение форм документов, справочников и результат проведения документов. Сценарии возможно использовать как для vanessa-automation, так и для СППР. Поддерживаемые версии конфигураций ERP2 и КА2: 2.5.17.113.

2400 руб.

04.07.2022    8206    38    1    

28
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. malikov_pro 1327 02.11.20 13:16 Сейчас в теме
Тема интересна, разбираюсь с ней со стороны Postman.

"Входные данные: Конфигурация ERP, программа SoapUI, Мок сервер и скрипт, конфигурация "Тестирование 3.0"."
Желательно сразу описать что для чего используется, какую сторону тестируем.

Уточнить что MockServer идет в поставке с SoapUI и запускается с помощью java сервера, дать ссылку на документацию по использованию. С ходу накопал https://www.soapui.org/docs/soap-mocking/deploying-mock-services-as-war-files/, в связи с этим предположу что останавиливать сервис можно более гуманным спообом чем kill process.

Для тестирования нужна документация на API и план тестирования.

Не четко описаны ограничения и причины применить MockServer. "возвращал нам эталонные ответы, которые потом сравниваем у себя по факту работы алгоритма и ожидаемого, которые отражены в эталонной таблице." - как и где фиксируете эталонные ответы в работе теста?
2. dvissarov5 11 02.11.20 13:29 Сейчас в теме
(1)
1. Тестируем свою сторону
2. Про MockServer рекомендацию понял. Поправлю.
3. В том то и проблема что остановить это все дело вроде как нету более гуманного способа кроме как через интерфейс самого soapui. Да и скинул ссылку с той же проблемой из другой статьи.
4. Постарался дать более подробное описание сравнения. Если стало яснее, то здороов.

Спасибо
3. malikov_pro 1327 02.11.20 13:48 Сейчас в теме
(2) "1. Тестируем свою сторону" - тестируете реализацию клиента?
на стороне тест раннера проверяете ли структуру JSON или только полное соответствие по данным? Статья по реализации работы с JSON Schema в 1С недавно вышла.

"3." Посмотрю, если найду, то напишу нормальный вариант"

"любую критику" - лучше конструктивную, однажды меня достали в статье требованием сделать продакт из примера реализации.

Сам склоняюсь к формированию mock на основании спецификации, пример https://meta.stoplight.io/docs/prism/README.md.
Моя статья по OpenAPI https://infostart.ru/1c/articles/1319857/, если интересно, то могу в следующей провести цепочку до mock сервера, но нужен относительно просто, при этом рабочий кейс. У меня было желание взаимодействие с АТС описать, но объем пока неподъемный.
4. malikov_pro 1327 03.11.20 23:30 Сейчас в теме
(2) Если GET со схемой данных из OpenAPI, то можно формировать Mock с помощью Go http://igorlazarev.ru/posts/2019-02-22-swagger-mock
5. dvissarov5 11 06.11.20 11:44 Сейчас в теме
Оставьте свое сообщение