2010-02-09 33 views
27

Recentemente ho sentito parlare di Functional Testing su Unit Testing.Test unitari o test funzionali?

Capisco che Unit Testing testa ognuna delle possibilità di un dato pezzo di codice dalla sua forma più atomica. Ma per quanto riguarda Functional Testing?

Questo mi sembra un test solo se il codice funziona, ma è affidabile quanto il test di unità?

Mi è stato detto che c'erano due scuole di pensiero per la questione. Alcune preferirebbero il test unitario, altri test funzionali.

C'è qualche buona risorsa, link, libri, riferimenti o qualcuno di voi che può spiegare e approfondire il mio percorso sull'argomento?

Grazie!

+1

Il test funzionale == test di integrazione? –

+1

Ognuno ha una risposta molto buona alla mia domanda e apporta la giusta chiarezza alle spiegazioni fornite. Grazie a tutti voi! Ho scelto la risposta di @ TrueWill come fornisce riferimenti, oltre a ciò che tutti voi avete detto. Per favore, sappi che ho aumentato tutte le tue risposte e riletto e riletto le tue risposte come da cura per comprendere appieno i tuoi punti. Grazie! –

+0

@JoshKodroff, non del tutto (anche se troverete opinioni e definizioni divergenti). Il test funzionale, a quanto ho capito, verifica il comportamento previsto per un caso d'uso, senza molta considerazione per ciò che accade dietro le quinte. Verifica le unità di codice che lavorano insieme che sono già state testate. I test di integrazione, d'altro canto, verificano che tutto funzioni correttamente da un capo all'altro con input e output realistici. Credo che i test di integrazione faranno molto meno presa in giro delle dipendenze esterne e delle fonti di dati e svolgeranno effettivamente il lavoro che si verificherebbe nella reale applicazione. – hotshot309

risposta

23

La risposta di Jason è corretta. Diversi tipi di test hanno scopi diversi e possono essere stratificati per ottenere i migliori risultati (buon design, conformità alle specifiche, difetti ridotti).

  • test delle unità = unità di progettazione (con Test-Driven Development, o TDD)
  • di testing di integrazione = fare tutti i pezzi di lavorare insieme
  • clienti test di accettazione = vuol soddisfare le esigenze del cliente
  • test manuale = spesso copre l'interfaccia utente; tester dedicati possono trovare ciò che manca l'automazione
  • test di carico = quanto bene fa il sistema esegue con quantità realistiche dei dati

V'è una certa sovrapposizione tra queste categorie; i test unitari possono specificare il comportamento, ad esempio.

E ce ne sono altri; per più di quanto la maggior parte della gente tenga a sapere, vedi Software Testing.

Un punto perso è che il test dell'unità sta testando i pezzi del codice in isolamento. Ad esempio, buoni test unitari non colpiscono il database.Questo ha due vantaggi: rende i test eseguiti velocemente, quindi li eseguirai più spesso, e ti costringe a scrivere classi liberamente accoppiate (miglior design).

Hai chiesto risorse; Raccomando il libro di Roy Osherove The Art of Unit Testing with Examples in .NET. Mentre nessun libro è perfetto, questo dà molti ottimi consigli su come scrivere buoni test.

EDIT: E per scrivere test su software esistenti, niente batte il libro di Michael Feathers Working Effectively with Legacy Code.

+3

Il test dell'unità non è necessariamente un progetto di guida. In TDD lo fa, in altri paradigmi è lì per assicurarsi che il codice si comporti come ci si aspetta, e che le modifiche agli interni della classe non infrangono le singole parti della funzionalità – Steve

+1

@Steve - d'accordo, ci sono altre prospettive, ma questo è mio. :) Ecco un'altra cosa che vale la pena di investigare: http://en.wikipedia.org/wiki/Behavior_Driven_Development – TrueWill

+3

Alcuni altri tipi di test (solo per motivi di discussione): Test di sicurezza = la superficie di attacco del codice è appropriata. Tutti i vettori di attacco sono gestiti bene?Test delle prestazioni/concorrenza = quanto bene la tua applicazione gestisce più (migliaia) utenti contemporaneamente? –

25

Test unitari rispetto a test funzionali non è uno xor, ma piuttosto uno and. I test unitari riguardano le unità di test in isolamento mentre i test funzionali riguardano il test dell'integrazione completa (tutte le unità funzionano correttamente insieme?).

Entrambi sono componenti necessari di buone pratiche di ingegneria del software.

+0

@Jason: Grazie per la rapidità della tua risposta! Questo è magro e veloce come ci piacciono! È un buon punto che tu abbia insistito sulle pratiche di ingegneria del software. –

2

C'è un posto per entrambi nella maggior parte dei lavori di sviluppo.

L'unità di test è lì per testare piccole unità di codice, per vedere che funzionano come previsto.

I test funzionali servono a verificare che la funzionalità complessiva del sistema sia quella prevista.

Sono a livelli diversi ed entrambi dovrebbero essere utilizzati.

3

Test di unità e test funzionali hanno due risultati diversi.

Unit Testing verifica che un piccolo pezzo di codice funzioni come previsto. Di solito lo sviluppatore lo fa per assicurarsi che il codice funzioni correttamente. Di solito sono automatizzati anche da un framework di test.

Test funzionali verifica che una funzionalità funzioni come previsto passando attraverso un determinato percorso attraverso il programma. Di solito vengono eseguiti da una persona sul software, assicurando che il programma funzioni nel modo previsto per l'utente. In quanto tale, è di livello superiore e quindi testa più unità contemporaneamente.

Penso che entrambi siano importanti. Se hai risorse limitate, però, e devi scegliere/scegliere le tecniche, e penso che dipenda dai prodotti che crei, ma per quello che faccio (prodotti di controllo automobilistici usati dall'uomo attraverso alcuni pulsanti) i test funzionali sono più importanti. Controlla e garantisce che quando l'utente ottiene il prodotto, fa ciò che deve fare. Ciò non significa che dovremmo rinunciare ai test unitari, ma se il push-to-to-shove è funzionale, il più importante è garantire un'esperienza utente ottimale e portare il prodotto fuori dalla porta.

Se produci, ad esempio, un motore di database (o qualche altro prodotto che non è necessariamente rivolto all'utente), il test delle unità potrebbe essere ciò che dovresti veramente fare.

+0

Cosa intendi per testing-framework? C'è qualche esempio o documentazione sull'argomento? –

+0

@sheepsimulator: ogni prodotto è rivolto all'utente, altrimenti non ci sarebbe alcun punto nello sviluppo del prodotto. In altre parole, se non c'è nessuno per usare il prodotto, perché svilupparlo? – jason

+1

@ Jason: Credo che ciò che intendeva fosse legato al suo settore di lavoro. sheepsimulator sembra funzionare principalmente con gli automatismi programmabili (PLC). Quindi, il sistema è per lo più autosufficiente, se posso dirlo, o se preferisci, forse richiede semplicemente meno attenzione da parte degli esseri umani (utenti). –

6
  • Test unità = livello più basso, granulare.
  • Test funzionale = livello modulare, modulare.
  • Test di integrazione = livello di applicazione superiore.
  • Factory Acceptance Test = vedono tutto il lavoro
  • Site Acceptance Test = vedono tutti non riescono :)

Tutto quanto sopra sono utili ma non sono mutuamente esclusive. Dovresti fare la maggior parte di loro, ma la quantità di tempo che spendi per ogni parte dipende dai risultati che ottieni da loro, tutto qui. Se il tuo codice è troppo modulare per essere facilmente testato sull'unità, dedica i tuoi sforzi ai test funzionali. Se stai scrivendo una libreria di piccoli componenti, trascorri il tuo tempo su unità che li testano, e se stai scrivendo sistemi di controllo per missili militari dovresti assolutamente sottoporli al collaudo del sito (poiché le esplosioni anche quando falliscono sono divertenti :))

+1

In genere ho visto il termine Customer Acceptance Test, in cui il cliente/utente/analista aziendale specifica i criteri. C'è anche carico test. Tutti gli strati hanno valore. – TrueWill

+0

+1 per una buona risposta, -1 per "necessario" –

+0

Immagino che non significhi necessario dato che sei obbligato a eseguire tutti questi test all'interno di ogni singolo progetto, ma necessario dato che sono utili quando è necessario utilizzarli a seconda di una situazione specifica. Notate che dice "dovresti fare la maggior parte di loro", se non sbaglio. –

10

Il test delle unità verifica le unità del codice (metodi, ecc.) Per assicurarsi che facciano ciò che ci si aspetta.

Test funzionali verificano la progettazione del sistema per assicurarsi che i pezzi interagiscano correttamente. Se scrivi un comando che accetta e int e restituisce una stringa e testala completamente, puoi essere certo che funzioni. Ma se non si hanno test di sistema, non si può mai notare che il resto del codice pensa di poter accettare un valore nullo ma non può farlo.

Entrambi i tipi di test sono importanti.

edit: Per aggiungere una visione leggermente diversa da quella che gbjbaanb detto: prova

  • Unità = il mio codice funziona
  • Test funzionale = il mio progetto funziona
  • test di integrazione = il mio codice sta usando il 3 ° roba di partito correttamente (database, ecc.)
  • Test di collaudo in fabbrica = il mio sistema funziona
  • Test di accettazione del sito = il tuo codice fa schifo, questo non è assolutamente quello che ho chiesto!?!
+0

Mi piace la tua osservazione sul test di accettazione del sito! = P Grazie per queste precisioni. Reindirizza già la mia mente e pensieri sulle differenze e le specialità di ciascuno di essi. In effetti, non avevo mai notato che c'erano altri test rispetto a Unit e Functional Testings. Quando arrivo a pensarci, ha molto senso! –

4

Il test funzionale, chiamato anche System testing, ha lo scopo di testare il sistema completo e verificare che i requisiti funzionali siano soddisfatti.

Unit testing ha lo scopo di testare le "unità", ovvero le funzioni oi metodi che il sistema costruisce da in isolamento. A volte è chiamato test dello sviluppatore. Il test delle unità può essere difficile dopo il fatto, ecco perché TDD scrive il test prima del codice.

Questi sono complementare poiché le unità possono funzionare in modo indipendente e non quando sono integrate tutte insieme, oppure possono superare i test di unità e non soddisfare tutti i requisiti del prodotto.

+0

+1 per aver menzionato che i test funzionali e di sistema sono solitamente la stessa cosa. – hotshot309

3

Un test di unità verifica un pezzo di codice e conferma per un programmatore che un altro pezzo di codice sta facendo quello che dovrebbe. In Test Driven Development, il test unitario viene scritto per primo e osservato fallire, prima che il codice sia scritto causando il passaggio del test. I programmatori sono interessati ai test delle unità. Le unit test sono veloci da eseguire.

Un test di funzionalità verifica i requisiti della scatola nera e dimostra che è stata implementata una funzionalità utente. Ad esempio, se premo il grande pulsante rosso, la campana inizia a squillare. Il test funzionale potrebbe non essere nemmeno il test del codice. Forse c'è un processo meccanico che fa suonare la campana dopo aver premuto il pulsante. I clienti sono interessati ai test funzionali in quanto confermano che un processo di alto livello se funziona in modo comprensibile. Sono spesso lenti da eseguire.

+0

I partner commerciali oi proprietari di prodotti potrebbero essere interessati ai test funzionali ... ma non è un test funzionale più granulare di quello che un cliente o un utente finale desidera vedere? Non sarebbe questo il test di accettazione o di usabilità? – hotshot309