Тестирование интерфейса в обычном приложении 8.2 при помощи SikuliX





























Как же не хватает клиента тестирования на платформе 8.2. Не кликнешь на кнопку, не выберешь из списка, не проверишь видит ли надпись пользователь.
Воспользуемся внешним инструментом SikuliX, который позволит нам протестировать функционал форм.
Данный инструмент легко встраивается в линию сборки и может «дружить» с уже известным многим Open-source продуктами.

SikuliX — кросс-платформенная визуальная среда создания сценариев-скриптов. При помощи этих скриптов можно взаимодействовать с любыми интерфейсами, отображаемым на мониторе. Например, следить за изображением с вебкамерами, программировать поведение игровых ботов, серфить в интернете и, конечно, тестировать любые интерфейсы любых программ.
Сценарии-скрипты могут быть написаны на Python, Jython, Ruby. Но не стоит пугаться, если вы не знаете этих языков. При помощи SikuliX IDE вы сможете создать сценарий просто накликав его мышкой, чем мы и займемся.
Главное, что надо запомнить: Сикули — это просто. 

Зачем SikuliX нужен программисту 1С

В платформе 8.3 появился функционал клиента тестирования, который позволяет проверить очень многое. По сути можно имитировать поведение пользователя.
Однако, если у вас 8.2 — вам не доступен этот функционал. Протестировать интерфейс вы сможете только при помощи сторонних программных средств. И здесь есть из чего выбрать.
Что же можно использовать?

  • AutoIt — целый язык для автоматизации. AutoIt использует симуляцию нажатия клавиш, движений мыши и манипуляции с окнами, элементами управления. Это позволяет автоматизировать задачи пользователя Windows, обойдя нехватку подобного функционала в других языках программирования и в 1С 8.2 в том числе.
  • AutoHotkey — аналогичная вышеназванной программа для написания макросов по автоматизации действий. Пожалуй, AHK даже более известен, в сравнении с AutoIt.

Из плюсов подобного ПО — можно сделать все, что хочешь. Но минусы перевешивают. Как человек, написавший не одно приложение на AutoIt могу констатировать: процесс разработки не быстрый, отладка своеобразна, реализация может зависеть от разрядности системы, имеются нюансы, связанные с ОС. 
Количество кода, требующегося для решения нашей задачи (напомню, это тестирование интерфейсов): несколько десятков строк.

И все-таки Sikuli

После беглого знакомства с SikuliX для меня стали очевидны следующие преимущества этого продукта:

  • Сценарий тестирования накликивается мышкой
  • Причем накликивается очень быстро
  • Отладка интуитивно понятна, не вызывает вопросов
  • Результаты тестирования можно встраивать в существующие фреймворки тестирования (в нашем примере это будет xUnitFor1C)
  • Можно интегрировать в сборочную линию
  • Осваивается очень быстро

Установка SikuliX

Важное вступление! 
1. С кириллицей у меня SikuliX подружить так и не получилось. Поэтому все имена, пути и т.д. — только латиница. 
2. Отдельной разговор про имя пользователя. Библиотеки сикули устанавливаются в папку c:Users<ИмяПользователя>AppDataRoamingSikulix. Если имя пользователь, под которым планируется работа набран в кириллице — сикули не встанет. Но выход есть: можно сменить название папки (но не самой учетки). Об этом будет дальше.
3. Регистр в именах скриптов важен 1С.sikuli и 1с.sikuli — два разных скрипта, пусть у вас и Windows
4. Все выполнялось на "железном" компьютере с windows 7(х64), платформой 8.2.19.130, 8.2.19.83.

SikuliX — набор java-скриптов и библиотек. Для инсталляции нам потребуется еще и JAVA. Минимальные требования к Java согласно сайту разработчиков (от декабря 2024) http://sikulix.com/quickstart/ это версия 7 (JRE или JDK). Думаю, у большинства уже все установлено. Проверить версию можно простой командой:

Последний стабильный релиз Сикули можно взять отсюда: https://launchpad.net/sikuli/sikulix/1.1.1
Хотя лично я пользовался последними ночными версиями сборки, которые взял из девелопмента: https://raiman.github.io/SikuliX-2014/nightly.html (там есть ссылочка с jar)

 

 Если имя пользователя, под которым планируется работа написано в кириллице (Иван, Администратор, А.Блок).

У SikuliX нетривиальный инсталлятор. Качаем jar-файл, перемещаем его в папку, где планируете разместить SikuliX. У меня это, как видим, C:SikuliX (диск и папка не играют роли). Начинаем установку командой:

java -jar sikulixsetup-1.1.2-20241218.172518-66-forsetup.jar

В вашем случае, имя файла будет другое.

Установщик начинает работу и предлагает выбрать один из вариантов. Выбираем как на скриншоте первый пункт, который проинсталлирует нам SikuliX вместе с его IDE:

Далее продолжаем инсталляцию поддакивая установщику:

 

И только в одном месте мы скажем нет. Дело в том, что на этапе установки Jython 2.7.0 скрипт так и не захотел запускаться и пришлось переинсталлировать Сикули. Поэтому на этом этапе отвечаем "NO" и устанавливаем Jython 2.5.4:


 
Кстати, если что-то пошло не так можно все пересоздать. Для этого удаляем все из установочной директории и повторяем установку как надо.

Если установка прошла успешно должно появиться окошко вида:


 
Если его нет, значит что-то сделано не так. Обратите внимание на кириллицу, Jython, перечитайте эту инструкцию по установке сначала. И переустановите Sikuli.

Наш первый Hello World

Запустим Sikuli IDE. Для этого выполним команду (можно ее вывести в ярлыки):

runsikulix.cmd

Запускается среда разработки. Выглядит довольно просто. Сюда можно кодить в Pyton-е. Но мы хотим быстрого старта и программирования мышкой. Начнем.

Программируем мышкой

Давайте заставим Сикули создать новый текстовый документ в 1С.
Для начала запустим 1С в режиме предприятия. Напомню, у меня это 8.2. Конечно, по-честному, нам надо создать скрипт, который сам запускает 1С, но это будет позже. 
Итак, 1С-ка запущена. У меня это голая конфигурация без всего.

В Сикули кликаем на команду click и в рабочую область попадает новая команда:

Жмем на значок фотокамеры в этой команде и Сикули предлагает нам выбрать область, на которую нужно кликнуть. Мы хотим кликнуть на пиктограмму нового документа. Выделяем область с пиктограмкой:


 
Тут сразу возникает вопрос, почему такая большая область. Может нужно выбрать только сам значок? Более большая область позволяет Сикули выбрать именно стандартную панель. Вдруг на мониторе сейчас есть другое приложение с аналогичной иконкой. Или может быть такой значок есть на форме ранее открытой в 1С.

Вот, что у нас получилось:

 
Давайте сразу попробуем выполнить этот скрипт и нажмем на кнопку "Выполнить". Естественно, нам предложат сохранить нашу работу, согласимся:


 
Пронаблюдав выполнение скрипты мы увидим, что клик попадает в центр (у меня получается в пункт меню "Правка"). Скорректируем нажатие именно на значок. Для этого кликнем на нашу картинку в Сикули и откроется окно "Настройка шаблонов"


 
Перейдем на закладку Смещение цели и укажем нужный нам значок, кликнув по нему. Видим, что перекрестие из центра картинки сместилось на центр значка "Новый документ", жмем "Ок":


 
Выполним наш скрипт. Теперь все отлично, открылось окошко выбора типа нового документа:


 
Если бы нас интересовала графическая схема, можно было бы аналогичным способом выбрать этот пункт, но нам нужен Текстовый документ, а он уже выбран. Можем нажать на кнопку ОК, или нажать Enter на клавиатуре. Выполним последнее, ибо это проще. Введем две команды:


 
sleep(1) позволит сделать секундную паузу, чтобы окно успело открыться перед тем, как мы пошлем "в него" наш Enter. 
type(Key.ENTER) — как раз передает Enter.

И финальный аккорд — вывод нашего "Hello, World!"


 
Здесь как мы видим команда Paste, а не Type. Почему? Потому что Sikuli при помощи этой команды может ввести только латиницу. А вот команда Paste вставит нужную нам строку в любой кодировке.

Вот как это работает 

Все так просто! Давайте сделаем настоящий тест. 

Тестируем интерфейс формы

Итак, давайте протестируем небольшой функционал. Добавим справочник с парой реквизитов и форму элемента. 
По условию выдуманного техзадания при изменении содержимого Реквизита1 в окно сообщений должна выводиться фраза "Шеф, все пропало" и Реквизит2 становится невидимым.
Реализация функционала в модуле формы будет совсем простой:

Процедура Реквизит1ПриИзменении(Элемент)
Сообщить("Шеф, все пропало");
ЭлементыФормы.Реквизит2.Видимость=Ложь;
КонецПроцедуры

При реализации теперь не буду тщательно детализировать каждый чих, лучше обильно откомментирую код. 
Сценарий у меня получился вот таким. Все прекрасно работает в Sikuli IDE (но все-таки это еще не финальная версия)

(Полный текст сценария размещен в исходниках в конце статьи)

Про ошибки в Sikuli IDE и логи

Кстати, совсем забыл про работу с ошибками. Вы, наверняка, уже наделали ошибок в своих скриптах и получили красные ромбики. Тут все красиво и прозрачно. Если что-то пошло не так, то сообщение проиллюстрирует проблему:

Лог показывает всю последовательность действий. Что у Sikuli получилось, что нет. Строки с ошибками нас будут интересовать на этапе "разбора полетов" и тут нам поможет правильное именование наших картинок.
Да-да, картинки по которым ходит/кликает Сикули можно переименовывать. Но только не забываем, что только в латиницу. 
Согласитесь, что фраза 

FindFailed: soobshenie_pro_Shefa.png: (113×17) in S(0)[0,0 1920×1080] E:Y, T:3,0

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

FindFailed: 1514017498867.png: (113×17) in S(0)[0,0 1920×1080] E:Y, T:3,0

Возможно, вы сразу догадаетесь, что нужно сделать не прибегая к IDE.

Автоматизируем запуск наших Sikuli-сценарии

До этого момента мы тестировали все "руками" в Sikuli IDE. Настало время автоматизировать наше тестирование интерфейса. Давайте создадим скрипт, который при выполнении сделает за нас все: запустит 1С-ку, прогонит сценарий, сохранит результаты для последующего анализа, и закроет сеанс.
Варианты скриптов могут быть разными, можно написать на чем удобно вам: bat-файл, onescript, powershell-скрипт.
Я сделаю bat-файл. Просто потому что его использовал и писал любой из нас. Никаких преимуществ перед другими способами он не имеет.
Если вы используете onescript, то лучше попрактиковаться в нем. Тем более, что у него есть возможность удалить запущенный процесс, если что-то пойдет не так. Под onescript есть библиотеки, которые позволяют настроить запуск 1С-ки, не морочась с путями и т.д. 
Итак, чтобы не усложнять, все-таки сейчас у нас будет bat-файл.

Сам запускающий батник имеет вид:

Сначала стартует 1С-ка. Далее поочередно запускаются jar-файлы со сценариями тестов. Конечно, это место нужно улучшить, получив все названия сценариев из самой папки, но пока не хочется усложнять восприятие.
Последняя строка — завершение работы самой 1С причем через Sikuli.
Все скрипты пишут в файл .log в собственную папку Sikuli-скрипта. Это важно: по содержимому этого файла мы потом определим, чем все закончилось.
Сам скрипт Sikuli чуть поправлен. Здесь появились чудо-конструкции с исполнением кода в попытке и повторное использование сценария закрытия всех окон.
Попытка необходима для того, чтобы выполнение bat-скрипта не прерывалось, даже если что-то в сценарии пойдет не так — элементарно он упадет.
Закрытие окон необходимо для того, чтобы "понаоткрытое" другими сценариями не мешало выполниться текущему sikuli-скрипту.

Простейший отчет по тестированию

Все запускается, выполняется, открывается и успешно закрывается. А где результат? А результаты в файлах .log. Дополним наш скрипт созданием простейшего файла-отчета.
Для этого создадим простейшую обработку 1С, которая проинспектирует логи и создаст файл отчета:

Процедура ПриОткрытии()
Попытка
СформироватьОтчетОТестированииИнтерфейса();
Исключение
ЗаписьЖурналаРегистрации("Ошибка записи отчета о тестировании интерфейса",УровеньЖурналаРегистрации.Ошибка,ОписаниеОшибки());
КонецПопытки;
ЗавершитьРаботуСистемы(Истина);
КонецПроцедуры

Процедура СформироватьОтчетОТестированииИнтерфейса()
МассивПараметров = РазложитьСтрокуВМассивПодстрок_(ПараметрЗапуска,";");
Если НЕ МассивПараметров.Количество()=2 Тогда
Возврат
КонецЕсли;
ПутьККаталогамСикули = МассивПараметров[0];
ПутьКФайлуОтчета = МассивПараметров[1];

Текст = новый ТекстовыйДокумент;
Текст.ДобавитьСтроку(Формат(ТекущаяДата(),"ДЛФ=DT"));

МассивЛогФайлов = НайтиФайлы(ПутьККаталогамСикули,".log",Истина);
Для каждого ФайлЛога Из МассивЛогФайлов Цикл
ПутьККаталогу = ФайлЛога.Путь;
ЕстьОшибка = ?(ВЛогеЕстьОшибка(ФайлЛога.ПолноеИмя),"OK","error");
Текст.ДобавитьСтроку(ПутьККаталогу+": "+ЕстьОшибка);
КонецЦикла;
Текст.Записать(ПутьКФайлуОтчета,КодировкаТекста.ANSI);

КонецПроцедуры

Функция ВЛогеЕстьОшибка(ПутьКФайлу)
Текст = новый ЧтениеТекста(ПутьКФайлу);
Строка = Текст.Прочитать();
Если Найти(нРег(Строка),"[error]")>0 Тогда
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли;
КонецФункции

Функция РазложитьСтрокуВМассивПодстрок_(Знач Строка, Знач Разделитель = ";") Экспорт

Результат = Новый Массив;

Позиция = Найти(Строка, Разделитель);
Пока Позиция > 0 Цикл
Подстрока = Лев(Строка, Позиция - 1);
Если Не ПустаяСтрока(Подстрока) Тогда
Результат.Добавить(Подстрока);
КонецЕсли;
Строка = Сред(Строка, Позиция + СтрДлина(Разделитель));
Позиция = Найти(Строка, Разделитель);
КонецЦикла;

Если Не ПустаяСтрока(Строка) Тогда
Результат.Добавить(Строка);
КонецЕсли;

Возврат Результат;

КонецФункции

 

Дополним наш bat-ник еще одной строчкой. 

rem Создаем простой отчет
%exe1cv8% ENTERPRISE /IBNAME "Тестовая82" /UseHwLisenses /Lru /VLru /DisplayAllFunctions /O Normal /Execute %ProjectPath%СоздатьОтчетИЗакрыть1С.epf /C"%ProjectPath%;%ProjectPath%otchet.txt"

 

Теперь мы получаем вот такой простенький отчет по тестированию интерфейса:

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

Красивый отчет по тестированию

Но хочется большего. Точнее большого, красивого и подробного. Например, в виде Allure-report как на картинке:


 
Для получения красивого отчета можно воспользоваться функционалом фреймворков Vanessa-Behavior или XUnitFor1C. Для моей реализации выберу последний. 
Создам простой тест-обработку. Для тех, кто работал с xUnit ничего нового – это стандартный текст обработки с необходимыми процедурами для запуска фреймворка. Вся «соль» содержится в последней однобуквенной процедуре. Сам модуль объекта:

Перем КонтекстЯдра;

Перем ТестируемаяФорма;
Перем НужноИсключениеЕслиНеНайденоДокументов;

//{ интерфейс тестирования

// директива препроцессора нужна для исключения ошибки загрузки в толстом клиенте управляемого приложения
#Если ТолстыйКлиентОбычноеПриложение Тогда

Процедура Инициализация(КонтекстЯдраПараметр) Экспорт
КонтекстЯдра = КонтекстЯдраПараметр;
КонецПроцедуры

Процедура ПередЗапускомТеста() Экспорт
НачатьТранзакцию();
КонецПроцедуры

Процедура ПослеЗапускаТеста() Экспорт

Если ТранзакцияАктивна() Тогда
ОтменитьТранзакцию();
КонецЕсли;

КонецПроцедуры


Процедура ЗаполнитьНаборТестов(НаборТестов) Экспорт

НаборТестов.СлучайныйПорядокВыполнения();
НаборТестов.Добавить("_");

КонецПроцедуры

Процедура _() Экспорт

Попытка
ПутьКЭтойОбработке = КонтекстЯдра.ТекущийКонтейнер.Строки[0].Путь;
Исключение
ВызватьИсключение "Не нашли путь к обработке в КонтекстЯдра.ТекущийКонтейнер.Строки[0].Путь";
КонецПопытки;

Ф = новый Файл(ПутьКЭтойОбработке);
ПутьКЛогу = Ф.Путь+".log";
Ф = новый Файл(ПутьКЛогу);
Если НЕ Ф.Существует() Тогда
ВызватьИсключение "Не найден лог тестирования интерфейса";
КонецЕсли;

Текст = новый ЧтениеТекста(ПутьКЛогу);
Прочитанное = Текст.Прочитать();
Если Найти(Прочитанное,"[error]")>0 Тогда
ВызватьИсключение Прочитанное;
КонецЕсли;
//Сообщить(КонтекстЯдра.Путь);
КонецПроцедуры


#КонецЕсли

Сохраняем тест с красноречивым именем, которое расскажет благодарным потомкам, что же все-таки тут проверялось. Кладем этот файл в папку к Sikuli-скрипту.
Если у нас несколько тестов, то копируем этот же файл в другие папки, только переименовывая его. Этот копи-паст отлично работает в дженкинсе (см. первый скриншот с Allure-отчетом).
Стандартно запускаем xUnitFor1C, указывает корневую папку с нашими sikuli-скриптами. хUnitFor1C сам прочтет все тесты, которые ему предстоит выполнить:


 
После запуска часть тестов позеленеет, часть покраснеет, а в перечне ошибок будут как раз содержимое наших файлов .log. Посмотрев в ошибки мы скажем себе спасибо за то, что понятно называли картинки и нам, скорее всего, не придется долго воспроизводить проблему (на скриншоте я как раз этим моментом пренебрег):

Собственно, наша задача решена. Техзадание выполнено, протестировано, отчет сформирован. Уже в этом виде решение приобрело законченный вид.
Пойдем чуть дальше. Типа бонус!

Добавляем красивый отчет в сборочную линию

Скрипт тестирования интерфейса у нас есть, дело за малым — интегрировать запуск XUnit в нашу сборочную линию, вместе с генерацией отчета. Про запуск xUnitFor1C из командной строки можно прочитать на вики xUnitFor1C.
Моя итоговая строка запуска выглядит вот так:

chcp 65001

set runsikulicmd=c:sikuliX
unsikulix.cmd
set ProjectPath=c:	est_sikulisikuli\r
set exe1cv8="C:Program Files (x86)1cv828.2.19.83in1cv8.exe"
set ConnectionString=/F"C:Тестовая82_Инфостарт"
set TestTools=C:TestToolsxUnitFor1C_82


rem запуск 1С, в котором будем тестировать интерфейс
start "1c" /MAX %exe1cv8% ENTERPRISE %ConnectionString% /UseHwLisenses /Lru /VLru /DisplayAllFunctions /O Normal


rem поочередный запуск всех тестов

rem Тест, который пройдет
set TECNAME=VsePropalo2.sikuli\r
del /F %ProjectPath%%TECNAME%.log
call %runsikulicmd% -r %ProjectPath%%TECNAME% > %ProjectPath%%TECNAME%.log

rem Тест, который завалится
set TECNAME=No.sikuli\r
del /F %ProjectPath%%TECNAME%.log
call %runsikulicmd% -r %ProjectPath%%TECNAME% > %ProjectPath%%TECNAME%.log

rem Закрываем 1с
set TECNAME=close1c.sikuli\r
call %runsikulicmd% -r %ProjectPath%%TECNAME% > %ProjectPath%%TECNAME%.log

rem Создаем папку под отчеты
set TESTReportFOLDER="%WORKSPACE%allure-results"
RMDIR /S /Q %TESTReportFOLDER%
MD %TESTReportFOLDER%

rem Создаем Аллюр-отчет при помощи xUnitFor1C
%exe1cv8% ENTERPRISE %ConnectionString% /UseHwLisenses /DisplayAllFunctions /O Normal /Execute "%TestTools%xddTestRunner.epf" /C "xddRun ЗагрузчикКаталога ""%ProjectPath%""; xddReport ГенераторОтчетаAllureXML ""%WORKSPACE%allure-results
eport_ordinary.xml""; xddShutdown;"

Внимание, это уже не запуск на моем компьютере, это уже bat-ник в Jenkins. Я сознательно опускаю детали установки Allure локально. Он локально-то по большому счету и не нужен. У меня, например, не стоит. А вот на сборочной линии мы активно пользуемся его наглядным функционалом.
Про установку Allure, Jenkins и прочего инструментария есть статьи на инфостарте и других ресурсах. Считаю, что тема слишком объемна и бессмысленно описывать это здесь.
Все скрипты и bat-файлы выкладываю в одном архиве, так как финальные тексты могут несколько отличаться от ранних скриншотов для статьи.

Итоги

SikuliX – это мощный и удобный инструмент для тестирования интерфейса. Наверняка, с его помощью можно решить еще не одну задачу. Программа проста, неприхотлива, имеет запуск из командной строки. Из зависимостей только Java (напоминаю, Sikuli – кроссплатформенна).
 

Что еще не сказано. Примечания

  • На разных скриншотах фигурируют разные пути C:SikuliX, D:SikuliX – не обращайте внимание, часть картинок с Jenkins, часть с собственного компьютера, никакой магии.
  • Для простоты я не использовал никакие логины-пароли и не проводил проверку под всякими ролями. Это остается за рамками данной статьи, но сложностей здесь немного.
  • Глядя на итоговый скрипт для Jenkins можно похихикать над «сборочной линией» — ее тут, конечно, нет.
  • В моем случае slave-нода запускается с экранным разрешением 1024х768. Запуск осуществляется под пользователем, для которого настроен автологин. И это следует учесть при создании Sikuli-сценариев. Возможно, есть более удачный способ запуска. Как проверить разрешение – в отчете есть информация на эту тему:


 

  • Пока работает Sikuli-скрипт — другие задачи с всплывающими окнами могут нарушать работу сценариев. Решение тривиальное — ничего больше не запускать во время тестирования или выделить отдельную машину.
  • Sikuli — в переводе с древнего индейского языка означает «глаз бога». Ох, уж эти разработчики и кулхацкеры…

Ссылки

Традиционно даю ссылки на полезную информацию для решивших пойти sikuli-путем:

Вроде все… Спасибо всем осилившим.
 

39 Comments

  1. Evil Beaver

    Отличная работа, спасибо!

    Reply
  2. pumbaE

    # -*- coding: UTF-8 -*-

    разве не помогает в начале файла для преодоления проблем с кириллицей?

    Reply
  3. as

    Отлично. Даже и не думал, что обычные формы можно так просто начать тестировать. Хотя про AutoIt знал 🙂

    Reply
  4. vermouth

    Киньте в меня камнем, кто не верит в такое тестирование.. правда… по числу негативных отзывов в мой адрес хочу понять — насколько я ошибаюсь

    Reply
  5. Dzenn

    Открыл для себя что-то новое, хотя думаю, что мне эта технология никогда не пригодится. В каких случаях нужно проводить такие тестирования?

    Reply
  6. Region102

    (5) Для «домашней разработки» это не обязательно, но если пишешь серьезные приложения для бизнеса, то тестирование должно внедряться на самом начальном этапе разработки. Когда у вас конфигурация — это 5 справочников и 2 документа, то да, там можно и самому потыкать чтобы проверить корректность последних изменений. Когда же это уже десятки объектов метаданных с тесными взаимосвязями, то тут доработал что-то полугодичной давности и посыпались ошибки в работе по цепочке. Сейчас клиенты очень негативно относятся к 1С, так как тестировать в нашей среде принято на пользователях, а бизнес этого не любит.

    Меня же больше интересует написание тестов для мобильной платформы и возможность внедрения в мобильной платформе нормальных сервисов для анализа ошибок в приложениях, типа fabric.io

    Reply
  7. ivanov660

    (6) Бизнес в 1С не любит косяков, а также не готов платить за тестирование. Взаимоисключающие вещи к моему сожалению.

    Reply
  8. kraynev-navi

    (2) я имел в виду установить сам Sikuli в русскоязычную папку пользователя

    Reply
  9. kraynev-navi

    (4) что значит верить или не верить в тестирование? )))

    Reply
  10. kraynev-navi

    (6) А потом через год «вдруг» появляется еще пара документа и ты уже не помнишь как руками все это прочекать. А тестами все уже было покрыто и запускается на автомате.

    Или другой случай — эти 5 справочников и 2 документа так удачны и составляют подсистему, что принято решение интегрировать в другие конфигурации. Тесты ускорят процесс в разы.

    Reply
  11. kraynev-navi

    (7) Надо смотреть на тестирование как на часть разработки. Вы же не принуждаете бизнес оплачивать, например, собственное обучение. Вы обучаетесь за свой счет, понимая, что инвестируете в свое качество разработки. Выполняя тестирование вы также повышаете свое качество разработки.

    Reply
  12. triviumfan

    Не понимаю, кто использует такого рода тестирование… оно же нереально затратное. А целесообразно ли?

    Даже у самой 1с нет автоматического тестирования, зачастую вижу баги с переопределением обработчиков или удалением привязки их из формы, ввиду чего имеем «метод объекта не обнаружен».

    Reply
  13. Region102

    (12) Многие крупные разработчики до сих пор не применяют тестирование в принципе. Взять конфигурацию рарус УАТ проф начальных релизов и прогнать их стандартными средствами проверки конфигураций, и взять последние релизы, ошибки так и тянуться ГОДАМИ. А за внедрение этой конфигурации они миллионы подымают.

    Внедряйте тестирование на начальном этапе и со временем люди при выборе качественного продукта обратятся к вам, а не к «старичкам» работающим по старинке. Да и свою карму поднимите.

    Reply
  14. grumagargler

    (7) Проводил неоднократно эксперименты с коллегами. Спрашиваю: — Вот вы говорите вам не хватает времени/денег делать работу качественно, так? Ответ – да, именно так. Хорошо, даем премию, даем времени пока не скажете «готово». Работаем…и в результате – почти ничего не изменилось. Другими словами, тестирование это не как сервис, за который можно дополнительно заплатить и оно появится (если мы говорим про программистов), это часть процесса разработки, требует обучения и повышения общей культуры создания программ.

    Reply
  15. kuntashov

    Спасибо за обзор инструмента. Сейчас как раз мучаюсь (другого приличного слова не подберу) с 1С:Сценарным тестированием для тестирования конфигураций на 8.2. Главная беда, конечно — с модальными окнами.

    Есть пара вопросов:

    1. Как вижу, SukuliX работает в отдельном сеансе/процессе и по идее должна уметь и модальные окна ловить. Я прав?

    2. Почему xUnitFor1C используете только для геренации отчета? Не думали о том, чтобы запускать SikuliX-тесты при помощи xddTestRunner.epf, который запускался бы в сервисной информационной базе?

    Это более естественный способ использования xUnitFor1C, чем отдельный запуск только для обработки логов. Принцип работы тестовой обработки для xUntitFor1C может быть таким:

    * Параметризованный тестовый метод Тест_ДолженВыполнитьСкриптSikuliX(), который принимает на входе путь к сценарию на SikuliX и выполняет его, в конце проверяет лог и выводит исключение, если в логе обнаружены ошибки.

    * ЗаполнитьНаборТестов() сканирует переданный через файл конфигурации путь к каталогу с SikuliX-тестами и для каждого файла-теста создает тестовый случай в дереве тестов (тест = Тест_ДолженВыполнитьСкриптSikuliX, Параметр = Путь к конкретному SikuliX-скрипту)

    Мы таким образом запускаем 1С:Сценарные тесты.

    Основное преимущество такого подхода: не нужно поддерживать батник для последовательного запуска тестов.

    Ваше решение, конечно же, идеально для всех, кому сначала ехать, а потом шашечки 🙂

    Reply
  16. ivanov660

    (11)На самом деле косвенно конечно да. Откуда берутся деньги на внутренние нужды компании? С клиентов) Чем более «качественный» сервис — тем выше цена в прайсе.

    За тестирование я двумя руками за, и за повышение квалификации сотрудников и качества разработки.

    Reply
  17. kraynev-navi

    (15)

    1. Да, должен. Примера нету, чтобы подтвердить.

    2. Было бы идеально запускать внутри фреймворка. Но есть нюанс.

    Пока тест не отработает, он никаких новых окон не позволит открыть кому бы то не было — скрипту, пользователю и т.д. Если вы предлагаете открывать второй экземпляр 1с в режиме предприятия, то у меня есть сомнения в том, что эти два экземпляра (псевдо «клиент-тестирования» и экземпляр с xUnit) не будут перекрывать друг друга. Тут надо придумывать хитрый механизм внутри sikuli, чтобы он разобрался в том, куда ему кликать, на какие окна смотреть. Тут подходим к задаче корректного определения нужного приложения, удержания фокуса и т.д. Попутно, подозреваю, будут еще нюансы. Мне кажется, этот путь сложнее.

    Если не прав, буду рад замечаниям.

    Reply
  18. kraynev-navi

    (15) и еще дополню.

    Конечно, батник не надо поддерживать (дописывая туда новые/удаляя старые). Делается onescript-е, который шерстит папки со сценариями. В этой связке только некрасив «лишний» файл обработки-теста внутри папки сикули.

    Про ваш вариант с параметрами надо подумать, может лучше, да.

    Reply
  19. ivanov660

    (14)Если подойти немного философски, то человек (особенно программист) ленивое существо) обремененное кучей проблем, а также набором устоявшихся поведенческих шаблонов. И вариант с отправлением в свободное плаванье в большинстве случаев приведет к провалу.

    Если говорим про коллектив разработчиков продукта, то тут следует внести изменения в бизнес процесс разработки. Надо фактически заставить работать по изменившимся правилам. Обязательно потребуются инструкции и обучение. Иначе не работает, там где этого процесса не было.

    Reply
  20. Gilev.Vyacheslav

    а на 8.3 перейти не проще?

    Reply
  21. artbear

    (20) для УПП 1.Х ? нет, не проще 🙂

    Reply
  22. artbear

    (21) Зачем вставлена рекламная ссылка?

    Добавь полезный комментарий — о чем, почему?

    Reply
  23. Gilev.Vyacheslav

    (22) упп не работает на 8.3?

    Reply
  24. kuzyara

    Это можно, но что за выпады и переход на личности?

    (23)

    Хорошая документация, реальные сценарии на типовой, готовые кейсы, 8.2, ОФ, неплохое дополнение к 1с:апк.

    Легко ищется на трекерах.

    Теперь разверните за полезность вашего первого комментария.

    Reply
  25. Makushimo

    Скажите, я к компу на котором 1С, подключаюсь через RDP, на нем монитора живого нет или выключен.

    Sikuli тут бессильна?

    Reply
  26. kraynev-navi

    (26) Если подключаетесь по RDP, то монитор есть — ваш. Если прогонять через неизвестную заранее виртуалку, то можно подсмотреть результирующий отчет. Более подробно см. предпоследний параграф:

    В моем случае slave-нода запускается с экранным разрешением 1024х768. Запуск осуществляется под пользователем, для которого настроен автологин. И это следует учесть при создании Sikuli-сценариев. Возможно, есть более удачный способ запуска. Как проверить разрешение – в отчете есть информация на эту тему:
    Reply
  27. Makushimo

    (27) Я подключаюсь по RDP настраиваю сценарий, вешаю его на автозапуск и забиваю болт.

    Автозапуск прогоняет тест на сервере, где нет монитора и я в этот момент не смотрю на процесс через RDP.

    Sikuli работает через скриншоты экрана. Так?

    Значит если не с чего делать скриншоты, то и тест не пройдет. Верно?

    И что такое slave-нода вообще ни разу не понятно.

    Reply
  28. Makushimo

    Вот вы пишете: «Как человек, написавший не одно приложение на AutoIt..»

    А можете помочь со скриптом, который нажимает кнопку «ОК» в форме договора?

    утилита AutoIt Window info форму договора не воспринимает как окно, а кнопку «ОК» вообще не выделяет. выделяет только командную панель формы.

    То есть написать скрипт нажимающий «ОК» на форме написать вообще не реально?

    Reply
  29. kraynev-navi

    (28) «вешаю на автозапуск» — это в Планировщике указываете скрипт? От чьего имени? Любого вошедшего пользователя, вне зависимости от регистрации? Это наверняка, важно, но затрудняюсь ответить как надо сделать, ибо такой способ использования не пробовал. Возможно, вы правы, если пользователь не залогинился, монитора не будет, взаимодействовать не с чем.

    Рабочий вариант со slave-нодой — запуск тестов на jenkins (https://jenkins.io/), настройка автологина под пользователем из под которого запускается агент jenkins

    Reply
  30. kraynev-navi

    (29) 1С с AutoIt это еще та связка. Вы правы, там отдельного окна как бы нет. Со скриптом, увы, не помогу. В качестве идеи — можно попробовать «послать» туда хоткей ctrl+enter, если ОК дефолтная кнопка.

    Reply
  31. Makushimo

    (30)

    Рабочий вариант со slave-нодой — запуск тестов на jenkins

    В двух словах не вдаваясь в детали можно прояснить, что это значит? Запускается сеанс RDP под указанным пользователем, и так получаем как бы монитор? то есть сервер сам к себе под RDP подключается? и если нет монитора, то все равно заработает?

    Reply
  32. kraynev-navi

    (32)

    Не так. и RDP не нужен и монитор тоже. Нужен пользователь с автовходом. Как-будто при старте винды сразу кто-то вошел и работает.

    — создаем на виртуалке спецпользователя локального админа, выставляем ему AutoAdminLogon выставляем в 1. (подробнее, например, тут: https://support.microsoft.com/ru-ru/help/324737/how-to-turn-on-automatic-logon-in-windows, с картинками: https://interface31.ru/tech_it/2011/07/kak-vklyuchit-avtomaticheskiy-vhod-v-sistemu-dlya-windows-7-i-windows-server-2008.html)

    — создается батник на ведомой машине, который запускает стандартный агент jenkins «java -jar slave.jar….»,

    — в планировщике делаем задачу на запуск этого батника из под спецпользователя

    При включении/перезапуске виртуалки винда поняла, что пользователь уже «вошел». И взаимодействует с его рабочим столом.

    Пока писал нашел вот такой ссыль: http://qaru.site/questions/225464/how-to-run-gui-tests-on-a-jenkins-windows-slave-without-remote-desktop-connection

    Reply
  33. kraynev-navi

    (29)

    То есть написать скрипт нажимающий «ОК» на форме написать вообще не реально?

    Делал в основном приложения, связанные с браузерами, вебом. Связку 1С и AutoIt никогда не использовал для анализа форм, поэтому сказать «точно нет» или «точно да» не могу.

    Reply
  34. Makushimo

    (33) фигасе !

    Спасибо. Покурю эти ссылки и что нибудь про jenkins.

    Reply
  35. Makushimo

    Подскажите, пожалуйста такой вопрос.

    Можно ли из 1С одновременно запустить два процесса Sikuli ?

    Я пытаюсь решить такую задачу:

    Скрипт1 Sikuli нажимает кнопку, 1С выкидывает исключение

    Скрипт2 Sikuli выполняется в цикле и он нажимает кнопку закрытия окна исключения платформы.

    Скрипт 2 через обработчик ожидания запускаю на форме с интервалом 1 сек.

    затем запускаю Скрипт1,

    когда платформа выдает исключение, то нажатие кнопки как бы висит и скрипт ждет

    по задумке Скрипт2 должен найти окно исключения и закрыть его. Тогда Скрипт1 продолжит свою работу.

    Эта идея работает если фоновый скрипт запущен один, а основное действие с формой делаю программно из 1С (например, открыть форму)

    Но когда два скрипта, то такое ощущение что Скрипт 2 фоном запускается, затем Скрипт1 как бы выбивает его, т.е процесс Sikuli переключается на него, а фоновое выполнение непонятно куда девается.

    Reply
  36. kraynev-navi

    (36) Не очень понял, что за чем, если честно.

    Идея с циклическим запуском и двумя скриптами, имхо, не правильная.

    Может так: в начале работы 1С запускает сикули-скрипт, который реализует оба функционала — нажатие кнопки и закрытие окна исключения, после отработки 1С. Просто предусмотреть условие, по которому сикули завершит выполнение (+ аварийный выход по таймауту).

    Reply
  37. Makushimo

    (37)

    ну в итоге я так и сделал.

    Reply
  38. Makushimo

    Скажите, а можно ли в отчет Allure подсунуть скриншот ошибки, которая появилась в процессе выполнения теста?

    Допустим скриншот как-то уже есть.

    Reply
  39. kraynev-navi

    (39) Наверняка можно. Но не пробовал. Если через xunit, то залезть в функционал создания аллюра и посмотреть куда можно допилить вставку скриншотов. Посмотреть можно, например, в VB

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *