2013-04-14 2 views
2

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

У меня проблема с секциями. У меня есть TableViewConrtoller в NavigationController. Во-первых, как я могу достичь TableViewController из кода?

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil]; 
    UINavigationController *nav = [storyboard instantiateInitialViewController]; 
    GoodHabitsViewController *good = [nav.viewControllers objectAtIndex:0]; 

    NSLog(@"%@", good.addButton.title); 

    [good performSegueWithIdentifier:@"AddGoodHabitSegue" sender:good]; 

NSLog написать правильное значение, название кнопки «добавить», а в журнале появится «добавить». Но после performSequeWithIdentifier появляется следующее предупреждение:

Warning: Attempt to present <AddGoodHabitViewController: 0x74c8310> on <UINavigationController: 0x764e120> whose view is not in the window hierarchy! 

Как я могу выполнить seque, как я могу нажать AddButton (UIBarButton) и как я могу сделать ссылку на AddGoodHabitViewController (где точки SEGUE).

ответ

4

Существует два варианта тестов, которые могут выполняться на платформе OCUnit - так называемые «прикладные» тесты и так называемые «логические» тесты.

  • Только тесты «приложения» позволяют осуществлять UIViewControllers, UIViews и т. Д. Если вы указали «создать целевую аудиторию» при создании проекта, он будет использовать стиль «приложение». В противном случае добавление teset target позже, по умолчанию, использует «логический» стиль. Для сокрытия существующей цели теста использовать «приложение» тесты, TwoBit Labs имеет хороший: guide

  • Другим способ осуществить код вплоть до контроллера представления и взглядов использовать Cedar BDD test framework. Тесты Cedar запускаются внутри приложения iOS, поэтому, помимо возможности тестирования ViewControllers и Views, его можно также протестировать на любом устройстве или симуляторе.

  • UIAutomation позволяет выполнять автоматические функциональные тесты, управляя самими пользовательскими интерфейсами (в отличие от использования кода пользовательского интерфейса). Проблема, с которой я сталкиваюсь в UIAutomation, заключается в том, что, насколько мне известно, ее невозможно выполнить из cmd-линии, что затрудняет включение в автоматизированный тестовый пакет, который будет запускаться сервером непрерывной интеграции. , , , кто-то может придумать обход для этого, используя Automator.app или аналогичный, но пока никто не имеет.

  • Calabash - еще одна отличная платформа для тестирования пользовательского интерфейса, и ее можно запустить из CMD-линии, поэтому не имеет ограничений, описанных выше, по адресу UIAutomation.

  • Имейте в виду, что автоматическое функциональное тестирование и тестирование UIViewControllers и Views на уровне кода - это две разные вещи. Последнее, безусловно, имеет ценность и просто требует правильной установки загрузчиков.

Обновление: С последними версиями Xcode 5+, тесты приложений стиля по умолчанию.

+0

Многое, намного лучше, чем мой ответ. Хороший. – jrturton

0

Модульные тесты (т. Е. Те, которые вы получаете при добавлении модульных тестов в проект с помощью шаблона Xcode) не предназначены для тестирования вашего пользовательского интерфейса. Вы должны посмотреть на UI Automation, который позволяет вам координировать действия пользовательского интерфейса с помощью JavaScript.

+0

Я проверил автоматизацию пользовательского интерфейса, но мне нужен объектный инструмент тестирования пользовательского интерфейса. (Я буду генерировать из модели код) –

+0

Насколько я знаю, их нет. Я не понимаю, что вы имеете в виду при создании кода. – jrturton

2

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

Самый простой способ это исправить:

- (void)testExample { 

    // 
    // Arrange 
    // Storyboard 
    // 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 

    // 
    // Arrange 
    // View Controller 
    // 
    UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"ViewController"]; 
    [UIApplication sharedApplication].keyWindow.rootViewController = viewController; 

    // 
    // Act 
    // 
    [viewController performSegueWithIdentifier:@"ModalSegue" sender:nil]; 

    // 
    // Assert 
    // 
    XCTAssertEqualObjects(viewController.presentedViewController.title, @"Second"); 

} 
+0

Как вы тестировали push segues? – fatuhoku

+1

@fatuhoku Я тестирую все. Единственное, что я не могу проверить, это segues из ячеек UITableView, определенных в IB. Кроме того, все можно проверить. Вставляются кнопки. –

+0

Это очень невероятно! Я также обнаружил, что push segues не могут быть проверены на табличных представлениях, потому что они, похоже, не активируют «presentViewController» malarkey. Надеюсь, вы сможете также собирать коллекции коллекций. – fatuhoku

0

Отъезд КИФ. Похоже, в значительной степени то, что вам нужно:

https://github.com/kif-framework/KIF

Это основано на Objective-C рамки пользовательского интерфейса тестирования, который интегрируется с рамками Accessibility встроенной в приложение (как UI Automation).

Или это руководство, чтобы убедиться, что это то, что вы хотите:

http://www.raywenderlich.com/61419/ios-ui-testing-with-kif

Надеется, что вы нашли свое решение!

Смежные вопросы