Автоматизация десктопных приложений под Mac OS

Всем привет. :blush:
Есть вопрос на засыпку (когда-то, в далеком 2011 году, он тут уже звучал):

  1. Автоматизация под Mac OS: как? что лучше использовать (всякие сикули и пропрочая картинко-кликалки не интересуют :blush:)? поделитесь опытом, если не трудно, не жалко и такой имеется. :blush:
  2. Кто-то уже использовал фичи в XCode для тестирования UI десктопного приложения?

Зачем это нужно: портируется десктопный qt-проект с винды на Mac OS. В винде все четко работает с помощью MS UI Automation, поэтому хотелось бы сделать что-то похожее и под Mac OS, и, возможно, в будущем на линуксе.

Заранее спасибо за советы.

1 лайк

а зачем для qt проекта нужно еще что-то кроме самого qt? тесты отлично пишутся на нем же

Посмотрите на Linux Desktop Testing Project - Wikipedia
Из всех названных вами ОС он поддерживает все, плюс есть поддержка QT с версии 4.
Просмотрел их код на гитхабе, и вродебы они используют сигналы для доступа к элементам, так что кнопки нажимаются не по распознаванию образов (как в Сикули) а через ядро, что радует.

2 лайка

вчера взял на вооружение ATOMac :blush:

Рекомендую Squish. Он, конечно, глючноват, но в целом хорош

Полноценные GUI-тесты чисто на Qt не напишешь

1 лайк

дорого, однако, нынче на пока что меленькую компанию покупать Squish))

Да что вы говорите? У меня несколько сотен полноценных GUI тестов на QT. Как раз полноценных вы только на них и напишите, ибо доступ ко всем внутренностям вы кроме как изнутри самого QT практически никак не получите.

А что такое по вашему Squish?:slight_smile: Как он работает?:slight_smile:

что Вы подразумеваете под словом “внутренности”? :blush:

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

а если blackbox?

При тестировании с++ приложений black box может быть применимо только в случае, если у вас нет достаточных ресурсов для того чтобы нанять кого-то больше чем просто кликателя кнопочек, да и даже в таком случае дешевле будет настроить любой monkey testing tool. Как вы будете в блэк боксе разбираться почему оно падает? Как вы вообще нормально адекватно блэк боксом протестируете реальное приложение, в котором, повторюсь, есть больше пары экранов и трех кнопок?

Простейший пример, который можно приводить бесконечно - в приложении есть логин. На кнопке навешан сигнал вызова функции, сигнал сломали, функция работает, но дальше ничего не проходит или если у вас проблема с внешним логин сервисом? Что выяснит black box? Что все 100% тестов упали. Не работает ли 100% функционала приложения? Неизвестно. Почему? Потому что в ините вашего каждого теста мануальные шаги на вход в приложение. Что сделает тест, который сумеет залогиниться востальных тестах через вызов внутренней функции или через ее мок? Ответ - протестировать все внутри, отрапортовав о том что падает логин + результат всех внутренних тестов.
Какая будет стабильность ваших тестов, когда их будет несколько сотен? Никакой, вы только и будете заниматься тем, что чинить их и перезапускать каждый раз.

Black box вообще никак себя не оправдывает в реальных проектах с автотестами. Посмотрите еще старинное видео @asolntsev, где он рассказывает про мок сторонних сервисов, идея простая и гениальная, но к сожалению практически никогда не воплощаемая в реальность.

1 лайк

На руби есть GitHub - AXElements/AXElements: UI Automation for OS X (не картинко-кликалка) :smile:
Или можно попробовать нативный Automator, синтаксис очень прост.

Не такое уж оно и старинное, меньше года вообще-то :smile:

2 лайка

А такую встроенную тулзу как applescript не пробовал?
У нее очень много возможностей бегать по UI элементам приложения. Эта тулза интегрирована в систему, из нее можно вызывать шеловские команды. А разобраться с доступом к UI элементам приложения поможет такая тулза как UI Browser.

Я почему-то думал что несколько лет назад ее смотрел :slight_smile: