Поиск достойной схемы внедрения среды приемочных испытаний с использованием собственных технологий Objective-C & Mac

Задний план

Я ищу способ реализовать схему, аналогичную той, которую использует библиотека Frank, для реализации «Автоматизированных приемочных тестов для родных приложений для iOS», но я хочу, чтобы эта схема основывалась на родных технологиях iOS / MacOSX. Извините за следующий TLDR но он заслуживает подробного объяснения.

1. Вот краткий обзор того, как работает Фрэнк:

он имеет части клиента и сервера.

Серверная часть встроена в приложение, которое мы хотим запустить приемочные тесты. Фрэнкские уроки показывают нам, как создать дублируемую цель основной цели приложения и внедрить в нее Frank HTTP-сервер.

Клиентская часть – это, главным образом, Cucumber, который запускает сценарии с обычным текстом: каждый сценарий содержит директивы, которые следует запускать против приложения (заполнить текстовое поле, сенсорную кнопку, убедиться, что на странице есть определенный элемент и т. Д.). Также каждый сценарий запускает свой собственный экземпляр приложения, таким образом обеспечивая новое состояние каждый раз, когда мы вводим новый сценарий.

Клиент (мост Cucumber и Ruby-to-Objective-C) связывается с сервером (HTTP-сервер, встроенный в приложение) через HTTP-протокол. Он использует специальные соглашения, поэтому клиент может сообщить серверу, что приложение должно делать, чтобы можно было выполнить конкретный сценарий.

2. Недавно я нашел следующую статью, написанную автором Фрэнка Пете Ходжсона:

http://blog.thepete.net/blog/2012/11/18/writing-ios-acceptance-tests-using-kiwi/

В нем он предлагает более простой способ написания приемочных тестов для разработчиков, которым не нравится полагаться на внешние инструменты, такие как Cucumber и Ruby. Позвольте мне процитировать самого автора:

Прежде чем начать, позвольте мне пояснить, что я лично не буду использовать этот подход для написания приемочных испытаний. Я предпочитаю использовать язык более высокого уровня, например ruby, для написания таких тестов. Тест-код менее эффективен и более выразителен, предполагая, что вам удобно в рубине. Вот почему я хотел попробовать этот эксперимент. С течением времени я говорил со многими разработчиками iOS, которые не умеют писать тесты в рубине. Они более удобны в Objective-C, чем что-либо еще, и хотели бы написать свои тесты на том же языке, который они используют для своего производственного кода. Справедливо.

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

Действительно, как это было описано Питом, можно запустить приемочные тесты, используя только настройку Kiwi / PublicAutomation, размещенную в простой цели OCTests. Мне очень понравилось, потому что:

  • Это просто чистый C / Objective-C. Было очень легко создать начальную группу C-помощников, которые выглядят как помощники Capybara :

tapButtonWithTitle, fillTextFieldWithPlaceholder, hasLabelWithTitle и так далее …

  • Он не требует внешних инструментов и языков: нет необходимости в Cucumber / Ruby или что-то еще. В самой NativeAutomation используется только PublicAutomation, которую использует Фрэнк. PublicAutomation необходима для имитации взаимодействия пользователя на экране приложения: касается, заливки, жесты …

  • Это очень удобно для запуска этих тестов прямо из Xcode, просто запустив пакет Cocoa Unit Tests. (Хотя сборки в командной строке также легки).

проблема

Проблема подхода Kiwi/PublicAutomation заключается в том, что весь комплект тестирования встроен в комплект приложения. Это означает, что после запуска каждого сценария невозможно сбросить приложение, чтобы заставить его находиться в новом состоянии до того, как начнется выполнение следующего сценария. Единственный способ решить эту проблему – написать Kiwi's beforeEach hook с помощью метода, который выполняет мягкий сброс приложения, например:

 + (void)resetApplication { [Session invalidateSession]; [LocationManager resetInstance]; [((NavigationController *)[UIApplication sharedApplication].delegate.window.rootViewController) popToRootViewControllerAnimated:NO]; [OHHTTPStubs removeAllStubs]; cleanDatabase(); shouldEventuallyBeTrue(^BOOL{ return FirstScreen.isCurrentScreen; }); 

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

Вопрос

Описанная выше проблема заставляла меня задуматься о том, возможно ли реализовать более сложный подход, подобный подходу Фрэнка, со вторым приложением, которое работает отдельно от пакета основного приложения и не полагается на внешние инструменты, такие как Cucumber (Ruby).

Вот как я вижу, как это можно сделать.

Помимо основного приложения (MainApp) есть второе приложение iOS (или Mac OS X) (AcceptanceTestsRunnerApp), которое содержит весь комплект приемочных тестов и запускает этот пакет против основного пакета приложений:

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


Вопрос в том:

Я не очень хорошо осведомлен о технологиях Mac OSX или iOS, которые позволили бы мне это сделать: я не знаю, можно ли даже настроить приложение Mac OS X / iOS (AcceptanceTestsRunnerApp), которое может взять под контроль основное приложение (MainApp) и запустить сценарии приемочных испытаний против него.

Я буду благодарен за любые мысли / предложения, которые могут иметь люди, которые чувствуют себя более комфортно с помощью собственного инструмента Objective-C для написания приемочных тестов для приложений iOS.


ОБНОВЛЕНО ПОЗЖЕ

… Я прочитал некоторую документацию о XPC-сервисах, но ирония в том, что схема, которую я ищу, должна быть совершенно противоположной схеме документации XPC:

В идеале я хочу, чтобы моя AcceptanceTestsRunnerApp доминировала над MainApp: запускайте ее и контролируйте ее (взаимодействия с пользователем, утверждения о иерархии представлений) через некоторый объект, проксирующий делегат приложения MainApp, в то время как настройка служб XPC предполагает, что служба XPC (AcceptanceTestsRunnerApp) будет подчиняться приложению (MainApp ) и потребует от службы XPC жить внутри пакета приложения, которое я хочу избежать всеми способами.

… Мое текущее чтение – это темы программирования распределенных объектов . Мне кажется, что я найду там свой ответ. Если никто не предоставит мне руководства или указания, я отправлю ответ о своих собственных исследованиях и мыслях.

… Это следующий шаг в моих поисках: Распределенные объекты на iOS .

KIF и порт Жасмин – Cedar для iOS неплохо работают по моему опыту.

Тем не менее, у меня также было много хорошего использования из калабаша , который, как Фрэнк, питается огурцом.

  • Симулятор iphone внезапно начал работать очень медленно
  • Xcode: Scheme scripts vs Целевые скрипты
  • Как мне форматировать дату в строку, включая миллисекунды?
  • Камера SceneKit, как компенсировать изменения правил (ориентации) эйлера
  • Как остановить индексирование в xcode 8?
  • Как найти файл архива приложения IOS?
  • Разметка Mime Encoded-Word в Objective-C
  • Как снизить скорость интернета
  • Core Bluetooth не находит периферийные устройства при сканировании для конкретного CBUUID
  • Невозможно передать обслуживание с Mac на iOS, хотя передача обслуживания с iOS на Mac работает нормально
  • Эквивалент NSOperationQueue в .NET.
  • Interesting Posts

    Как использовать несколько протоколов в Swift с теми же переменными протокола?

    Разница между LLDB и отладчиками GDB

    Word Stemming в iOS – не работает для одного слова

    Как программно изменить клавиатуру в iOS?

    Swift Небалансные вызовы для начала / окончания

    Как представить контроллер представления справа налево в iOS с помощью Swift

    Как исправить сломанное преобразование-происхождение на iOS11 и macOS10.12 Safari?

    Модальный стиль перехода, например, в приложении Mail

    Отключите клавиатуру, когда нажимаете на UITextField с пользовательским inputView

    Позиция UITextfield не анимируется, а ограничение ширины анимировано

    Можно ли изменить цвет одного слова в UITextView и UITextField

    Как я могу сделать центральный поднятый элемент табеля?

    iPhone GPS – Не получать достоверные обновления местоположения

    UITableView reloadRowsAtIndexPaths: кажется, что он разбивает insertRowsAtIndexPaths:

    Как исправить фреймворк с конфликтующими именами в Cocoapods?

    Давайте будем гением компьютера.