Abbiamo appena iniziato a sviluppare un'app Web con AngularJS e stiamo riscontrando alcuni problemi con il test corretto in modo da poter dare un consiglio.
In generale, ci sono i seguenti componenti da testare:
- Web API
- Controller angolari
- angolare di routing
- rendering HTML e angolare vincolante dei controllori agli elementi HTML
Come si può testare tutto questo con il minimo sforzo e, se possibile, non sovrapporre?
Per qualsiasi applicazione basata su database, il test di integrazione completo (ad esempio con un server attivo, connesso a un database caricato con dati) sarebbe particolarmente disordinato perché ci dovrebbe essere un processo che genera dati sufficienti per tutti i test e ripristini il DB e i test dovrebbero fare attenzione a non modificare i reciproci dati. (se mi manca qualcosa qui per favore fatemelo sapere)
Dato il punto precedente, suppongo che sia meglio interrompere il collegamento tra server e client ed eseguire i test angolari usando solo dati fittizi.
Inoltre, presumo che se il test E2E si prende cura di tutti gli scenari possibili, i controllori dell'unità di test sono ridondanti in quanto i loro valori sono legati al modello (e quindi verrebbero testati tutti i 2, 3 e 4 sopra). Il test delle unità sarebbe utile solo in controllori molto complessi o per testare servizi e direttive.
Tuttavia, non siamo riusciti a trovare alcuna informazione su come prendere in giro roba con $httpBackend
su una base per test come si farebbe nei test unitari, usando expect*()
. I documenti angolari sembrano suggerire l'uso di when*()
più gli occasionali passthrough()
quando necessario.
Tuttavia, questo pone il suddetto problema di creare dati di test per tutti gli scenari e probabilmente sarà necessario reimpostare il DB in memoria prima di ogni test per assicurarsi che i test non siano interessati. Inoltre, stai perdendo la sicurezza dell'uso di $httpBackEnd.expect*()
che controlla che non vi siano chiamate mancanti o ridondanti al server - Questo mi suggerirebbe di richiedere anche che i controllori dell'unità di test controllassero ciò.
Qualcuno può fornire una strategia di test dettagliata per le app AngularJS che risolve il test dei 4 componenti sopra e le preoccupazioni riportate sopra?
Sto ancora accarezzando idee diverse su questo nella mia testa. Penso che la cosa più importante da fare sia testare l'applicazione completa, su un vero database. È anche il più difficile. Usare uno scenario angolare per questo sembra un po 'sbagliato, perché in questo caso ti blocchi in Angular per tutti i tuoi test. Qualcosa come Selenium WebDriver sembra migliore per questo, ma è anche più di una seccatura da configurare. Tornerò su questo se troverò una strategia definitiva. – iwein
Assolutamente. C'è un sacco di test di valore contro un vero database. +1 per scegliere qualcosa al di fuori dell'ecosistema angolare, anche se non c'è una scelta naturale per introdurre il selenio. Sei libero di scegliere qualsiasi implementazione di selenio, come Python o C# o Java. – fatuhoku