Differenza tra test funzionale e test di integrazione

3

Sono profondamente confuso dalla differenza. Ho letto tante definizioni e spiegano sempre il test funzionale come test del requisito è soddisfatto. Bene, questo è solo riformulare il nome functional test . Questo non chiarisce la differenza.

Mi interessa un codice reale per dimostrare la differenza.

Supponiamo di avere una funzione in una libreria che esegue l'hashing:

def custom_hasher(scheme, val):
    # use many hashing libraries...


def hasher(inlist, scheme):
    """ Take a list and outputs the hashed values of a list. """

    output = list()
    for val in inlist:
        output.append(custom_hasher(scheme, val))
    return output

Ora per un test funzionale, suppongo che vogliamo testare ['a', 'b'] viene restituito come qualcosa come ['jask34sdasdas', 'asasjdk234sjdk'] dato qualche schema.

Ma questo è solo quello che può fare un test di integrazione! So esattamente quale tipo di input desidero (voglio una buona esecuzione in modo tale che io passi in una lista), o voglio che aumenti l'eccezione di Object has no append method se passo in un dizionario.

Posso farlo in entrambi. Dov'è la differenza?

Un altro esempio è una web app:

@logged_in   # only logged in user can do this
@route("/invite", method=['POST'])
def send_invite(request):
   recp_email = request.data['recp_email']

   # now do a bunch of logics before and after sending an email

Quindi nel mio test di integrazione, lo farò sicuramente su una rete (far funzionare il server). Invia qualche richiesta a questo URL. Lo stesso vale per il test funzionale.

Come disegnare una linea? In questo caso, posso scrivere un test funzionale che verifica se viene trovata una email guardando il registro di invio in alcune tabelle. Ma questa è una funzione diversa da quella che sto testando (la vista send_invite ).

Quindi non vedo come differenziare i due. Entrambi affermano qualcosa.

Per favore aiuto.

    
posta CppLearner 10.02.2013 - 03:40
fonte

1 risposta

4

Functional tests viene generalmente utilizzato come sinonimo di integration tests . Potresti confondere il unit tests con functional tests se ho capito correttamente la tua domanda.

Nei test unitari, mirare a testare la funzione stessa in modo isolato, simulando / stubando altri componenti.

Nei test di integrazione, verifica i diversi sistemi che lavorano insieme, per vedere se funzionano correttamente insieme per produrre l'output corretto.

Per il tuo esempio send_invite , nei test unitari, puoi prendere in giro l'e-mail e altri componenti del framework e testare solo se la funzione di invio dell'invito chiama correttamente il componente email con gli argomenti corretti. Per i test di integrazione, puoi configurare un server di prova e vedere se la funzione invia correttamente e-mail e fa tutto ciò che dovrebbe fare, inclusi gli altri componenti.

I test unitari sono il blocco di test più piccolo, seguito dai test di integrazione.

EDIT:

Lasciamo da parte le parole e affrontiamo il problema come perché abbiamo bisogno di test. Abbiamo bisogno di test per garantire che il nostro codice funzioni correttamente.

Nell'esempio send_email , per prima cosa dobbiamo testare la funzione in modo isolato per vedere come fa ciò che dovrebbe fare. Lo facciamo isolando la funzione da altri componenti tramite simulazione / stub per testare la funzione stessa. Supponendo che abbiamo un componente diverso che è responsabile per l'invio di e-mail, e la nostra funzione è chiamare questo componente per inviare e-mail, se il nostro componente e-mail è rotto, non vogliamo che questo influenzi il test di send_email , non è direttamente correlato a questa funzione. Vogliamo solo assicurarci che il codice nella funzione send_email funzioni correttamente. Questo è generalmente chiamato unit testing .

Dopo che siamo sicuri che la funzione funzioni correttamente in isolamento, dobbiamo verificare se il sistema di invito funziona correttamente, con tutti i suoi componenti. Questa volta lo facciamo testando la funzione senza mock / stub. Questo è generalmente chiamato integration tests .

In alcuni punti ci sono functional tests with side effects e functional tests without side effects , che significa chiamare la funzione con argomenti predefiniti nei test senza simulazione / stub per vedere che produce l'output corretto e chiamare la funzione con argomenti predefiniti nei test con il mocking / stub degli altri componenti, rispettivamente. Questo può tradursi in unit tests e integration tests .

La lingua può confondere e diverse culture / comunità a volte chiamano questi test con parole diverse. Ciò che deve essere fatto nei test è iniziare a testare con l'unità più piccola possibile e lavorare da lì a tutto il sistema. (Questo può essere fatto anche in ordine inverso, ma è fuori dallo scopo di questa risposta)

    
risposta data 10.02.2013 - 08:36
fonte

Leggi altre domande sui tag