Ciò che rende un test un'integrazione o un test di sistema è il fatto che il metodo in prova si basa su altre parti del sistema.
Immagina il seguente processo:
- I dati vengono caricati dal database come enumerazione,
- Un metodo percorre l'enumerazione e aggrega gli elementi in qualche modo,
- Il risultato dell'aggregazione viene archiviato nel database.
Quando un'unità testa il metodo che aggrega gli elementi, non puoi semplicemente fare affidamento sulle chiamate al database: questo non sarebbe un test unitario perché ha dipendenze esterne; un errore nel codice del database fallirebbe il test, anche se il metodo stesso è corretto. In altre parole, non è possibile correlare il fallimento del test con l'errata impostazione del metodo:
- Un test può iniziare a fallire anche se il metodo non è cambiato dall'ultimo passaggio.
- Una regressione non può fallire il test perché è compensata da un cambiamento nella dipendenza esterna.
Quindi dovrai creare stub e mock per la logica di accesso ai dati, al fine di isolare il metodo. Si passa una determinata enumerazione al metodo e si controlla il risultato. Nessun database coinvolto.
Ora, dove ottieni i dati per l'enumerazione non ha molta importanza. Potrebbe venire dal codice. O dal database. O dal file flat. Questo fa parte del test , non del codice sotto test . Se il test chiama effettivamente un'API per ottenere gli elementi, è ancora un test unitario.
Tuttavia, i test unitari sono generalmente brevi e semplici, perché è più facile ragionarli quando sono brevi e semplici. Lo spostamento di dati in un file o in un database o in un'API rende il test [inutilmente] complicato. Ora, quando devi verificare il test dell'unità, devi cercare non in una, ma in due posizioni . Quindi mentre quelli sono ancora test unitari, possono diventare rapidamente un incubo di manutenzione. Il secondo problema è che un errore nell'origine dati esterna può portare a un test dell'unità fallito , in modo imprevisto.
-
L'uso di un file flat può essere OK (dopotutto, il codice sorgente non è altro che un file flat).
Tuttavia, troverei strano che tu abbia bisogno di così tanti dati per il tuo test unitario che devi effettivamente metterlo in un file.
Devi anche essere sicuro che i permessi del file system non interferiscano con i test delle unità e che il file non venga modificato per errore.
-
Usare un database sarebbe strano. Come si assicura che i dati siano corretti (se si inseriscono questi dati nella configurazione di test, non ha senso: si può passare direttamente al metodo testato, ignorando il database)? E i metodi che eseguono in parallelo?
Inoltre, assicurarsi che il database sia installato correttamente e che funzioni non sia un compito facile. I test unitari probabilmente non hanno bisogno di tale complessità.
-
L'utilizzo di un'API è ancora più strano. Normalmente non controlli l'API, il che significa che potrebbe fallire in modo casuale, in mancanza dei test di unità senza motivo.