2009-06-27 10 views
28

So che il motivo per cui Microsoft è uscito con ASP.NET MVC era rendere più semplice eseguire Test Driven Design (TDD) per ASP.NET. Tuttavia, ho un'applicazione di campo brown (esistente) piuttosto grande in ASP.NET WebForms che mi piacerebbe implementare alcune funzionalità di tipo TDD in. Suppongo che ci sia un modo per farlo, ma quali sono alcune opzioni praticabili?Come implementare TDD in Web Forms ASP.NET

+1

Giusto per chiarire, si wan't fare test-driven sviluppo o solo test unitari? – alexn

+0

Vorrei incorporare alcuni TDD che mi avrebbero anche dato l'ulteriore vantaggio di un test dell'unità migliore, speravo. –

risposta

36

Microsoft ha introdotto ASP.NET MVC perché pensava di poter guadagnare da un mercato non sfruttato - coloro che ritengono che i Web Form siano troppo "pesanti" e che stiano programmando utilizzando un framework più leggero. Ciò include coloro che sono abituati al paradigma MVC.

Include anche coloro che non sono riusciti a capire come eseguire i test unitari nei moduli Web e che desiderano utilizzare i test unitari e TDD.

Il modo di farlo con i moduli Web, come con qualsiasi altra cosa, è quello di separare tutto tranne il codice UI in classi separate in una libreria di classi. Usa TDD per sviluppare quelle classi.

Il livello successivo di controversia è se è necessario utilizzare TDD per sviluppare il resto del codice: markup, codice lato client, interazioni utente, ecc. La mia risposta è che se il resto è isolato e testato, che non vale la pena di usare TDD per questo.

Considera: le tue pagine devono avere un aspetto particolare. Stai per scrivere un test unitario fallito per dimostrare che stai usando i CSS in modo corretto? Per dimostrare che stai usando gli stili CSS corretti? Io non la penso così


Per chiarire: in TDD, iniziamo con un test dell'unità in errore. Quindi apportiamo le modifiche più semplici possibili che renderanno il test positivo.

Immaginate di usare TDD per una pagina web. Quali test fallimentari produrrai?

  1. prova che pagina è ben formato HTML
  2. prova che pagina include il titolo corretto
  3. prova che pagina include
    1. "Enter ID" etichetta
    2. una casella di testo id
    3. Una griglia di dati
    4. Un pulsante "Vai"
  4. Verificare che la griglia di dati sia vuota dopo un GET
  5. Verificare che la griglia carichi con i dati dal cliente 1 quando viene inserito "1" nella casella di testo e si fa clic su "Vai".

E nessuno dei test precedenti per l'aspetto della pagina. Nessuna prova il comportamento lato client di alcun JavaScript nella pagina.

Penso che sia sciocco. Invece, prova il tuo metodo DAL che recupera i dati in base all'ID. Assicurati che restituisca l'ID corretto per l'ID 1.Quindi, quanto ci vorrà per testare manualmente la pagina per assicurarsi che appaia corretta, puoi inserire il "1" e fare clic su "Vai" e che i dati che appaiono nella griglia sono i dati corretti per il cliente 1?

Test-Driven Sviluppo e test di unità automatizzate sono destinati a testare il comportamento. L'interfaccia utente di un modulo Web è prevalentemente dichiarativa. C'è un grande "disadattamento di impedenza" qui.

+0

Quindi, solo per chiarire: Separa il mio livello di interfaccia utente dalla mia logica aziendale. Immagino che dovrò cambiare il mio database di gridview per qualcos'altro. Tutti i miei controlli devono essere generati nel codice sottostante? Questo renderebbe la separazione più facile? –

+0

La tua risposta è stata molto illuminante. Grazie, John. –

+0

Spero che aiuti. Non esitate a commentare qui o fare un'altra domanda se ho perso la base da qualche parte. Posso immaginare alcuni tipi di complesse interazioni dell'interfaccia utente in cui il TDD potrebbe essere utile, ma quelle sarebbero rare. Se ne colpisci uno, faccelo sapere. –

0

È possibile eseguire test basati su HTTP per testare la funzionalità di alto livello. La cosa migliore sarebbe incapsulare codice code behind nel tuo livello aziendale ed eseguire test unitari su di esso.

0

È possibile utilizzare il quadro ufficiale unittest: http://msdn.microsoft.com/en-us/library/ms182526.aspx

+5

Potrebbe essere ufficiale, ma è una schifezza. Si presuppone che tu stia utilizzando un "progetto" di un sito Web per cominciare, quindi procede a fallire totalmente in un ambiente TDD (che è ciò di cui tratta questa domanda). –

3

Prima di tutto, la sua davvero difficile da testare WebForms. Ma se crei una logica per controllori/presentatori come il pattern MVC/MVP puoi almeno testare i presentatori.

pseudo-codice

Default.aspx

public void Page_Init(object sender, EventArgs e) { 
_presenter = new DefaultPresenter(IDependencyOne, IDependencyTwo etc) //Init new presenter, either from IoC container of choose or "new-it-up" 
} 

public void Save() { 
_presenter.Save(txtValue.Text) 
} 

di quanto si può facilmente verificare il presentatore in isolamento almeno =)

+0

Puoi darmi informazioni specifiche su quali sarebbero le cose da ciascun lato della separazione? –

+0

Solitamente faccio in modo che la pagina si occupi del rendering dell'interfaccia utente e della trasformazione dei valori da QueryString/Form/Viewstate e poi chiama il relatore che dialoga con altri servizi e/o repository. –

+0

Questi schemi sono una formalizzazione di ciò che stavo suggerendo. Penso che possano essere carini come paradigma di sviluppo, ma penso che superino il marchio un po 'in termini di TDD. A mio parere, lo scopo dei test in TDD è quello di creare codice che manchi di un set di bug creando test che dimostrino che i bug sono assenti. Penso che una volta raggiunta l'interfaccia utente, non avresti avuto molti bug in ogni caso. I bug che avresti avuto sarebbero stati trovati meglio usando il test manuale, forse aumentato da un framework di automazione, ma non TDD e nemmeno i pur unit test. –

Problemi correlati