2015-07-20 16 views
12

Xcode 7 † ma nowy sposób testowania interfejsu użytkownika bezpośrednio, w tym nowy cel testowania "Pakiet testowy interfejsu iOS" (lub "OS X").Xcode 7: Czy przepaść między testami aplikacji i testami interfejsu użytkownika jest niemożliwa do pokrycia?

enter image description here

W celu testowania UI, wydaje się, że nie ma wbudowanego w dostępie do modelu lub klas, które obejmują swoją aplikację. Na przykład. [UIApplication sharedApplication] nie będzie można wywoływać z testów interfejsu użytkownika. Oznacza to, że "testy aplikacji" i "testy interfejsu użytkownika" istnieją w potencjalnie nieprzeniknionej przepaści.

Jak stwierdzono here:

Problem polega na tym, że testy UI Xcode nie zezwala na dostęp do aktualnej aplikacji.

Pytania:

  1. Może to być zmostkowane przepaść? Jeśli tak, to w jaki sposób, w szczegółach, z ustawieniami kompilacji i linkera i prawdopodobnie działającym na githubie xcodeproj.
  2. Gdzie można znaleźć wyraźne stwierdzenie tego podziału w dokumentach firmy Apple.

† W chwili pisania tego tekstu, oprogramowanie beta.

Odpowiedz

7

testy czarnej skrzynki

UI Testing jest black-box testing ramy. Nie powinieneś wiedzieć o implementacji testowanego kodu.

Na przykład należy pamiętać, że wartość na etykiecie zmienia się, a nie, że kontroler przekazał odpowiednie dane do widoku. Możesz myśleć o testowaniu interfejsu użytkownika z perspektywy użytkownika z perspektywy Twojej aplikacji w wersji. Ona nie dba o to, jak działa twoja ItemsViewController (a nawet, czy ona istnieje), więc dlaczego testy UI?

Getting to do "pracy"

Mając na uwadze powyższe, rozumiem twoją frustrację. Byłoby wspaniale, gdybyś mógł uruchomić kontroler widoku, a następnie korzystać z Testowania interfejsu użytkownika i tworzenia asercji. Jednak od wersji Beta 5 nie jest to możliwe.

Co ciekawe, można utworzyć instancje obiektów aplikacji za pomocą prostego kodu @testable import ModuleName u góry testów interfejsu użytkownika. Zauważ, że nie możesz w rzeczywistości wchodzić z nim w interakcję za pomocą metod podobnych do .tap(), ponieważ jest to klasa UI*, a nie .

Zastanów się, czy nazwa modułu to Donut.

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

Załóżmy, że masz aplikację z dynamiczną treścią. Chcesz manipulować interfejsem użytkownika, a następnie weryfikować coś, co nie jest widoczne na ekranie. Lub, być może musisz zweryfikować określony stan przed podjęciem decyzji, która metoda wywołać, a ten stan jest znany tylko poprzez zapytanie o metodę Objective-C w kodzie aplikacji. Fajnie jest mieszać oba sposoby testowania, bez konieczności samodzielnego tworzenia każdego widoku. –

+1

W nawiązaniu do komentarzy Teresy, przed wykonaniem testów interfejsu użytkownika warto zainicjować projekt do pewnego stanu. – gone

Powiązane problemy