Come posso testare il codice che verifica la sanità dei dati?

0

Ho una grande struttura dati che viene letta da XML. Mi è stata fornita una lunga lista di vincoli che devono essere mantenuti tra i membri dei dati. Ad esempio, uno dei vincoli potrebbe essere simile a

some_complicated_function(data.childOne.fieldTwo.bar) < sqrt(
        data.childThree.fieldFive.foo.quux)

La mia migliore idea è di avere test che simulino i dati in un modo che non soddisfa esattamente uno dei vincoli e poi ispezionano i log. Il problema è che tutto è così interconnesso che il tentativo di organizzare le cose in modo esatto in cui un controllo fallisce - o addirittura rintracciare tutti i controlli che dovrebbero fallire nel cambiare un set di dati "pulito" in un certo modo - richiederà un buona dose di trucchi matematici non sono sicuro di esserlo.

Penso che dal momento che non ho strumenti per vedere quale sia l'output di some_complicated_function dovrebbe essere, sono bloccato guardando il mio codice e lo pseudocodice in il manuale di riferimento in cui è descritta la funzione e assicurandosi che facciano la stessa cosa a mano. Allo stesso modo, dovrò riscrivere la logica del vincolo per testarlo, quindi quei test non mi aiuterebbero davvero a credere che i miei assegni funzionino come dovrebbero.

    
posta JETM 02.03.2016 - 14:19
fonte

2 risposte

0

Il modo in cui verificherei è suddividendolo in unità più piccole che possono essere testate. Non hai dato alcuna indicazione su quale lingua o ambiente stai lavorando, quindi presumo che sia un linguaggio di tipo OO ... L'approccio generale potrebbe valere per qualsiasi paradigma, ma YMMV.

Prima di tutto: la some_complicated_function dovrebbe essere un metodo su una classe. Si verifica l'implementazione della funzione complicata effettiva passandole valori semplici che si controllano e si convalida l'output. Questo isola questa parte della complessità dandoti un punto su cui concentrarti quando capisci come funziona la funzione complicata. Puoi testarlo e svilupparlo in isolamento.

In secondo luogo, l'interazione tra some_complicated_function e sqrt dovrebbe anche far parte di una classe. Il fatto che questa relazione debba essere verificata significa che c'è un qualche significato implicito tra i campi. Crea un metodo su questa classe che, di nuovo, prende due valori come input semplice. Prendi in prestito le chiamate a some_complicated_function passando la classe che abbiamo creato in precedenza in questa classe e chiamandole. Prova questa classe passando due valori, asserendo che le chiamate appropriate ad Alpha sono fatte e che l'output è corretto, a seconda del risultato di Alpha. Ricorda che a questo punto non ti interessa come funziona effettivamente Alpha. Tutto ciò che ti interessa è che il risultato della chiamata debba essere inferiore al risultato della chiamata sqrt.

In terzo luogo, avere una classe a cui si passa l'XML. Questa classe chiama semplicemente la classe sopra con i dati che recupera dai campi giusti. Il test di questa classe significa semplicemente che si convalida che è stata effettuata una chiamata al metodo di convalida creato nel passaggio 2 e che i valori dei campi corretti vengono passati. In questo test, ti preoccupi solo del fatto che i campi giusti vengono passati al metodo e che la logica di validazione si comporta correttamente in base al risultato.

Questo potrebbe farti perdere un sacco di metodi o classi piccoli, ma nella mia esperienza questo ti porta a un codice più pulito che è facile da capire perché è altamente focalizzato (e SOLID).

    
risposta data 02.03.2016 - 14:51
fonte
0

Quando si prevede di testare un vincolo specifico, si creano test unitari. Un test unitario avrà un piccolo scopo: di solito uno o più metodi. Nel tuo caso, i test unitari possono garantire che some_complicated_function restituisca i valori previsti chiamando con parametri diversi. A questo livello, non hai XML o "strutture grandi".

Una volta che hai una serie di test unitari che assicurano che i vincoli funzionano in isolamento, potresti anche essere interessato a sapere come questi vincoli vengono eseguiti quando combinati insieme.

Per fare ciò, è possibile utilizzare i test di integrazione o di sistema che, invece di concentrarsi su un determinato metodo, saranno a un livello di astrazione molto più alto. Ad esempio, invocheranno il correttore mentre specificano un file XML di esempio e controllano se la convalida ha esito positivo o negativo. Qui, non è necessario testare ogni singolo vincolo, questo è l'obiettivo dei test unitari. Invece, ottieni l'immagine generale.

    
risposta data 02.03.2016 - 14:51
fonte

Leggi altre domande sui tag