Test del codice asincrono: i lunghi posti letto sono accettabili?

3

Sto testando un codice AngularJS usando Selenium. Angolare aggiorna il DOM in ordine imprevedibile, a volte completamente asincrono (tramite setTimeout ), quindi è difficile sapere quando il DOM è stato completamente aggiornato dopo una richiesta AJAX (o se la richiesta AJAX è terminata o meno). (Per questo motivo, tutte le soluzioni che blocca le richieste AJAX ma non quelle di Angular sono instabili.)

Ero completamente preparato a trovare tutti i punti in Angular che ho bisogno di agganciare per rilevare la fine di un ciclo di rendering e iniettare carichi di JS per agganciarli, quindi mi è stato suggerito di aggiungere il sonno fino a quando il risultato non è stabile.

Personalmente, odio davvero dormire nei test. Sembra hacky da morire e rallenta inutilmente i test del selenio già lenti. Ma in questo caso, dormire è molto più semplice e più gestibile.

Quali sono le tue opinioni su questo?

    
posta billc.cn 19.08.2015 - 14:23
fonte

1 risposta

6

Non farlo

I posti letto sono imprevedibili. Non si sa mai quando accade che l'ambiente di test scarichi gli aggiornamenti di Windows quando viene eseguito virusscanner e il timeout è troppo breve. I test diventeranno fragili e inutili perché dovrai eseguire ogni scenario fallito più volte per assicurarti che sia un vero fallimento. E il sonno ti costringe ad aspettare per tutto il tempo del sonno, quindi sei sempre diviso tra i grandi dormi (che raramente falliscono) e i piccoli dormi (che terminano e quindi esegui i test più velocemente)

Invece, Selenium offre Waits incorporato per gestirlo. Questo differisce dal sonno perché l'attesa del selenio continuerà non appena l'elemento che stai aspettando diventa disponibile. Poiché fanno parte del framework di test, non è necessario mantenere questo codice.

Fondamentalmente, la tua chiamata AJAX cambia in modo visibile il DOM: una chiamata remota per recuperare una lista mette l'elemento list con id "myRemoteList" sulla pagina quando il caricamento è terminato e Selenium aspetterebbe quell'elemento per diventare visibile. Il punto è che anche il codice asincrono ha un risultato osservabile e dovresti aspettare che il risultato diventi disponibile. Proprio come faresti se tu fossi sottoposto a test manualmente o se l'utente volesse lavorare con l'applicazione.

Ho impostato i timeout nei miei test per 60 secondi: se non è stato caricato, non si caricherà mai perché è successo qualcosa di brutto e sono anche sicuro che non scadrà perché il mio laptop sta facendo qualche cosa in più.

    
risposta data 19.08.2015 - 15:24
fonte

Leggi altre domande sui tag