2015-07-20 3 views
12

Xcode 7 † bietet eine neue Möglichkeit zum direkten Testen Ihrer Benutzeroberfläche, einschließlich eines neuen Testziels "iOS UI Testing Bundle" (oder "OS X").Xcode 7: Ist die Kluft zwischen App-Tests und UI-Tests unüberbrückbar?

enter image description here

Im UI Prüfziel, scheint es dort zu dem Modell oder Klassen keine integrierten Zugriff ist, dass Ihre App enthalten. Z.B. [UIApplication sharedApplication] wäre nicht von Ihren UI-Tests aufrufbar. Dies bedeutet, dass "App-Tests" und "UI-Tests" in einer möglicherweise unüberbrückbaren Kluft existieren.

Wie bereits erwähnt here:

Das Problem ist, dass Xcode UI-Tests erlauben keinen Zugriff auf die tatsächliche Anwendung. Fragen

:

  1. Kann diese Kluft überbrückt werden? Wenn ja, wie im Detail, mit Build-und Linker-Einstellungen und möglicherweise eine funktionierende xcodeproj auf github.
  2. Wo könnte eine klare Aussage dieser Kluft gefunden werden, in Apple Docs.

† Zum Zeitpunkt des Schreibens, Beta-Software.

Antwort

7

Black-Box-Tests

UI Testing ist ein black-box testing Rahmen. Sie sollten nichts über die Implementierung des von Ihnen getesteten Codes wissen müssen.

Zum Beispiel sollten Sie nur darauf achten, dass sich der Wert einer Beschriftung ändert, nicht, dass der Controller die richtigen Daten an die Ansicht weitergegeben hat. Sie können sich UI-Tests vom Benutzer der App vorstellen. Es ist ihr egal, wie Ihre ItemsViewController funktioniert (oder sogar, dass es existiert), also warum sollten die UI-Tests?

Getting it "arbeiten"

aber sagen, dass ich verstehe Ihre Frustration. Es wäre großartig, wenn Sie einen View-Controller hochfahren und dann mit UI-Tests und Assertions herum tippen könnten. Ab Beta 5 ist dies jedoch nicht möglich.

Interessant ist, dass Sie Instanzen Ihrer App-Objekte mit einem einfachen @testable import ModuleName am oberen Rand Ihrer UI-Tests erstellen können. Beachten Sie, dass Sie nicht über die .tap()-ähnliche Methoden interagieren können, da es eine UI* Klasse ist, nicht eine XCUI* eins.

Betrachten Sie Donut als den Modulnamen der Anwendung.

import XCTest 
@testable import Donut 

class DonutUITests: XCTestCase { 
    let app = XCUIApplication() 

    override func setUp() { 
     continueAfterFailure = false 
     app.launch() 
    } 

    func testItemsViewController() { 
     let controller = ItemsViewController() 
     controller.addItemButton.tap() // <---- UIButton does not respond to tap()! 
    } 
} 
+1

Nehmen wir an, Sie haben eine App mit dynamischen Inhalten. Sie möchten die Benutzeroberfläche bearbeiten und dann etwas überprüfen, das auf dem Bildschirm nicht sichtbar ist. Möglicherweise müssen Sie einen bestimmten Status überprüfen, bevor Sie entscheiden, welche Methode aufgerufen werden soll. Dieser Status ist nur bekannt, wenn Sie eine Objective-C-Methode im App-Code abfragen. Es ist schön, eine Mischung aus beiden Testmethoden zu haben, ohne jeden einzelnen Blick selbst gestalten zu müssen. –

+1

Nach den Kommentaren von Teresa möchten Sie möglicherweise Ihr Projekt in einem bestimmten Zustand initialisieren, bevor Sie UI-Tests durchführen. – gone