Cosa c'è di sbagliato nel test dell'unità di misura contro l'implementazione concreta se i tuoi quadri non cambieranno?

2

In primo luogo un po 'di background: stiamo riprogettando la nostra suite di prodotti che è stata scritta 10 anni fa e ha raggiunto il suo scopo. Una cosa che non possiamo cambiare è lo schema del database dato che abbiamo più di 500 client basati su questo sistema. Il nostro schema db ha oltre 150 tabelle. Abbiamo deciso di utilizzare Entity Framework 4.1 come DAL e di valutare ancora vari framework per l'archiviazione della nostra logica di business.

Sono un'indagine per portare i test unitari nel mix, ma ho anche confuso su quanto ho bisogno di impostare un ambiente TDD completo. Un aspetto della creazione di test unitari consiste nell'implementare il Repository, l'unità di lavoro e le strutture di simulazione ecc. Ciò significa che ci saranno costi e investimenti per la crescita del codice associata a tutti questi framework. Capisco che alcuni di questi potrebbero essere generati automaticamente, ma quando si tratta di cose come i comportamenti, sarà scritto per lo più a mano. Per essere chiari, non sto mettendo in dubbio l'importante unità di test del codice. Non sono sicuro che abbiamo bisogno di tutti i suoi componenti (come repository, mocking, ecc.) Quando siamo abbastanza sicuri del meccanismo di archiviazione / framework (SQL Server / Entity Framework). Tutto ciò che il codice gonfia con i repository generici ha senso quando hai bisogno di un layer generico con la possibilità di cambiarlo quando vuoi, ma è molto probabilmente uno YAGNI nel nostro caso. Ciò di cui abbiamo bisogno è più un test di integrazione in cui possiamo testare il nostro codice unitario con oggetti di deposito concreti e dati di test nel database. In questo scenario, l'esecuzione del test di integrazione sembra essere più utile nel nostro caso. Qualche idea se mi manca qualcosa qui?

    
posta palm snow 19.09.2012 - 02:16
fonte

3 risposte

5

Oltre alla velocità indicata da psr, i test unitari evitano di colpire il database / repository per aiutare a isolare gli errori. La soluzione non sta creando un repository generico. Invece, consente al repository di essere scambiato per un repository di test che controlla se il livello / modello aziendale sta effettuando le chiamate al repository corrette. Allo stesso modo, un modello / livello aziendale di stub può effettuare chiamate di test a un repository in uno stato noto e confrontare i risultati con valori corretti noti.

Effettuare un test di integrazione utilizzando il repository è anche una buona idea, ma ha uno scopo diverso dai test delle unità. La sfida con i test di integrazione completi come parte dei test unitari è garantire che i test e i dati dei test non interferiscano con gli altri, come ad esempio uno sviluppatore che lavora sulle modifiche.

    
risposta data 19.09.2012 - 02:45
fonte
3

Test dell'unità contro il database significa che hai effettivamente un database di test. In generale, questo è un sovraccarico in sé e per sé. Il tipo di overhead che non è il tipo solido, ripetibile, ripetibile che i test unitari devono essere efficaci.

  • DB è giù? i test falliscono
  • La rete è giù? i test falliscono
  • Lavorare da casa? i test falliscono
  • Qualcuno non ha distribuito correttamente i dati del test? i test falliscono
  • Qualcuno sta eseguendo un altro test contemporaneamente? i test falliscono se non stai attento.

I test dovrebbero fallire sempre e solo in un caso: la cosa che sono specificamente progettati per testare non passa la loro asserzione.

Ora questi possono essere risolti principalmente avendo un database distribuito localmente ogni volta nuovo dai dati di test. Ma come è davvero diverso dai repository Mock (tranne essere più lento e più incline agli errori)?

    
risposta data 19.09.2012 - 04:12
fonte
2

I test saranno molto più lenti se tutti colpiscono il database, quindi probabilmente non sarai in grado di eseguirli quasi altrettanto spesso, o passerai molto tempo ad attenderli. Questo è un grosso problema, perché vuoi eseguire i tuoi test parecchio.

Inoltre, è difficile ottenere un enorme vantaggio dalla riprogettazione se non puoi toccare lo schema. Puoi dare un'occhiata a Design di database evolutivo che parla di come svilupparsi rispetto a uno schema che cambia. Ammetto che la migrazione dei dati è difficile, ma lo è anche per la riprogettazione di un'applicazione e tu la stai prendendo in considerazione.

    
risposta data 19.09.2012 - 02:35
fonte