2015-11-04 7 views
11

Sto sperimentando con i test XCTestCase (XCode 7) e sono appena incappato in un problema con un UIView, in cui ho un UITableView con molte celle (4000+).XCTestCase - Test dell'interfaccia utente iOS - gestione di UITableViews con molte celle

Quando l'app è in esecuzione normalmente, vengono visualizzate solo le celle visibili e non vi è alcun problema di prestazioni. Tuttavia, se eseguo l'app nel contesto della registrazione di un XCTestCase e navigo in questa schermata, il simulatore si blocca, apparentemente perché ogni singola cella viene visualizzata come se fosse visibile. Se provo a scrivere manualmente la navigazione ed eseguo XCTestCase, la testcase fallisce subito dopo aver navigato su questa schermata, uscendo con un "UI Test Failure - Failed to get refreshed snapshot", apparentemente ancora perché tutte le celle sono state renderizzate e questo non finisce in tempo

Penso che questo abbia a che fare con il fatto che il framework di test costruisce un intero metamodello dello schermo sotto la visualizzazione, aggiungendo ognuna delle oltre 4000 celle nella gerarchia della vista.

Ho provato ad aggiungere un'aspettativa, sperando che questo avrebbe dato al contenitore di test abbastanza tempo per completare il rendering di tutte le celle, ma questo non funziona.

Esiste una soluzione alternativa? È in qualche modo possibile saltare la costruzione di una parte della gerarchia dell'albero dell'interfaccia utente o qualcosa del genere? Il mio obiettivo è poter scrivere i test dell'interfaccia utente per questa schermata.

+0

Potresti mostrare il codice di prova? Ths – glm4

+0

È una cella personalizzata con 3 etichette e 2 immagini. Sono riuscito a risolverlo usando [tableView indexPathsForVisibleRows]; per determinare che la cella è visibile e se non restituisce [UITableViewCell new] per i miei test, quindi la cella utilizzata è abbastanza semplice, ma non è quello che sto cercando. Sto pensando di far in modo che l'albero dell'interfaccia utente sia costruito pigramente, ma non penso che sia possibile ora. Sarebbe bello se questi casi di test xc ui potessero essere configurati in modo da non avere effetti collaterali così gravi (come il caricamento di tutte le celle in questo caso). –

risposta

1

Ho avuto lo stesso problema e sono d'accordo che è frustrante dover aspettare che l'intera tabella si carichi, ma è quello che dovevo fare usando la seguente soluzione alternativa.

questo potrebbe non essere quello che stai cercando, ma se può aiutare gli altri:

Fondamentalmente io sto contando le cellule nella tabella 2 volte di seguito, se non sono uguali, che significa che la tabella è ancora carico. Mettilo in un loop e fallo fino a quando entrambi i conteggi restituiscono lo stesso numero, il che significa che il caricamento della tabella è terminato. Metto quindi un arresto di 30 secondi in modo che se questo richiede più di 30 secondi, il test fallirà (questo è stato abbastanza tempo nel mio caso). Se la tua tabella impiegherà più tempo di quella potresti aumentare il numero a 180 per 3 minuti ecc ...

let startTime = NSDate() 
    var duration : TimeInterval 
    var cellCount1 : UInt = app.tables.cells.count 
    var cellCount2 : UInt = app.tables.cells.count 
    while (cellCount1 != cellCount2) { 
     cellCount1 = app.tables.cells.count 
     cellCount2 = app.tables.cells.count 
     duration = NSDate().timeIntervalSince(startTime as Date) 
     if (duration > 30) { 
      XCTFail("Took too long waiting for cells to load") 
     } 
    } 
    //Now I know the table is finished loading and I can tap on a cell 
    app.tables.cells.element(boundBy: 1).tap() 
Problemi correlati