Lavoro con molte applicazioni web guidate da database di varia complessità sul back-end. In genere, esiste un livello ORM separato dalla logica aziendale e di presentazione. Ciò rende il test unitario della logica di business abbastanza semplice; le cose possono essere implementate in moduli discreti e tutti i dati necessari per il test possono essere falsificati attraverso il derisione di oggetti.
Ma testare l'ORM e il database stesso è sempre stato pieno di problemi e compromessi.
Nel corso degli anni ho provato alcune strategie, nessuna delle quali mi ha completamente soddisfatto.
Carica un database di test con dati noti. Esegui test con l'ORM e verifica che i dati corretti vengano restituiti. Lo svantaggio qui è che il tuo DB di prova deve tenere il passo con qualsiasi modifica dello schema nel database dell'applicazione e potrebbe non essere sincronizzato. Si basa anche su dati artificiali e potrebbe non esporre bug che si verificano a causa di input stupidi da parte dell'utente. Infine, se il database di test è piccolo, non rivelerà inefficienze come un indice mancante. (OK, l'ultimo non è proprio quello per cui i test unitari dovrebbero essere usati, ma non fa male.)
Caricare una copia del database di produzione e testarlo. Il problema qui è che potresti non avere idea di cosa ci sia nel DB di produzione in un dato momento; potrebbe essere necessario riscrivere i test se i dati cambiano nel tempo.
Alcune persone hanno sottolineato che entrambe queste strategie si basano su dati specifici e un test unitario dovrebbe testare solo la funzionalità. A tal fine, ho visto suggerito:
- Utilizzare un server database fittizio e verificare solo che l'ORM stia inviando le query corrette in risposta a una determinata chiamata del metodo.
Quali strategie hai utilizzato per testare le applicazioni basate su database, se ce ne sono? Cosa ha funzionato meglio per te?