Test di automazione per il flusso ETL

2

Ho creato un ETL che analizza vari file, trasforma i dati del file e poi inserisce le righe in un DB, fino ad ora ho fatto un test manuale e controllato che tutti i valori analizzassero correttamente e tutte le linee (quelle necessarie) fossero inserite nel DB, ovviamente è diventato frustrante e soggetto a errori e voglio automatizzare quei test.

Ho pensato di creare un "file di test" con dati "predetti" e poi, analizzarli e provare a validare (verificare) tutti i valori sul DB, ma non sono sicuro se dovrei testare i valori del DB o le funzioni "trasformatori" nel mio codice.

Ad esempio:

Ho 3 tipi di file CSV che contengono:

  1. File 1
    • Data di nascita - GG / MM / AAAA (23/04/1992)
    • Altezza - cm (173)
    • Peso - Kg (70)
  2. File 2
    • Data di nascita - MM / GG / AAAA (23/04/1992)
    • Altezza - pollici (68.11)
    • Peso - sterline (154.324)
  3. File 3
    • Data di nascita - AAAA-MM-GG (1992-04-23)
    • Altezza - cm (173)
    • Peso - Kg (70)

Quindi il codice estrae le righe da ciascun file e quindi (in base alla mappatura del file) dal valore della colonna e crea un'istanza del trasformatore appropriato, i valori di trasformazione inseriti in DB, nel mio esempio, dopo aver analizzato quei file in DB, avere 3 righe con gli stessi valori (23/04/1992, 173, 70)

Forse c'è un modo più corretto per eseguire il test?

    
posta Michael 25.07.2017 - 12:03
fonte

2 risposte

4

Quello che stai descrivendo è un test end-to-end. Questo è un modo per convalidare il tuo sistema e ha alcuni vantaggi: garantisce che ogni parte del sistema funzioni.

Il rovescio della medaglia è che colpisce ogni parte del tuo sistema, il che può renderlo lento da configurare e tenderà a essere fragile (cambiare una cosa può rompere numerose altre parti).

Un approccio comune, e quello che raccomanderei, è quello di rompere le funzioni di trasformazione e testare quelle esplicitamente con i test unitari. Ciò richiederà di scrivere il programma in un modo che permetta di richiamare il codice di trasformazione senza il codice di lettura del file o di accesso al database. Ciò ha alcuni importanti vantaggi: se, in pochi anni, qualcuno decide che desiderano che queste trasformazioni si verifichino all'interno di un'altra applicazione, possono riutilizzare solo il codice di trasformazione (senza dover capire come suddividerlo separatamente dal resto).

Quindi, finirai con un gruppo di test unitari, che testano piccole parti specifiche del codice - per esempio, "un input di 3 record dovrebbe risultare in 3 inserimenti di database", "un input di 3 record, uno dei quali esiste già nel database, dovrebbe comportare solo 2 inserimenti nel database "," richiamare la trasformazione su un record che manca un campo obbligatorio deve generare un'eccezione ", ecc.

Per configurarlo, è probabile che sia necessario convertire il lettore di file e il masterizzatore di database in interfacce. Quindi implementate la versione che funziona "per davvero", così come impostando una versione che pretende di fare, ma in realtà sta solo confermando che è stato chiamato il codice previsto. Non è necessario scrivere esplicitamente queste classi false, la maggior parte delle lingue dispone di librerie che gestiranno questo processo (chiamato "mocking") per te.

Quindi, una volta che hai tutto pronto, avrai un sacco di test unitari che confermano specifiche funzionalità nel codice di trasformazione.

C'è un lotto in più che va bene nella scrittura di software testabile, ma questo dovrebbe almeno farti pensare nella giusta direzione. Se vuoi modificare la tua domanda per includere in quale lingua si trova il software, posso indicarti alcuni strumenti specifici per il tuo caso d'uso. Senza conoscere il tuo caso d'uso preciso, posso almeno consigliare di cercare "software testabile per scrivere" e leggere un po '.

    
risposta data 25.07.2017 - 18:57
fonte
3

I'm not sure if I should test the DB's values or the "transformers" functions in my code

Fai entrambe le cose.

Non conosciamo il tuo design ma, ciò che abbiamo qui sono tre diversi timori che, in teoria, dovrebbero essere fatti per testare indipendentemente gli uni dagli altri.

Suppongo che -almeno- hai implementato i test unitari per ogni E(xtract) , T(ransform) e L(oad) come gli sviluppi come elaborati. Questi sono i tuoi primi test automatici.

Un altro tipo di test che considero un must sono i test di integrazione.

A questo punto, per integrazione, intendo "l'assemblaggio" dei componenti. Come si comportano tutti insieme lavorando senza il DB o i file CSV.

Gli ingressi e le uscite possono essere eseguiti in memoria. Ad esempio, utilizzando gli array come input e collezioni come output. Dipenderà molto dal tuo design. Ad esempio, se hai implementato il pattern di repository, dovrebbe essere facile per te prendere in giro i metodi load e save . Lo stesso vale per i lettori CSV, fondamentalmente perché questi file sono anche un'origine dati a cui è possibile anche astrarre l'accesso.

Questi sono i tuoi secondi test automatici.

Quando dico automatizzato, volevo dire che questi test sono eseguiti automaticamente durante la fase di costruzione o di confezionamento. Non ho familiarità con la tecnologia dello stack PHP, ma presumo che PHP abbia già diverse librerie e strumenti indirizzati a questo scopo.

Per quanto riguarda i test end-to-end, se non puoi permetterti di implementare un database in memoria, non vedo perché non dovresti fare test contro il vero DB. Non penserei che questo testasse i valori di DB. Assicurati di poter ripristinare lo stato del DB alla fine del piano di test (ad esempio, eliminando le righe).

Come automatizzare i test end-to-end è una domanda abbastanza ampia. Troverete diversi strumenti rivolti a questo scopo. Mi piacciono particolarmente quelli che mi consentono di progettare casi d'uso in modo dichiarativo. Ad esempio da script. Li ho trovati facili da integrare con CI.

Qui una rappresentazione visiva del piano di test suggerito sopra. Ogni colore appartiene a un diverso insieme di test.

    
risposta data 25.07.2017 - 20:30
fonte

Leggi altre domande sui tag