Test unitari vs test funzionali


Risposte:


254

Test unitario: test di una singola unità, ad esempio un metodo (funzione) in una classe, con tutte le dipendenze derise.

Test funzionale - Test di integrazione AKA, test di una porzione di funzionalità in un sistema. Ciò verificherà molti metodi e potrebbe interagire con dipendenze come database o servizi Web.


170
Vorrei essere in disaccordo con "AKA Integration Test". Un test di integrazione, controlla l'integrazione tra 2 o più sistemi / sottosistemi nel tuo codice. Esempio, controllo di una query SQL tramite un ORM, verifica che ORM e database funzionino bene insieme. Test funzionali AKA End to End IMHO.
Graffic

7
Concordo con @graffic Functional Test! = Test di integrazione Devi confondere l '"integrazione" dei sottocomponenti del sistema tra loro come uno stato persistente, ecc. Ma in generale il test di integrazione ha un ambito molto più ampio.
nabster

4
No, non era confuso su nulla.
bpapa,

3
Test di integrazione IS-A Test funzionale. Ma non viceversa. Google "test funzionali e non funzionali" e controlla le "Immagini".
Andrejs,

4
Questa risposta è semplicemente SBAGLIATA! Il test funzionale NON è nemmeno vicino al test di integrazione.
Dal

517

I test unitari dicono a uno sviluppatore che il codice sta facendo le cose bene; i test funzionali indicano a uno sviluppatore che il codice sta facendo le cose giuste .

Puoi leggere di più su Test unitari e Test funzionali


Un'analogia della vita reale ben spiegata tra test unitari e test funzionali può essere descritta come segue,

Molte volte lo sviluppo di un sistema è paragonato alla costruzione di una casa. Sebbene questa analogia non sia del tutto corretta, possiamo estenderla ai fini della comprensione della differenza tra test unitari e funzionali.

Il test unitario è analogo a un ispettore edile che visita il cantiere di una casa. Si concentra sui vari sistemi interni della casa, sulle fondamenta, sull'inquadratura, sull'impianto elettrico, sull'impianto idraulico e così via. Assicura (test) che le parti della casa funzionino correttamente e in sicurezza, cioè rispettino il codice dell'edificio.

I test funzionali in questo scenario sono analoghi al proprietario della casa che visita questo stesso cantiere. Presume che i sistemi interni si comporteranno in modo appropriato, che l'ispettore edile stia svolgendo il proprio compito. Il proprietario della casa è concentrato su come sarà vivere in questa casa. Si preoccupa di come appare la casa, le varie stanze sono di dimensioni confortevoli, la casa si adatta alle esigenze della famiglia, sono le finestre in un buon posto per prendere il sole del mattino.

Il proprietario della casa sta eseguendo test funzionali sulla casa. Ha la prospettiva dell'utente.

L'ispettore edile sta eseguendo dei test unitari sulla casa. Ha la prospettiva del costruttore.


In sintesi,

I test unitari sono scritti dal punto di vista dei programmatori . Sono realizzati per garantire che un particolare metodo (o un'unità ) di una classe esegua una serie di attività specifiche.

I test funzionali sono scritti dal punto di vista dell'utente . Garantiscono che il sistema funzioni come previsto dagli utenti.


18
La citazione è un po 'vaga per qualcuno di nuovo al concetto.

2
@ fico-gnuton, ho cercato di elaborare per spero di non rendere la descrizione vaga. All'interno del link forniscono un buon esempio, potrei aggiornare la risposta con la citazione se pensi che possa aiutare l'OP.
Anthony Forloney,

148
Forse un altro modo per dirlo sarebbe: "Unit test assicurano che il codice faccia quello che vuole il programmatore, Test funzionali assicurano che il programmatore stia facendo quello che vuole il cliente"?
JS.

3
Mi piace, ma lo adeguerei a. Un test funzionale assicura che l'applicazione consenta all'utente di eseguire un'azione. Un test unit assicura che il codice si comporti come previsto dal programmatore.
Adam,

2
Ciò che il programmatore vuole non aderisce a ciò che l'utente finale vuole? Perché scrivere un test che non serve ciò che il cliente si aspetta?
O.Badr,

140
  • Un test unitario verifica un'unità di comportamento indipendente . Cos'è un'unità di comportamento? È il pezzo più piccolo del sistema che può essere testato indipendentemente dall'unità. (Questa definizione è in realtà circolare, IOW non è davvero una definizione del tutto , ma sembra funzionare abbastanza bene in pratica, perché è possibile ordinare-di capire intuitivamente.)

  • Un test funzionale verifica una funzionalità indipendente.


  • Un'unità di comportamento è molto piccola: anche se non mi piace assolutamente questo stupido mantra "test unitario per metodo", dal punto di vista dimensionale è giusto. Un'unità di comportamento è qualcosa tra una parte di un metodo e forse un paio di metodi. Al massimo un oggetto, ma non più di uno.

  • Una funzionalità di solito comprende molti metodi e tagli su più oggetti e spesso attraverso più livelli architettonici.


  • Un unit test sarebbe qualcosa di simile: quando chiamo la validate_country_code()funzione e le passo il prefisso del paese 'ZZ', dovrebbe tornare false.

  • Un test funzionale sarebbe: quando compilo il modulo di spedizione con un codice paese di ZZ, dovrei essere reindirizzato a una pagina di aiuto che mi permette di scegliere il mio codice paese da un menu.


  • I test unitari sono scritti dagli sviluppatori, per gli sviluppatori, dal punto di vista dello sviluppatore.

  • I test funzionali possono essere rivolti all'utente, nel qual caso sono scritti dagli sviluppatori insieme agli utenti (o forse con gli strumenti giusti e gli utenti giusti anche dagli utenti stessi), per gli utenti, dal punto di vista dell'utente. Oppure potrebbero essere rivolti agli sviluppatori (ad esempio quando descrivono alcune funzionalità interne di cui l'utente non si preoccupa), nel qual caso sono scritte da sviluppatori, per sviluppatori, ma sempre dal punto di vista dell'utente.


  • Nel primo caso, i test funzionali possono anche servire come test di accettazione e come codifica eseguibile dei requisiti funzionali o una specifica funzionale, nel secondo caso possono anche servire come test di integrazione.

  • I test unitari cambiano frequentemente, i test funzionali non dovrebbero mai cambiare in una versione principale.



ottima risposta! una cosa: "i test funzionali non dovrebbero mai cambiare in una versione importante" perché?
Lazer,

5
@Lazer, @cdeszaq: in molti progetti, viene utilizzata una modifica del numero di versione principale per indicare l'incompatibilità all'indietro e OTOH se la versione principale non cambia, la compatibilità all'indietro è garantita . Che cosa significa "retrocompatibilità"? Significa "non modifica il comportamento visibile dall'utente". E i test funzionali sono una codifica eseguibile della specifica del comportamento visibile dall'utente. Quindi, se il numero maggiore non cambia, i test funzionali non possono cambiare neanche e viceversa, se il funzionale funziona fanno cambiamento, allora il numero maggiore deve cambiare.
Jörg W Mittag,

2
Nota: non ho detto nulla sull'aggiunta di test funzionali! Se l'aggiunta di funzionalità che prima non esisteva costituisce una modifica incompatibile all'indietro, dipende dal progetto. Per il software per l'utente finale, probabilmente no. Ma per un linguaggio di programmazione? Forse: l'introduzione di una nuova parola chiave, ad esempio, rende i programmi attualmente funzionanti che utilizzano tale parola chiave come nome di variabile non sono validi, e quindi è una modifica incompatibile con le versioni precedenti.
Jörg W Mittag,

3
@ JörgWMittag ama quell'idea: "i test funzionali sono una codifica eseguibile della specifica del comportamento visibile dall'utente" ... indipendentemente dal fatto che altri super-esperti siano effettivamente d'accordo, mi aiuta con la domanda originale, vale a dire "la differenza tra 'em"
mike rodent,

1
"Un test funzionale sarebbe: quando compilo il modulo di spedizione con un codice paese di ZZ, dovrei essere reindirizzato a una pagina di aiuto che mi permette di scegliere il mio codice paese da un menu." Questo è un po 'schizzinoso, ma lo definirei un "test di accettazione". Il test funzionale verifica che l'immissione di ZZ nel modulo di spedizione inoltri l'utente all'URL corretto o generi un'eccezione o un errore particolari.
Bob Ray

98

TLDR:

Per rispondere alla domanda: Unit Testing è un sottotipo di Functional Testing.


Esistono due grandi gruppi: funzionale e test non funzionali . La migliore illustrazione (non esaustiva) che ho trovato è questa (fonte: www.inflectra.com ):

inserisci qui la descrizione dell'immagine

(1) Unit Testing: test di piccoli frammenti di codice (funzioni / metodi). Può essere considerato un test funzionale (scatola bianca).

Quando le funzioni vengono messe insieme, si crea un modulo = un pezzo autonomo, possibilmente con un'interfaccia utente che può essere testata (Test del modulo). Una volta che hai almeno due moduli separati, li incolli e poi arriva:

(2) Test di integrazione: quando metti insieme due o più pezzi di (sotto) moduli o (sotto) sistemi e vedi se giocano bene insieme.

Quindi integri il 3 ° modulo, quindi il 4 ° e il 5 ° nell'ordine che tu o il tuo team ritenga opportuno, e una volta messi insieme tutti i pezzi del puzzle, arriva

(3) Test di sistema: test SW nel suo insieme. Questo è praticamente "Test di integrazione di tutti i pezzi insieme".

Se va bene, allora arriva

(4) Test di accettazione: abbiamo realizzato ciò che il cliente ha effettivamente richiesto? Naturalmente, i test di accettazione dovrebbero essere eseguiti durante tutto il ciclo di vita , non solo nell'ultima fase, in cui ti rendi conto che il cliente voleva un'auto sportiva e hai costruito un furgone.

inserisci qui la descrizione dell'immagine


2
Ho visto molte foto del genere su Google, che descrivono "Test unitario" come una sorta di "Test funzionale". Ma allora perché altre risposte qui descrivono un concetto assolutamente diverso: il "Test funzionale" è piuttosto un test end-to-end e il test unitario non è un test funzionale? Sono confuso. Esistono due diverse "religioni" che definiscono il termine "Test funzionale" in modo diverso o cosa?
Ruslan Stelmachenko,

Anche le risposte (anche molto apprezzate) possono essere sbagliate;)
Andrejs

1
Mi piace l'immagine, ma per i test di integrazione di sistema, il puzzle dovrebbe apparire "completo", senza più spazi per altri pezzi da collegare.
Jonathon Reinhart,

4
@JonathonReinhart - non necessariamente. I bordi aperti possono rappresentare una facile estensibilità del sistema con nuove funzionalità, che è particolarmente utile se si utilizza un approccio di sviluppo come Agile.
Myles,

Da più risposte contrastanti sopra, ovviamente Functional Testnon è un termine standardizzato e ha un significato diverso per persone diverse.
Penghe Geng,

12

"Test funzionale" non significa che stai testando una funzione (metodo) nel tuo codice. Significa, in generale, che stai testando la funzionalità del sistema - quando corro foo file.txtdalla riga di comando, le linee file.txtdiventano invertite, forse. Al contrario, un test di una singola unità copre generalmente un singolo caso di un singolo metodo - length("hello")dovrebbe restituire 5 e length("hi")dovrebbe restituire 2.

Vedi anche il punto di vista di IBM sulla linea tra test unitari e test funzionali .


Bene, interessante, ma il link che mostri significa qualcosa di diverso: funzionale riguarda la funzione da eseguire attraverso l'implementazione, cioè il test dal punto di vista dell'utente, che è una funzione per l'utente.
Stefano Scarpanti,

8

La distinzione di base, tuttavia, è che i test funzionali testano l'applicazione dall'esterno, dal punto di vista dell'utente. I test unitari verificano l'applicazione dall'interno, dal punto di vista del programmatore. I test funzionali dovrebbero aiutarti a creare un'applicazione con la giusta funzionalità e garantire di non romperla mai accidentalmente. I test unitari dovrebbero aiutarti a scrivere codice pulito e privo di bug.

Tratto dal libro "Python TDD" di Harry Percival


8

Secondo ISTQB questi due non sono comparabili. Il test funzionale non è un test di integrazione.

Il test unitario è uno dei livelli di test e il test funzionale è un tipo di test.

Fondamentalmente:

La funzione di un sistema (o componente) è "ciò che fa". Questo è in genere descritto in una specifica dei requisiti, una specifica funzionale o nei casi d'uso.

mentre

I test sui componenti, noti anche come test di unità, moduli e programmi, ricercano difetti e verificano il funzionamento di software (ad es. Moduli, programmi, oggetti, classi, ecc.) Che possono essere testati separatamente.

Secondo ISTQB il test di componenti / unità può essere funzionale o non funzionale:

I test sui componenti possono includere test di funzionalità e caratteristiche non funzionali specifiche come comportamento delle risorse (ad es. Perdite di memoria), test delle prestazioni o della robustezza, nonché test strutturali (ad es. Copertura delle decisioni).

Citazioni da Fondamenti di test del software - Certificazione ISTQB


Sono d'accordo su troppa lanugine, ma in ogni caso sono i più grandi giocatori lì e questa domanda era sulla teoria, quindi penso che ISTQB dovrebbe essere abbastanza buono.
Dominik,

6

In Rails, la cartella unità deve contenere test per i tuoi modelli, la cartella funzionale contiene test per i tuoi controller e la cartella di integrazione contiene test che coinvolgono un numero qualsiasi di controller che interagiscono. Le partite sono un modo per organizzare i dati dei test; risiedono nella cartella degli incontri. Il file test_helper.rb contiene la configurazione predefinita per i test. puoi visitare questo .


3

Il modo in cui ci penso è così: un test unitario stabilisce che il codice fa quello che intendevi fare (ad es. Volevi aggiungere i parametri aeb, in effetti li aggiungi e non li sottraggono), i test funzionali verificano che tutto il codice funzioni insieme per ottenere un risultato corretto, in modo che ciò che si intendeva fare il codice ottenga effettivamente il risultato giusto nel sistema.


3

AFAIK, i test unitari NON sono test funzionali. Lasciami spiegare con un piccolo esempio. Si desidera verificare se la funzionalità di accesso di un'app Web di posta elettronica funziona o meno, proprio come farebbe un utente. Per questo, i tuoi test funzionali dovrebbero essere così.

1- existing email, wrong password -> login page should show error "wrong password"!
2- non-existing email, any password -> login page should show error "no such email".
3- existing email, right password -> user should be taken to his inbox page.
4- no @symbol in email, right password -> login page should say "errors in form, please fix them!" 

I nostri test funzionali dovrebbero verificare se possiamo accedere con input non validi? Per esempio. L'email non ha il simbolo @, il nome utente ha più di un punto (è consentito solo un punto), .com appare prima di @ ecc.? Generalmente no! Questo tipo di test viene inserito nei test unitari.

È possibile verificare se gli input non validi vengono rifiutati all'interno dei test unitari, come mostrato nei test seguenti.

class LoginInputsValidator
  method validate_inputs_values(email, password)
    1-If email is not like string.string@myapp.com, then throw error.
    2-If email contains abusive words, then throw error.
    3-If password is less than 10 chars, throw error.

Si noti che il test funzionale 4 sta effettivamente eseguendo il test unitario 1. A volte, i test funzionali possono ripetere alcuni (non tutti) i test effettuati dai test unitari, per diversi motivi. Nel nostro esempio, utilizziamo il test funzionale 4 per verificare se un determinato messaggio di errore appare quando si immette un input non valido. Non vogliamo verificare se tutti gli input errati vengono rifiutati o meno. Questo è il compito dei test unitari.


1
Un buon punto sui test funzionali che spesso hanno un ambito molto più ristretto rispetto ai test unitari (in termini di test funzionali più focalizzati sulla prova essenzialmente del raggiungimento della funzione prevista), ma direi che descrivono in qualche modo dimensioni diverse ( composizione nei test unitari vs scopo nei test funzionali); alcuni test unitari sono test funzionali e alcuni test funzionali sono test unitari, ma c'è anche un sacco di Venn che non si sovrappone.
Myles,

Buoni esempi di ciò che è e non rientra nell'ambito dei test funzionali.
Myles,

2

TEST DELL'UNITÀ

Il test unitario include il test della più piccola unità di codice che di solito sono funzioni o metodi. Il test unitario viene svolto principalmente dallo sviluppatore di unità / metodo / funzione, poiché comprendono il nucleo di una funzione. L'obiettivo principale dello sviluppatore è di coprire il codice con unit test.

Ha una limitazione che alcune funzioni non possono essere testate tramite unit test. Anche dopo il completamento con successo di tutti i test unitari; non garantisce il corretto funzionamento del prodotto. La stessa funzione può essere utilizzata in alcune parti del sistema mentre il test unitario è stato scritto per un solo utilizzo.

PROVE FUNZIONALI

Si tratta di un tipo di test Black Box in cui verranno eseguiti test sugli aspetti funzionali di un prodotto senza esaminare il codice. Il test funzionale viene eseguito principalmente da un tester software dedicato. Includerà tecniche positive, negative e BVA che utilizzano dati non standardizzati per testare la funzionalità specificata del prodotto. La copertura del test viene condotta in modo migliore dai test funzionali che dai test unitari. Utilizza la GUI dell'applicazione per i test, quindi è più facile determinare di cosa è responsabile esattamente una parte specifica dell'interfaccia piuttosto che determinare di quale funzione è responsabile un codice.



1

Test unitario : - Il test unitario viene utilizzato in particolare per testare il componente del prodotto per componente specialmente mentre il prodotto è in fase di sviluppo. Gli strumenti Junit e Nunit ti aiuteranno anche a testare il prodotto secondo l'unità. ** Invece di risolvere i problemi dopo l'integrazione, è sempre comodo risolverlo all'inizio dello sviluppo.

Test funzionali: - Per quanto riguarda il Test ci sono due tipi principali di Test come 1. Test funzionale 2. Test non funzionale.

Il test non funzionale è un test in cui un tester verificherà che il prodotto eseguirà tutti quegli attributi di qualità che il cliente non menziona ma che tali attributi di qualità dovrebbero essere presenti. Ad esempio: -Performance, Usabilità, Sicurezza, Carico, Stress ecc. Ma nel Test funzionale : - Il cliente è già presente con i suoi requisiti e quelli sono adeguatamente documentati, Il compito dei tester è quello di verificare se la funzionalità dell'applicazione sta funzionando secondo al sistema proposto o no. A tale scopo, Tester dovrebbe verificare la funzionalità implementata con il sistema proposto.


0

I test unitari vengono generalmente eseguiti dagli sviluppatori. L'obiettivo di fare lo stesso è assicurarsi che il loro codice funzioni correttamente. La regola generale è quella di coprire tutti i percorsi nel codice usando unit test.

Test funzionali : questo è un buon riferimento. Spiegazione dei test funzionali


6
Si prega di incollare il testo più importante nella risposta, non si sa mai quando la pagina potrebbe essere rimossa rendendo il collegamento non valido.
Andrejs,
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.