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

02.11.20

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

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

Скачать исходный код

Наименование Файл Версия Размер
Пример обработки юнит теста
.epf 26,63Kb
1
.epf 26,63Kb 1 Скачать
проект в soapUI:
.xml 37,87Kb
1
.xml 37,87Kb 1 Скачать

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

Цель:

Иметь возможность без связи с 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-сервисы тестирование качество разработки

См. также

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

Сайты и интернет-магазины WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    16043    13    18    

13

Интеграция 1С — Битрикс24. Обмен задачами

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс24. Разработка имеет двухстороннюю синхронизацию 1С и Битрикс24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (8.3.18.1289). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    18083    10    15    

16

Автотесты для типовых конфигураций ERP Управление предприятием 2 и Комплексная автоматизация 2 (для vanessa automation)

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

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

2220 руб.

04.07.2022    7007    26    1    

24

SALE! 10%

Автоматическая загрузка файлов (например, прайс-листов) из электронной почты, FTP, HTTP, их обработка и выгрузка на FTP (на сайт) и для других целей

Прайсы WEB-интеграция Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Автомобили, автосервисы Оптовая торговля, дистрибуция, логистика Управленческий учет Платные (руб)

Программа с заданным интервалом времени (или по ручной команде) скачивает файлы (например, прайс-листы поставщиков) из различных источников: письма электронной почты, FTP или HTTP-адреса, и сохраняет их в каталог упорядоченной структуры. При этом извлекает файлы из архивов, может переименовывать файлы и менять их формат (csv, xls, txt). Можно настроить выгрузку обработанных файлов на сайт (через FTP-подключение). Программа будет полезна компаниям, у которых есть большое количество поставщиков и/или прайс-листы поставщиков обновляются часто (необязательно прайс-листы, файлы могут быть любого назначения). Собранные таким образом актуальные версии прайс-листов можно выгрузить с помощью программы себе на сайт (или на любой FTP-сервер) или выполнить другие необходимые задачи.

28000 25200 руб.

28.05.2015    85284    26    51    

50

Модуль для обмена "1С:Предприятие 8. УАТ. ПРОФ" с FortMonitor

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

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

22656 руб.

25.05.2021    12970    32    8    

12
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. malikov_pro 1296 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 1296 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 1296 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 Сейчас в теме
Оставьте свое сообщение