Non ripetersi su codice di test di integrazione e codice di produzione?

2

Credo fermamente nel non ripetermi nel codice di produzione. Ho accettato l'idea che non dovresti ripeterti all'interno del codice di test. Ma cosa succede quando disponi di servizi di produzione che semplificano il codice di prova?

Lasciami fare un esempio. Abbiamo un servizio che accede all'API Doohickey. L'API di Doohickey è complessa, per necessità, e abbiamo un sacco di codice per semplificarlo per le nostre esigenze.

Ora ho bisogno di scrivere alcuni test automatici per il nostro servizio. I miei test devono impostare i dati nel servizio e sarebbe davvero utile riutilizzare quella facciata. Ma poi mi trovo in una discussione con me stesso, che è più o meno così:

"Se introduci un bug in Facciata, il test potrebbe non mostrarlo."

"Ma se si prende una copia, quando Dohickey Inc aggiorna la propria API, è necessario apportare la modifica in due punti."

"Vero, ma forse è una buona cosa. Possiamo aggiornare prima il codice di produzione, gestire i dati dei test usando l'API vecchia, nota e ancora supportata e testare accuratamente la nuova versione."

E poi penso che forse sto pensando troppo al problema. Qualcuno ha esperienza con questo tipo di problema? Se sì, da che parte sei andato e te ne sei pentito in seguito?

Modifica: i primi commenti suggeriscono che è richiesto un esempio più specifico.

Dire che ho un servizio che può creare un prodotto E creare un ordine. Ho il seguente test per scrivere ...

Given that product X exists
When customer Y orders product X
Then an order should exist for customer Y, including only product X

Per la parte "Quando" di questo, contatto il mio servizio, che utilizza una facciata attorno all'API Acquisti Dohickey per creare l'ordine.

I passaggi "Given" e "Then" dovrebbero creare un prodotto e ottenere un ordine, ma non dovrebbero passare attraverso il servizio per farlo. Forse il mio servizio non ha quella funzionalità, e se lo fa, lo controllerò altrove.

MA la facciata che vive all'interno del servizio renderebbe il codice di prova molto più semplice. Quindi dovrei fare riferimento al codice di produzione e usarlo o copiare / riscrivere la facciata?

    
posta pdr 06.03.2014 - 13:01
fonte

2 risposte

2

Nel tuo scenario probabilmente eseguo test diversi:

  • Test unitario del mio modello / logica aziendale. In questo test ho preso in giro l'astrazione creata su Doohickey API. Con questo test ho fiducia nella mia logica di business.

  • Un test del contratto per l'astrazione su Doohickey API. Con questo test, verifica che il mio codice funzioni correttamente con l'API e mi protegga da eventuali modifiche nell'APi.

  • Probabilmente scrivo qualche test di integrazione / sistema, in questo test ho bisogno come dici tu dell'astrazione di Doohickey per inserire i dati, io li uso e non duplicare il codice. Con questo test ho fiducia che tutti i pezzi del mio sistema lavorano insieme.

Se il codice per l'inserimento dei dati interrompe due interruzioni di prova nel mio sistema, il test contrattuale e il test di sistema, in effetti, quando è normale che quando un test di unità o contratto fallisce, anche uno o più test di sistema falliscono. Ma questo ti dà molte informazioni, sai con il test dell'unità / contratto l'esatto codice che fallisce e sai con i sistemi testare la funzionalità che è rotta nel tuo sistema di conseguenza.

    
risposta data 06.03.2014 - 13:26
fonte
2

"If you introduce a bug in the Facade, the test might not show it."

Se non si utilizza la facciata, sarà comunque necessario "impostare i dati nel servizio" (come lo hai descritto), quindi è necessario scrivere almeno un codice equivalente. Chi dice che non introduci un bug proprio lì? O forse c'è già un bug nella facciata e quando duplichi il codice della facciata, cosa ti rende sicuro di non copiare nemmeno il bug?

Quindi non vedo alcun vero motivo non per riutilizzare il codice della facciata nei tuoi test - Non penso che le possibilità diventino davvero più alte da trascurare alcuni errori in questo modo.

    
risposta data 06.03.2014 - 13:31
fonte

Leggi altre domande sui tag