Модульное тестирование пользовательского интерфейса iOS (XCode7)

Меня немного смущает новая схема модульного тестирования пользовательского интерфейса, которую Apple выпустила в своей бета-версии XCode7. Я думаю, что это отличная идея, но у меня есть пара вопросов.

это один из методов тестирования, который у меня есть...

func testMetricsProperties() {
    // Used some of the metrics for testing for reference

    let app = XCUIApplication()
    app.scrollViews.descendantsMatchingType(.Unknown).containingType(.StaticText, identifier:"rim").childrenMatchingType(.Button).element.tap()
    app.textFields["_XCUI:Secure"].typeText("")
    app.typeText("\r")
    app.buttons["dash metrics"].tap()

    let element = app.descendantsMatchingType(.Unknown).containingType(.Image, identifier:"darkBackground.png").childrenMatchingType(.Unknown).element.childrenMatchingType(.Unknown).elementBoundByIndex(1).childrenMatchingType(.Unknown).element.childrenMatchingType(.Unknown).element
    let offPlanRevenue = element.childrenMatchingType(.Unknown).elementBoundByIndex(0).staticTexts["OFF PLAN REVENUE"]
    offPlanRevenue.tap()

    XCTAssert(offPlanRevenue.exists);
    XCTAssertEqual(offPlanRevenue.value as! String, "");
}

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

let app = XCUIApplication()
    app.scrollViews.descendantsMatchingType(.Unknown).containingType(.StaticText, identifier:"im").childrenMatchingType(.Button).element.tap()
    app.textFields["_XCUI:Secure"].typeText("")
    app.typeText("\r")
    app.buttons["dash metrics"].tap()
}

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


person Varun Varahabotla    schedule 20.07.2015    source источник
comment
Бьюсь об заклад, вы тоже можете решить эту проблему в быстром использовании tdd"> stackoverflow.com/questions/31534903/   -  person Anish Parajuli 웃    schedule 21.07.2015
comment
Я бы рекомендовал вам использовать методы, например. создайте объект mainController и добавьте методы openMetrics и tapRevenue. Ваш код будет выглядеть как mainController.openMetrics() mainController.tapRevenue() XCTAssert(...). Вы увидите, что все станет читабельнее и проще.   -  person Sulthan    schedule 21.07.2015
comment
Есть ли более эффективный способ, чем создание вспомогательных методов внутри другого класса?   -  person Varun Varahabotla    schedule 22.07.2015


Ответы (1)


Я считаю, что вы ищете, используя методы setUp() и tearDown(). setUp() вызывается перед каждым тестовым методом, а tearDown() вызывается после каждого тестового метода для класса.

override func setUp() {
    super.setUp()
      // Put setup code here. This method is called before the invocation of each test method in the class.
  }

  override func tearDown() {
    // Put teardown code here. This method is called after the invocation of each test method in the class.
    super.tearDown()
  }

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

person Drmorgan    schedule 20.07.2015
comment
вы можете помочь мне здесь stackoverflow.com/questions/31534903/ - person Anish Parajuli 웃; 21.07.2015
comment
Нет. Это не то, что я ищу, потому что в любом случае вам придется перезапустить приложение... что хлопотно - person Varun Varahabotla; 31.07.2015
comment
Если я не запутался в том, о чем вы спрашиваете - так работает модульное тестирование. Если вы тестируете код, исходя из предположения, что сначала он сделал что-то еще, вы столкнетесь с проблемами и ошибками в логике тестирования. Кроме того, будет сложно провести рефакторинг, если что-то резко изменится. Я бы порекомендовал добавить фрагмент кода, который вы всегда должны запускать, чтобы добраться до текущего состояния во вспомогательном методе, как указано в другой ветке комментариев, для удобства, когда вы пишете тесты для этой функциональности в своем приложении. - person Drmorgan; 03.08.2015