Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Autotest api #754

Closed
wants to merge 41 commits into from
Closed

Conversation

agaltsoff
Copy link

@agaltsoff agaltsoff commented Nov 28, 2017

Реализация #753

Сделанные доработки

Реализован минимальный набор методов API автоматического тестирования и утверждений, позволяющий оценить синтаксис законченного теста.

Утверждения в УтвержденияBDD

ПодключениеКлиентаТестирования
ОтключениеКлиентаТестирования
ОткрытиеФормыСписка
ПоискВСписке
УстановкаОтбораВСписке
ОткрытиеВСписке
КоличествоСтрокВСписке
Проведение

Описание

Методы для работы с механизмом автоматизированого тестирования содержатся в ТестКлиенты.
УтвержденияBDD использует эти методы в утверждениях автоматизированого тестирования.

ТестКлиенты сохраняет значение окна и элемента, которые были получены при выполнении каждого метода. Последующие действия выполняются относительно этих значений. Эти значения можно получить с помощью соответствующих методов интерфейса ТестКлиенты.

Открытие окон в ТестКлиенты это процедуры, поиск значений - булевые функции

ТестКлиенты выполняет действия без проверок, все проверки выполняются в УтвержденияBDD.

Пример теста

    Ожидаем.ПодключениеКлиентаТестирования("Администратор", "");

    Ожидаем
        .ОткрытиеФормыСписка("Документ.Документ1", "Документ1")
        .ПоискВСписке(Новый Структура("Номер,Дата", "000000002", "26.11.2017 23:13:37"))
        .ОткрытиеВСписке("Документ1 000000002 от 26.11.2017 23:13:37")
        .Проведение()
    ;

    Ожидаем
        .ОткрытиеФормыСписка("РегистрСведений.РСПодчиненныйРегистратору", "РСПодчиненный регистратору")
        .УстановкаОтбораВСписке(Новый Структура("Регистратор", "Документ1 000000002 от 26.11.2017 23:13:37"))
        .КоличествоСтрокВСписке("Движения документа Документ1 000000002 от 26.11.2017 23:13:37").Равно(1);
    ;

    Ожидаем.ОтключениеКлиентаТестирования();

В тесте только подключается и отключается клиент, тест проходит но приложение клиента не закрывается, потому что отключение вызывается раньше чем откроется окно клиента.
…ты_УтвержденияBDDForms. Проходят тесты подключение, открытие списка, отключение.
… текущей строки, Отключение.

Методы в ТестКлиенты и УтвержденияBDD плюс тесты в Тест_УтвержденияBDDForms. Более-менее устоялась идеология.
…Списке, Проведение

C их помощью реализован тест проведения документа и проверки количества его движений по регистру в Тест_УтвержденияBDDForms.
Тест выполняется на данных \Tests\1Cv8_xUnitFor1CForms.dt.
Конфигурация там из тестовой базы, в один документ добавлена обработка проведения.
…без изменений. Тестовые данные создаются и удаляются в тестах.

Добавил cf тесовой конфигурации из ветки master в \Tests.
В модуль формы Тесты_УтвержденияBDDForms добавил процедуры для работы с таблицей параметров на форме. На сервере записываем, на клиенте читаем.
Хотел  использовать для передачи параметров между тестами но потом сделал передачу через контекст ядра.
@artbear
Copy link
Member

artbear commented Nov 28, 2017

Хорошее дополнение,

но мне не нравится, что смешаны 2-е функциональности - Утверждения и работа с тест-клиентом

Предлагаю разделить эту функциональность.
Например,

  • сделать отдельный плагин УправлениеТестКлиентом, в котором и реализовать нужное API
    • если нравится другое название, предлагайте
  • пример кода
ТестКлиент.ПодключениеКлиентаТестирования("Администратор", "");

    ТестКлиент
        .ОткрытиеФормыСписка("Документ.Документ1", "Документ1")
        .ПоискВСписке(Новый Структура("Номер,Дата", "000000002", "26.11.2017 23:13:37"))
        .ОткрытиеВСписке("Документ1 000000002 от 26.11.2017 23:13:37")
        .Проведение()
    ;

    ТестКлиент
        .ОткрытиеФормыСписка("РегистрСведений.РСПодчиненныйРегистратору", "РСПодчиненный регистратору")
        .УстановкаОтбораВСписке(Новый Структура("Регистратор", "Документ1 000000002 от 26.11.2017 23:13:37"))
        .КоличествоСтрокВСписке("Движения документа Документ1 000000002 от 26.11.2017 23:13:37").Равно(1);
    ;

    Ожидаем.ОтключениеКлиентаТестирования();

или предложите другие варианты

@agaltsoff @VladFrost @nixel2007 @EvilBeaver что скажете?


УбедитьсяЧтоЭтоСпискок();

ТестируемыйЭлемент.ВыделитьВсеСтроки();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Здесь опасность: если в списке больше 1000 строк, платформа выведет предупреждение и выполнение будет приостановлено, пока пользователь вручную не закроет предупреждение.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вот да, надо придумать как количество строк в таблице получать.
Нормального метода не нашёл.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Все же странно в сценарных тестах увидеть такой объем данных в списках.
Про данную особенность помнить надо, но решать ее сейчас особого смысла нет.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kuntashov как вариант, если тесты прогоняются на типовой демобазе: там вполне может быть несколько тысяч строк в списках.

&НаКлиенте
Функция ЗабытьЗапущенныйКлиент(ИмяПользователя, Порт)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Про эту функцию я не понял, как она должна использоваться.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Удалять клиента из списка после отключения.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Это да. Но она не экспортная, и вызовов её в этом модуле нет.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Хотел использовать, но как-то обошлось без неё потом. Удалю.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Удалил.

#Область ИнтерфейсАвтоматическогоТестирования

&НаКлиенте
Функция ПодключениеКлиентаТестирования(ИмяПользователя = "", Пароль = "", Порт = 1539) Экспорт
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Почему номер порта стал 1539? По-умолчанию же 1538.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1538 менеджер тестирования использует по умолчанию.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

И почему здесь нужен 1539?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вот такие ошибки теперь периодически появляются:

{Обработка.ТестКлиенты.Форма.Форма.Форма(106)}: Не смогли установить соединение с тестовым приложением для пользователя Администратор! {Обработка.ТестКлиенты.Форма.Форма.Форма(97)}: Ошибка при вызове метода контекста (УстановитьСоединение): Ошибка подключения к клиенту тестирования. Менеджер не может управлять сам собой.: Ошибка подключения к клиенту тестирования. Менеджер не может управлять сам собой.

Copy link
Author

@agaltsoff agaltsoff Nov 30, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Там ещё веселее всё. Конфигуратор при запуске Предприятия берёт параметры из строки Стартера даже те, которые были туда добавлены после запуска Конфигуратора.
Т.е. я запустил конфигуратор, потом добавил /TESTCLIENT чтобы запустить эту базу вручную в режиме тестирования и после этого уже запустил Предприятие как менеджер тестирования из Конфигуратора.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Для запуска из конфигуратора лучше здесь рулить:
2017-12-01 09_12_25

Copy link
Author

@agaltsoff agaltsoff Dec 1, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Да я так и делаю. Просто после того как конфигуратор запустил понадобилось эту же базу запустить как тест клиент. В стартере поставил параметр в строке запуска, запустил, потом через какое-то время запустил предприятие из конфигуратора. И он взял этот параметр из стартера, хотя на момент запуска конфигуратора флага ещё не было.
И вообще, почему конфигуратор берёт параметры предприятия из списка баз из строки с которой он был запущен? Странно...
Сейчас просто сделал отдельную строку для запуска базы в режиме клиента тестирования чтобы не путаться.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Что-то нужно было проверить руками, разовый случай.


#КонецОбласти

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Пустые строки

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Чтобы последнюю строку с текстом можно было поместить в середину монитора при редактировании.


Если ИнформацияОбОшибке <> Неопределено Тогда
ОписаниеОшибки=
НСтр("ru='Описание=';en='Description='") + ИнформацияОбОшибке.Описание + "'" + Символы.ПС +
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Здесь хочется видеть СтрШаблон()

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Это из синтаксис-помощника))
Исправлю.


&НаКлиенте
Процедура УбедитьсяЧтоЭтоСпискок()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Опечатка в имени процедуры

Copy link
Author

@agaltsoff agaltsoff Nov 29, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Исправлю))

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

&НаКлиенте
Функция ПоискВСписке(СтруктураПоиска) Экспорт
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Чем "ПоискВСписке" отличается от "НайтиВСписке"?

Copy link
Author

@agaltsoff agaltsoff Nov 29, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

УтвержденияBDD.ПоискВСписке вызывает ТестКлиенты.НайтиВСписке, анализирует результат и при возникновении ошибки вызывает ВызватьОшибкуПроверки.
ТестКлиенты.НайтиВСписке непосредственно выполняет поиск в списке через механизм автотестирования.
Т.е. ТестКлиенты это low level, УтвержденияBDD это high level.
Названия методов в утверждениях выбраны так чтобы они сочетались с Ожидаем.

СтатусыРезультатаТестирования = Новый ФиксированнаяСтруктура(СтатусыРезультатаТестирования);

#КонецОбласти

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Пустые строки

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Чтобы последнюю строку с текстом можно было поместить в середину монитора при редактировании.

@agaltsoff
Copy link
Author

agaltsoff commented Nov 28, 2017

@artbear

Внутри так всё и происходит. УтвержденияBDD при инициализации загружает ТестКлиенты и вся работа с механизмом автоматического тестирования идёт через него.

Например Ожидаем.ОткрытиеВСписке вызывает ТестКлиенты.ОткрытьВСписке, анализирует результат и в случае ошибки вызывает стандартное исключение которое потом красиво выводится.

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

Например то же ОткрытиеВСписке вроде бы относится к автотестированию, но если мы проверяем настройки прав доступа, это уже и сам тест.

@artbear
Copy link
Member

artbear commented Nov 28, 2017

Внутри может быть все что угодно.
Мы же говорим об API, которое в дальнейшем будут юзать клиенты продукта.
Я хочу развязать API Утверждений и API ТестКлиента и не смешивать.

Пусть методы API ТестКлиента внутри себя вызывают необходимые утверждения и выбрасывают красивые ошибки.

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

@artbear
Copy link
Member

artbear commented Nov 28, 2017

Методы API должны помочь клиенту продукта.
Например, в коде метода может быть инкапсулировано общее для разных тестов поведение.
Мы об этом в гиттере вроде бы уже говорили.

@artbear
Copy link
Member

artbear commented Nov 28, 2017

Я не хочу постоянно дорабатывать Утверждения.
Их цель - простые утверждения.

Более сложные утверждения д.б. реализованы в других плагинах.
Например, так уже сделано в ЗапросыБДД, Сериализатор и других.
ТестКлиент должен быть сделан по этой же схеме :)

Тем более, что самое сложное (методы) Вы уже реализовали.
Теперь их нужно просто перенести в новый плагин.

@agaltsoff
Copy link
Author

agaltsoff commented Nov 28, 2017

Понятно. Так даже проще будет. Из Утверждений работу с автотестированием убираем в отдельный плагин для Утверждений автотестирования?

@artbear
Copy link
Member

artbear commented Nov 28, 2017

Только предлагаю новый плагин все-таки назвать "ТестКлиент", а не "Утверждения автотестирования" :)

@agaltsoff
Copy link
Author

Так есть же уже один ТестКлиенты. Путаницы не будет?

@agaltsoff
Copy link
Author

agaltsoff commented Nov 28, 2017

Ещё есть УтвержденияПроверкаТаблиц. Видимо утверждения для специальных случаев. На мой взгляд по аналогии будет УтвержденияBDDАвтотест. BDD потому что ОткрытиеВСписке сочетается с Ожидаем. Без BDD тогда Открыть...

Однако как скажете. Вы же здесь BDFL ))

@artbear
Copy link
Member

artbear commented Nov 28, 2017

Все-таки мне больше нравится

  • ТестКлиент - для работы с одним тест-клиентом
  • ТестКлиенты- управление тест-клиентами
    • похоже, пока не выпустили релиз, лучше назвать МенеджерТестКлиентов

@artbear
Copy link
Member

artbear commented Nov 28, 2017

Честно, УтвержденияBDDАвтотест - жесть. Длинно, странно, невнятно

Потом все время по коду удивляться над
УтвержденияBDDАвтотест.ОткрытиеФормыСписка(....) :(

ПерейтиКСтроке на пустом списке вызывает ошибку. Добавил везде перед вызовом этой функции проверку количества строк в списке.
…н, когда они не проходят все предыдущие окна закрываются
…а, ТестКлиенты переименовал в МенеджерТестКлиентов
В xddTestRunner инициализацию плагинов сделал после загрузки всех плагинов чтобы плагину в инициализации был доступен любой другой плагин.
@agaltsoff
Copy link
Author

В результате

  • ТестКлиенты переименовать в МенеджерТестКлиентов
  • API автотестирования перенести из УтвержденияBDD в новый плагин ТестКлиент

@agaltsoff Ждем доработки

@artbear Сделал.

@artbear
Copy link
Member

artbear commented Dec 14, 2017

@agaltsoff Очень много изменений/коммитов.
Я несколько запутался :( - есть изменения в конфигурации, есть в файлах и т.п.

Можешь достаточно коротко описать финальное состояние ?

…лагиныНаСервере

Поисправлял мелкие ошибки менеджере тест клиентов. Ошибки ещё остались.
В ТестКлиент заменил старое название плагина ТестКлиенты на МенеджерТестКлиентов, как название файла плагина.

Отладка по HTTP внешних обработок БСП заработала после перерегистрации библиотек ИР.
Наимнование обработки в справочнике ДОЛЖНО СОВПАДАТЬ С ИМЕНЕМ ФАЙЛА обработки.
…ке через расширенный поиск.

В поле даты при выборе открывалось окно календаря вместо окна выбора типа данных и текущее окно становилось неопределено.
В поле строки окно выбора типа данных не открывалось, но проверка выдавала что оно открыто.
Раньше вроде такого не было. Смена платформы повлияла?

Отладка вызова методов управляемых форм без их открытия через внешние обработки БСП по HTTP пока работает.
Не работает установка отбора перед поиском в списке чтобы поиск выполнялся быстрее.
Не работает вызов метода Утверждений BDD в тест клиенте потому что они неопределены хотя инициализация объекта плагина выполняется.

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

Утверждения BDD вызывались у объекта обработки ТестКлиент, а он не был инициализирован.
Пробовал инициализировать объекты форм плагинов при получении форм при тестировании на клиенте, но не до конца разобрался с типами.
Сделал использование утверждений в тест клиенте BDD через форму плагина УтвержденияBDD как в-общем то и надо было сделать изначально.

Вопрос, нужно ли инициализировать объекты форм плагинов при использовании плагинов в виде форм на клиенте и как это сделать.
@agaltsoff
Copy link
Author

@artbear Да там вроде кроме

ТестКлиенты переименовать в МенеджерТестКлиентов
API автотестирования перенести из УтвержденияBDD в новый плагин ТестКлиент

должны быть только изменения для тестирования через внешние обработки БСП.

Я тогда посмотрю по diffview какие ещё bsl файлы менялись кроме ТестКлиент МенеджерТестКлиентов УтвержденияBDD из тех что остались и сделаю описание изменений.

@artbear
Copy link
Member

artbear commented Jan 9, 2018

@agaltsoff Ага, жду описания

@agaltsoff
Copy link
Author

agaltsoff commented Jan 9, 2018

В итоге сделал branch с того места где мы договорились

  • ТестКлиенты переименовать в МенеджерТестКлиентов
  • API автотестирования перенести из УтвержденияBDD в новый плагин ТестКлиент

и скопировал туда конечный результат всех последующих изменений. Вроде получилось то что надо. Видны только результаты изменений без промежуточных шагов. Назвал autotest. Из него сделал pull request, описание там, а этот закрою.

Пробовал конечно join commit и merge, но не взлетело. Видимо не до конца разобрался с этим ещё.

@agaltsoff agaltsoff closed this Jan 9, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants