Comprensione dei test delle unità / TDD per i Webform ASP.NET [chiuso]

6

Sono il programmatore principale di una piccola azienda di software (attualmente 4 sviluppatori tra cui me stesso), sviluppiamo applicazioni ASPF di WebForm personalizzate per le aziende. Mi sono iscritto lì nel 2010 subito dopo la laurea, quindi è stato il mio primo vero lavoro. Dopo che altri programmatori senior se ne sono andati, sono stato promosso a guidare e abbiamo assunto un gruppo di sviluppatori junior per me come mentore.

Il mio problema è che al momento abbiamo un enorme lavoro da progetti in ritardo (2-3 anni in ritardo), quindi il nostro sviluppo è molto affrettato e i test vengono lasciati all'ultimo minuto e le nostre uscite spesso escono con bug ovvi che avremmo dovuto raccogliere. Questo mette davvero giù il morale e mette tutti molto stressati, incluso me stesso.

Non abbiamo alcuna struttura di test o, a malapena nessuna organizzazione, ciò che intendiamo fare. Non usiamo mai i test unitari e tutti i test sono manuali e molto laboriosi. Questo tipo di metodologia è tutto ciò a cui sono stato esposto da quando sono diventato programmatore, ma sto imparando velocemente che non è così che dovrebbe funzionare una software house.

Ho cercato di familiarizzare con TDD e con i test delle unità, ma per me è tutto estremamente estraneo e ho difficoltà a visualizzare come potremmo effettivamente usarli nelle nostre applicazioni. La maggior parte della logica all'interno delle nostre app si trova nel codice sottostante per ogni pagina (qualcosa che sto cercando di allontanare) e da ciò che ho letto questo rende i test molto più difficili.

Qualcuno ha qualche consiglio, o conosce qualche buon tutorial, che ci aiuterà ad andare avanti con il TDD?

Abbiamo molti altri problemi, tra cui non usare SVN in modo efficiente, avere un HelpDesk di base per i nostri bug e fornire al nostro team specifiche abbastanza vaghe. Ancora una volta queste sono cose che voglio imparare da me stesso, ma ho bisogno di passare molto tempo a insegnarmi tutto questo. Quindi, se qualcuno ha qualche consiglio per questo, lo apprezzerei, ma il nostro test è la cosa più cruciale in questo momento.

    
posta Chris 27.03.2013 - 22:59
fonte

5 risposte

7

Sono in un posto simile, quindi non posso offrire il miglior aiuto, e sono impaziente di vedere le altre risposte.

Ma posso consigliare entusiasticamente " The Art of Unit Testing. " È incentrato su .NET e ti darà molte idee per quello che dovresti puntare in Unit Testing.

Da quanto so fino ad ora, hai ragione a spingere il codice alle classi centrali e fuori dal codice. Sto lavorando per un'architettura più centralizzata con una migliore separazione delle preoccupazioni, simile a quella incoraggiata da MVC. (Forse vale la pena dedicare un po 'di tempo a MVC solo per familiarizzare con l'architettura. "" Non farà male neanche il curriculum.)

    
risposta data 27.03.2013 - 23:13
fonte
7

Prima di tutto, non dovresti assolutamente sentirti male per il fatto che stai avendo difficoltà a fare i conti con questo. WebForms non è un framework che sia mai stato progettato pensando alla testabilità, e certamente non fa nulla per rendersi facile da testare.

La prima e più importante cosa è già stata menzionata nella risposta di Jamie F. - è necessario assicurarsi che il minor numero possibile di codice sia contenuto nel codebehinds della pagina .aspx e il più possibile sia in classi di business logic separate. Il codice nel codebehinds dovrebbe essere solo il cablaggio dei controlli ASP.NET avanti e indietro, e molto poco altro. In questo modo, puoi iniziare a ottenere alcuni test unitari sulla logica aziendale esistente e sviluppare nuove logiche di business utilizzando un approccio TDD.

Per l'interfaccia web attuale, probabilmente stai meglio esaminando alcuni framework per i test di automazione del browser: WatiN e Selenium sono due che ti vengono in mente. Come prendere un approccio TDD ai test di automazione del browser, però, non lo so. A mio parere, queste tecniche sono molto più adatte per impostare i test di regressione dopo lo sviluppo.

    
risposta data 28.03.2013 - 00:10
fonte
5

Come altri hanno scritto, i moduli web non sono stati sviluppati tenendo presente la testabilità, tuttavia puoi rendere la tua vita molto più semplice imparando modelli come MVC, MVP e MVVM. In particolare, Web Forms funziona molto bene con MVP.

Dino Esposito ha un ottimo articolo qui su MSDN sull'utilizzo di MVP con i moduli web. Puoi anche guardare ASP.NET MVC che è stato costruito da zero prendendo in considerazione l'iniezione delle dipendenze, l'inversione del controllo, i test, ecc.

In sostanza, è necessario garantire la separazione più chiara delle preoccupazioni. Prova a esaminare la Programmazione orientata agli aspetti per formalizzarla. Eseguendo una separazione delle preoccupazioni, è molto più semplice eseguire il test delle unità, fare un'iniezione di dipendenza e tutte le operazioni necessarie per semplificare i test. Ho usato Spring in Java e hanno un modulo AOP che è anche in Spring.NET, potrebbe valere la pena dare un'occhiata.

I miei suggerimenti sono i seguenti:

  • Componete l'applicazione il più possibile.
  • Non mescolare la logica aziendale con la logica di visualizzazione nei moduli Web
  • Guarda un modello come MVP o MVVM per i moduli web
  • Considera di passare a ASP.NET MVC se rientra negli obiettivi aziendali
  • Adotta l'iniezione delle dipendenze per disaccoppiare l'applicazione
  • Scrivi test unitari per testare il tuo codice
  • Utilizza i test di automazione per testare la tua interfaccia

Il motivo per cui suggerisco MVP / MVVM è perché questi pattern aiuteranno a far rispettare la separazione del modello di dati dalla tua vista e quindi aiuteranno a rafforzare la separazione dei dubbi.

Buona fortuna!

    
risposta data 28.03.2013 - 00:52
fonte
2

Il TDD è un cambiamento di paradigma ed è un tipo di test. Sembra anche che trarrai vantaggio da alcuni test unitari generali, e forse un paio di nuove "politiche" alle quali il tuo team aderirà. Un paio di cose prima di partire, assicurati che la tua squadra sia a bordo, se non lo sono, cerca di convincerle con articoli e dimostrazioni. Assicurati di includerli e ottenere il loro feedback lungo la strada.

TDD (Test Driven Development) è scrivere prima il test, quindi scrivere il codice per superare i test. E 'stato dimostrato che funziona bene, e molte persone ne sono dietro. È probabilmente più facile avviare un progetto con questo tipo di strategia piuttosto che implementarlo a metà strada senza una struttura di codice di supporto. Ci sono molte risorse disponibili là fuori su questo.

Quindi hai dei test unitari, che nel tuo caso probabilmente sono buoni da implementare prima possibile. Questo tipo di strategia ti aiuterà a testare il tuo codice. scrivi il tuo codice e poi testalo (Disponi / Agisci / Asserisci). Il test delle unità fa in modo che se fornisci l'input corretto, ottieni l'output corretto. Visual Studio disponeva di un framework di test integrato e XUnit è anche un framework di test semplice e facile da utilizzare e di facile implementazione.

Vorrei iniziare a fare pratica per iniziare a sviluppare in assembly separati che possono essere consultati dal codebehind. Ciò creerà la riutilizzabilità e inizierà verso un gradevole approccio "a strati". Cerca di utilizzare buone convenzioni di denominazione lunghe e cerca di mantenere le tue lezioni organizzate e in ordine. Neanche questo dovrebbe intralciare troppo il processo di sviluppo esistente.

IMO, il passo successivo sarebbe iniziare a identificare "raggruppamenti comportamentali" fuori dal codebase e creare interfacce di cui fuori

  • Isolare metodi comuni all'interno delle applicazioni a cui tutti appartengono un'idea comune.
  • Crea una classe che implementa quell'interfaccia e copia (taglia effettivamente) nel file metodi dal codebehind in modo tale da implementare tale interfaccia (quindi fare riferimento a quell'assembly e sostituire i metodi codebehind con quelli "nuovi")
  • Alla fine, puoi iniziare a fare mosse interessanti con quelli interfacce compresa la facilità di testabilità (iniezione a dipendenza, contenitori IoC, ecc.)

Penso che estrarre le interfacce sia un buon punto di partenza, perché è piuttosto semplice con una base di codice esistente ei vantaggi di farlo sono piuttosto alti. ecco un buon video che parla al soggetto (BDD?) I test di integrazione sono una truffa .

Infine, consiglierei il servizio Team Foundation . Sembra che il tuo team possa entrare nella versione gratuita da quando hai 5 membri gratis. Questo aiuterà te e il tuo team a muoversi in una direzione di sviluppo organizzata oltre a darvi il controllo del codice sorgente e molte altre interessanti funzioni come il bug tracking, una "Big Board" (che è davvero interessante) e una pletora di altre buoni strumenti di gestione che sono utili per gli sviluppatori.

Spero che almeno un po 'di questo aiuti .. BUONA FORTUNA!

    
risposta data 28.03.2013 - 00:40
fonte
2

Sviluppo applicazioni brownfield in .NET

shows developers how to approach legacy applications with the state-of-the-art concepts, patterns, and tools developers apply to new projects.

    
risposta data 28.03.2013 - 17:29
fonte

Leggi altre domande sui tag