query SQL nei test di integrazione

2

Situazione attuale

Ho una situazione che trovo frustrante: i test di integrazione nel mio progetto (un'API RESTful) contengono sia le chiamate HTTP API che le query SQL. Ogni volta che viene effettuata una chiamata API che scrive qualcosa sul DB (una richiesta POST, PUT o PATCH), viene avviata una query SQL scritta a mano per confrontare la risposta dell'API con il DB. Quindi:

  1. Invia richiesta POST, ricevi risposta
  2. Invia query SQL, ricevi risposta
  3. Confronta le due risposte

I test di integrazione si svolgono in un progetto separato, quindi è impossibile utilizzare solo l'ORM del progetto principale e non analizzare le risposte del DB negli oggetti di business che stiamo utilizzando.

Problema

Ho un problema con la dura dipendenza tra la struttura del DB e i test di integrazione.

Il progetto è giovane e la struttura del database è in costante cambiamento. Ogni volta che si verifica una modifica nel DB, le query SQL in tutti i test di integrazione interessati vanno fuori sincrono e devono essere aggiornate manualmente. Quando il cambiamento è piccolo, di solito non è un grosso problema, ma ogni volta ad es. una colonna viene modificata in una chiave esterna, tutte le query interessate iniziano improvvisamente a richiedere un join, le colonne selezionate necessitano di alias di tabella per evitare nomi di colonne ambigue.

Questo diventa un problema soprattutto quando i test stessi creano le query SQL da blocchi elementari più piccoli: una clausola WHERE può essere passata come argomento a un metodo che restituisce l'SQL o forse una seconda query potrebbe essere costruita sulla base di alcuni parametri utilizzati nel primo.

Infine, ogni volta che una raccolta è contenuta nella risposta dell'API, di solito si tratta di un join nell'SQL che richiede un'ulteriore elaborazione (modifica n di righe selezionate in una singola riga con una raccolta in una delle colonne).

In cima a questo, dato che i test di integrazione richiedono alcune ore per essere completati, non esiste un riscontro immediato che ci sia un problema, che prolunga il tempo necessario per risolvere eventuali problemi.

In breve, una piccola modifica nella struttura del DB spesso si traduce in diversi giorni lavorativi sprecati per l'aggiornamento di SQL e della logica di compilazione SQL nei test di integrazione .

Motivazioni

Il razionale per avere query SQL nei test di integrazione sembra essere che il team abbia riscontrato problemi con la struttura del DB: i dati recuperati erano corretti, ma erano stati salvati in modo errato nel database.

Questa è la spiegazione data a me quando ho sollevato il problema. Non lo compro

Soluzione

Quindi qual è l'approccio migliore?

Credo che se testiamo l'API, dovremmo fare affidamento sulle chiamate API esclusivamente per confrontare le risposte ed eliminare del tutto l'SQL, quindi:

  1. Invia richiesta POST, ricevi risposta
  2. Invia richiesta GET per l'entità interessata, ricevi risposta
  3. Confronta i due

Tuttavia, se il team afferma che la struttura del database deve essere verificata, non so quale soluzione offra loro invece di ciò che abbiamo attualmente.

Gradirei qualsiasi suggerimento, suggerimento o link a articoli (preferibilmente brevi) che affrontino questo problema.

    
posta mingos 28.07.2016 - 12:18
fonte

1 risposta

2

Sembra una giusta base di codice contorta che è un incubo. È una cosa nuova o un enorme pezzo di cacca che stai mantenendo? Se il primo - hai altri problemi.

Tuttavia. Non c'è niente di sbagliato nel verificare l'archivio dati per vedere che contiene ciò che è previsto. È una sorta di scorciatoia per verificare che le future chiamate API siano corrette (ovvero dici che i dati corretti sono stati restituiti dall'API ma i dati memorizzati erano sbagliati - che suggerisce che i dati errati verranno restituiti alla fine, probabilmente dopo che il server è stato riavviato e la cache viene cancellata e ri-popolata con dati errati che dovrebbero essere stati salvati correttamente. Buona fortuna trovare questo tipo di errore rapidamente, ma se si controlla il DB, sarà ovvio che cosa è andato storto ricorda che i dati nel DB sono i dati dorati, tutto il resto è secondario).

Quindi hai problemi nella creazione dei test di integrazione. È possibile rendere più semplice la base di codici per generarli, quindi chiunque modifichi uno schema DB o modifichi il codice, allora sa quali test di integrazione aggiornare. Qualcuno deve sempre aggiornare i test quando il codice cambia, assicurarsi che sia la persona che cambia il codice responsabile dell'aggiornamento dei test.

Cercherò disperatamente di ridurre l'accoppiamento all'interno del codebase sebbene, se 1 tabella è gestita da 1 modulo e solo quel modulo, rende molto più facile sapere quali test sono coinvolti.

La prossima cosa da fare è dividere i test di integrazione in parti più piccole che possono essere eseguite immediatamente, come i test unitari. Quindi avrai almeno un feedback più rapido.

La terza opzione non è controllare i risultati dalle API ma avere dati fissi che vengono eseguiti su un set fisso di dati DB, quindi puoi semplicemente controllare il DB contro se stesso, piuttosto che la risposta dell'API restituita.

    
risposta data 28.07.2016 - 12:49
fonte

Leggi altre domande sui tag