Recentemente ho avuto molte occasioni in cui ho avuto bisogno di mantenere complesse procedure e funzioni memorizzate. Erano già rotte, di solito in modo abbastanza sottile - c'erano pochissime occasioni in cui si chiamava SP con parametri validi e semplicemente non funzionava.
La mia soluzione era di evolvere un framwork che eseguisse le stored procedure all'interno di una transazione, dopo aver inizializzato il database alle condizioni iniziali di cui avevo bisogno, quindi testando il risultato atteso, anche all'interno della stessa transazione. La transazione è stata annullata alla fine del test.
Questo ha funzionato molto bene. Ma alcuni chiamerebbero questo "test di integrazione" poiché implica l'integrazione con il database. Lo chiamo unit test, dal momento che ho testato singoli componenti e singoli casi di test per quei componenti, e dal momento che ho controllato completamente lo stato iniziale del database.
Ma dove dovrebbe essere tracciata la linea? Questo test di integrazione o test di unità? C'è una ragione pratica per cui questo tipo di test è una cattiva idea? Se questo è "solo" test di integrazione, qualcuno ha suggerimenti su come eseguire "unit test" su queste stored procedure?
Aggiornamento, 3 1/2 anni dopo. Nel mio progetto attuale, ho iniziato a utilizzare i test delle unità SSDT, con successo, anche se potrebbero essere migliori. Vedi Verifica del codice del database utilizzando i test dell'unità SQL Server . Questi in genere distribuiscono il progetto del database nell'istanza di SQL Server LocalDB, pertanto rimuove qualsiasi domanda sull'ambiente del database che interessa il test. Compilo il database con i dati richiesti durante il Pre-Test, che rimuove le domande sul contenuto del database. In effetti, utilizzo le istruzioni MERGE per fare ciò, assicurando che tutti i dati che non sono necessari per il test corrente vengano rimossi, inseriti o aggiornati dal database prima del test. Hanno problemi:
- Non sono veloci
- Non è possibile riutilizzare le condizioni di prova
- Non è possibile riutilizzare i pre-test (a meno che non li rendiate comuni a tutti i test di un progetto)
- L'interfaccia utente potrebbe essere migliorata
Uno dei motivi per i problemi di cui sopra è che non mi sono ancora lamentato di loro. Raccomando a chiunque sia interessato di provare questa funzione e quindi lamentarsi. Ecco come sono fatti i miglioramenti.