Come testare un sito di moduli Web?


26

Come testare un sito di moduli Web? Mi sembra che tanto dipende dallo stato e dall'input dell'utente, non sarebbe fattibile.

Se non è possibile, esiste un'alternativa automatica valida?


2
Se desideri test automatici dell'interfaccia utente, avrai bisogno di qualcosa come Selenium. Ma, se si desidera test di unità automatizzati , non è necessario il selenio. Hai solo bisogno dei modelli giusti sul posto. Vedi la mia risposta
Matthew Rodatus,

Risposte:


22

Si, puoi. Devi solo stare attento a separare bene le tue preoccupazioni. In breve, devi rimuovere tutta la tua logica dal code-behind e inserirla in altre classi.

Esistono due modi comuni per farlo.

Il modo semplice è ripensare tutti i gestori di eventi in termini di "Quali informazioni mi fornisce il sistema? Quali informazioni sono necessarie per popolare sulla pagina?" e quindi fornire una classe di servizio che esegue quella conversione.

In questo caso, il livello di servizio dovrebbe conoscere molto poco la natura del livello di presentazione. Devi ancora prendere i dati restituiti dal servizio e popolare i componenti corretti di WebForm nel tuo code-behind e questo rimane non testato (almeno dai test unitari, puoi ancora impiegare test di integrazione). Ma questo è raramente dove il codice va storto, è molto più probabile che fallisca nella logica.

Un modo più complicato, ma più efficace, è utilizzare il modello Presentazione modello . Quando l'abbiamo provato, abbiamo scoperto che i Presenter si sono rapidamente accoppiati al framework e, più abbiamo sviluppato MVP, più era chiaro che MVP voleva davvero essere MVC ma non poteva esserlo.

Detto questo, altri lo hanno fatto con grande successo - esiste anche un framework webformsmvp disponibile per rimuovere il sollevamento pesante - quindi il tuo chilometraggio può variare.


1
@jmoreno: bella cattura! Ho dimenticato WebForms e MVP esistono persino negli ultimi 5 anni.
pdr

16

Ovviamente, un'intera pagina di moduli web non è un'unità e quindi non può essere testata. Tuttavia, ci sono alcune cose che puoi fare per i test automatizzati:

  • unit test singoli componenti della pagina (tutti i metodi che eseguono la logica effettiva)
  • componenti di unit test utilizzati dalla pagina (controlli personalizzati, logica aziendale sottostante, ecc.)
  • test di funzionalità automatizzati (tramite controllo remoto di un browser o invio di richieste HTTP tramite qualcosa di simile a cURL)
  • test di penetrazione automatizzati (ci sono strumenti che cercheranno di trovare possibili punti di iniezione ed eseguiranno automaticamente attacchi di iniezione innocui ma rilevabili sulla tua pagina)
  • test di carico
  • controllare il layout in base a un elenco di usabilità e punti elenco stile casa (anche se questo è molto difficile da automatizzare; di solito è più fattibile farlo manualmente ogni tanto)

-1 Ci dispiace ma i test di carico, i test di penetrazione e il controllo del layout non hanno nulla a che fare con i test unitari
Tom Squires,

2
@TomSquires: certo che non lo sono, e se leggi attentamente la mia risposta, noterai che non l'ho mai detto. Ma la domanda sembra confondere i concetti di unit test e test automatici in generale, motivo per cui ho elencato vari test automatizzati significativi che puoi lanciare su un modulo web.
tdammers,

d'accordo, testare una pagina web è più probabile che sia una qualche forma di test di integrazione piuttosto che un test unitario con definizioni rigorose, sebbene sia comunque buono automatizzare tutto ciò che puoi
jk.

6
@TomSquires: downvote totalmente ingiustificato. La tua domanda inizia con il test di un intero sito, che non ha nulla a che fare con il test unitario. Tdammers ha identificato vari modi per testare il tutto e le parti e ha identificato dove si inseriscono i test unitari. +1
azheglov

3
Giusto. Lo riprendo
Tom Squires il

9

Mi dispiace per aver perso la parte "unit" della domanda ...

SeleniumHQ è il tuo amico per i test front-end. Non è un test unitario, più simile a un test in scatola nera. Devi ancora pensare a casi di test validi ...


1
+1 La tua risposta è arrivata mentre premevo "pubblica la tua risposta" per dire esattamente lo stesso.
yannis,

2
Inoltre, poiché op sta chiedendo dei test unitari, aggiungiamo semplicemente che ciò su cui si pone effettivamente la domanda è il test funzionale (ity) , che è più appropriato (ragionevole, fattibile) quando si verificano gli elementi di input dell'utente.
yannis,

+1 cos Continuo a usarlo, ma non ci sono mai arrivato. Qualcuno l'ha usato, è buono e vale la pena implementarlo?
NimChimpsky,

6
Il selenio è uno strumento fantastico ma non ha nulla a che fare con i test unitari.
pdr

È vero, sembra che ho ignorato queste informazioni nella domanda: /
WarrenFaith

6

Parlando per esperienza: solo se è fatto bene. Per "giusto" intendo il code-behind minimo e qualcosa come il summenzionato Model-View-Presenter per rendere "stupido" il modulo Web. Questo di solito si rivela molto difficile con le applicazioni brownfield perché non sono state progettate pensando a questo ed è uno sforzo quasi erculeo per riformattare / riscrivere le pagine per usarlo.


1

Watin

Trovo che i web test delle unità siano estremamente utili, anche solo per dare un'idea generale di un bug di regressione o per nuovi progetti.

Per quanto riguarda lo stato, crei i test unitari come faresti con i test non UI: cancellano il database all'inizio del test e ricostruiscono il database in modo che non contenga altro che lo stato iniziale. Ogni unit test incapsula quindi una singola pagina, o di solito un'attività distinta su una pagina.

http://watin.org/ è un altro strumento di test web ma per C # /. NET. Scrivi i test come unit test:

[Test] 
public void SearchForWatiNOnGoogle()
{
  using (var browser = new IE("http://www.google.com"))
  {
    browser.TextField(Find.ByName("q")).TypeText("WatiN");
    browser.Button(Find.ByName("btnG")).Click();

    Assert.IsTrue(browser.ContainsText("WatiN"));
  }
}

Attualmente è basato su IE ma ha un supporto sperimentale per Firefox e Chrome. Puoi praticamente automatizzare tutto ciò che faresti nei test manuali, inclusa l'interazione Javascript.


Ack, è il 2016. La visita di oggi al sito WatiN mi indica che WatiN è forse morto. I documenti sono scarsi, non aggiornati e i video non vengono riprodotti. Sto Non lamento - Ho enorme gratitudine per open source strumenti volontari - questo commento è quello di aiutare altre persone come-ultimamente come me. La risposta va bene, sottolineando che per iniziare potrebbe essere necessario un apprendimento pratico autonomo.
qxotk,

1
Ulteriore aiuto per chiunque pensare al modo in cui WatiN, la conferma è stagnante + dove guardare in oggi qui: stackoverflow.com/questions/118531/...
qxotk

0

Non è possibile testare l'unità di un sito Web, semplicemente perché le richieste Web si verificano su un cavo (o tramite uno stack TCP). Pertanto, i test non corrispondono alla definizione di "unit test", sarebbero probabilmente test end-to-end.

Per questo tipo di test, è possibile utilizzare una suite come Selenium che esegue un browser Web dietro le quinte. Un avvertimento però: di solito questo tipo di test è molto difficile e imprevedibile, poiché ci sono molte parti mobili!

Più interessante, però, mi preoccupa un po 'perché si avrebbe bisogno di a prova moduli web a tutti. Non stai mettendo troppa logica nel codice dietro e hai una logica aziendale anemica per caso?


-1

Gelsomino

Negli ultimi 5 anni Jasmine è emerso come uno strumento chiave per i test delle unità front-end. È spesso incorporato nei test di build automatici con Node e npm

Per https://en.wikipedia.org/wiki/Jasmine_(JavaScript_testing_framework) :

Jasmine è un framework di test open source per JavaScript. [2] Mira a funzionare su qualsiasi piattaforma abilitata per JavaScript, a non intromettersi nell'applicazione né nell'IDE e ad avere una sintassi di facile lettura. È fortemente influenzato da altri framework di test delle unità, come ScrewUnit, JSSpec, JSpec e RSpec. [3]

Nonostante tutte le menzioni di javascript, può anche essere usato per test unitari di un semplice modulo web.


Mentre javascript viene utilizzato nei moduli web non è il metodo principale per aggiornare l'interfaccia utente
Tom Squires

Vero. Tuttavia l'alternativa è ...? Ecco perché, anche se non destinato allo scopo, Jasmine funziona molto bene. Inoltre la sintassi è quasi identica a RSpec che i programmatori di Ruby adorano.
Michael Durrant,

-2

ASP.NET

Durante lo sviluppo di un sito ASP.NET siamo stati in grado di eseguire unit test su:

  • Il dominio
  • Controller / presentatori BL
  • il codebehind delle pagine Web Forms

È possibile TDD tutto questo, a seconda della propria architettura. L'unica cosa che non è possibile testare l'unità è il layout del file di markup.


3
Questa risposta dice "sì, è possibile" alla domanda "come". Non esattamente utile.
RubberDuck,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.