Sto lavorando a un progetto con un'app AngularJS che parla con un'API RESTful. Abbiamo appena iniziato a scrivere test E2E per l'app in Protractor. Sono abbastanza a mio agio con i test delle unità, ma sono nuovo per i test end-to-end.
Stiamo scrivendo un test che tenta di inviare un messaggio. Attualmente il test compila il modulo, fa clic sul pulsante di invio e quindi verifica che venga visualizzata la finestra di dialogo di successo. Questo non sembra un buon test, perché teoricamente la finestra di dialogo del successo potrebbe essere erroneamente mostrata quando il messaggio non è stato realmente inviato, ma il test sarebbe comunque passato. Vogliamo essere in grado di verificare che il messaggio sia stato realmente inviato, ma non sono sicuro del modo migliore per farlo.
Potremmo navigare attraverso l'interfaccia per visualizzare i nostri messaggi inviati e quindi controllare che il messaggio sia in quella lista, ma ritengo che ci siano alcuni problemi con questo approccio. Innanzitutto, lega insieme il nostro messaggio di invio e visualizza i test dei messaggi inviati, il che sembra un po 'complicato. In secondo luogo, aumenta la complessità dei test di scrittura, perché in sostanza la lunghezza di ciascun test è raddoppiata per includere il codice per il controllo dei risultati. Terzo, in alcuni casi il risultato dell'azione dell'utente potrebbe essere difficile da verificare all'interno dell'interfaccia dell'utente. Ad esempio, con l'invio di un messaggio, quello che vogliamo veramente verificare è che il destinatario l'ha ricevuto, non che esso compare nella sezione dei messaggi inviati del mittente.
La prossima idea che ho avuto è che avremmo potuto eseguire il nostro test e quindi chiamare direttamente l'API per verificare il risultato. Usando diversi token potremmo anche parlare con l'API come un altro utente (ad esempio il destinatario) per essere certi che il risultato desiderato sia stato raggiunto. La mia unica preoccupazione per questo approccio è che potrebbe aggiungere troppa logica nella suite di test, che sembra essere contro le migliori pratiche.
Un'altra idea che avevo era di prendere in giro tutte le richieste API (usando qualcosa come $ httpBackend di ngMockE2E) e in qualche modo affermare in ogni test che una richiesta specifica è stata fatta. I problemi che vedo con questo approccio sono che c'è molto lavoro nella scrittura dei mock per la nostra API, e anche che non penso che ci sia un modo integrato per fare questo controllo, quindi scriveremmo il nostro non- soluzione di test standard.
Mi sembra che questo deve essere un problema abbastanza comune, quindi sono curioso di sapere dalle persone come si sono avvicinati e che cosa apprezzano / non amano della loro soluzione.