Test automatico per il codice che richiede una serie di dati di input e genera una serie di dati - dovrebbe essere suddiviso?

1

Sto per scrivere un programma e test (s) per questo. Questa domanda riguarda come strutturare il test di integrazione di livello più alto.

Al livello più alto, il programma principale prende una porzione di dati e genera un altro blocco; in particolare, prende un intero carico di dati aziendali come salari, costi dei materiali e così via da un file di configurazione o simili e produce un singolo file XML che elenca i prodotti, i loro prezzi, i dati specifici del prodotto, i dati su gruppi di prodotti, e molte altre cose.

Quindi come dovrebbe essere questo test di integrazione di primo livello?

Mi associo all'idea di scrivere test di livello superiore prima di ogni altra cosa, agendo come una specifica dell'interfaccia per il codice da programmare e in misura molto minore per catturare bug (poiché ad un dato livello, l'insieme di i test dovrebbero essere più accurati del livello precedente, quindi la maggior parte dei test dovrebbe essere eseguita in test unitari.)

Sto pensando di scrivere qui un singolo test di integrazione di primo livello: alimentarlo con un file di configurazione completo, quindi verificare che l'output XML sia come previsto.

Quindi, usando PHPUnit, avrei una singola classe TestCase con un singolo metodo test() . E quel metodo affermerebbe ogni tag XML previsto e il loro contenuto, e fallirà anche se ci sono tag inattesi. Ma solo una combinazione di input di configurazione verrebbe testata. (O forse un paio se sembra davvero necessario in un secondo momento).

In questo modo, il test servirà come indicatore per mantenere gli sforzi di programmazione focalizzati sull'obiettivo finale.

E il test sarebbe facile da leggere (e mantenibile?) poiché consiste solo in un metodo di test molto piccolo, un file di configurazione di input e un file XML di output previsto.

Il problema è che ho letto che i test dovrebbero essere sempre mantenuti piccoli - ad es. al massimo una manciata di asserzioni per metodo di prova. Ma poi testare un intero file XML come questo sarebbe un odore di codice?

    
posta CL22 22.02.2016 - 20:05
fonte

1 risposta

1

Assicurati di fare una distinzione tra test di integrazione e test unitari. Quello che stai descrivendo è un test di integrazione, in cui testerai tutto funziona quando messo insieme. Quindi passeresti l'input XML e poi rivedrai l'output XML per vedere se ha generato l'output corretto.

Questo è diverso dal test dell'unità. I test di integrazione possono, e spesso, richiedere un po 'di tempo per essere eseguiti. È nella loro natura molto più onnicomprensiva e completa.

I test unitari dovrebbero essere piccoli, leggeri e veloci, ma il loro scopo è testare una piccola unità di codice (ad esempio una classe o una funzione). In questo modo puoi cambiare classe e ripetere il test dell'unità per assicurarti di non averlo infranto.

È possibile fare a meno dei test unitari se si dispone di un test di integrazione abbastanza buono, tuttavia la maggior parte delle persone non dispone di un test di integrazione sufficiente per ottenere una buona copertura del codice base. Inoltre, poiché i test di integrazione tendono a richiedere un sacco di implementazione o configurazione e richiedono un po 'di tempo per essere eseguiti, non li eseguirai molto spesso in modo che possano passare dei bug che saranno più difficili da correggere se li individuerai nel momento in cui li fai .

    
risposta data 23.02.2016 - 12:38
fonte