Автотесты алгоритмов по работе со сторонними 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    15909    14    18    

12

Автотесты для типовых конфигураций 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    6905    26    1    

24

Интеграция 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    17840    6    15    

13

[Расширение] БОР-Навигатор.Культура

Зарплата Бюджетный учет WEB-интеграция Обмен с ГосИС Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Расширение конфигурации, включающее в себя объекты, необходимые для подготовки и сдачи отчета "Штатная численность" системы "БОР-Навигатор.Культура" в программе "1С:Зарплата и кадры государственного учреждения", редакция 3.1.

8400 руб.

01.02.2019    25852    9    0    

7

Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС

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

Обработка является альтернативой механизму, разработанному фирмой 1С и заполняющему реквизиты контрагента по ИНН или наименованию. Не требуется действующей подписки ИТС. Вызывается как внешняя дополнительная обработка, т.е. используется, непосредственно, из карточки контрагента. Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС (egrul.nalog.ru) для БП 2.0, БП 3.0, БГУ 1.0, БГУ 2.0, УТ 10.3, УТ 11.x, КА 1.1, КА 2.x, УПП 1.x, ERP 2.x, УНФ 1.5, УНФ 1.6, УНФ 3.0, ДО 2.1

2400 руб.

28.04.2016    88876    162    216    

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