Al lavoro, uno dei miei progetti consiste principalmente nel prendere dati passati da un client esterno e persistere in un database. Si tratta di un'app enterprise Java che utilizza JPA e gran parte della nostra logica ruota attorno alle operazioni CRUD.
La maggior parte dei nostri bug riguarda JPA in un modo o nell'altro.
- Esempio 1: se fai clic due volte sul pulsante di salvataggio, JPA potrebbe provare a inserire la stessa entità nel database una seconda volta, causando una violazione della chiave primaria.
- Esempio 2: recuperi un'entità dal database, modificala e prova ad aggiornare i suoi dati. JPA può provare a creare una nuova istanza invece di aggiornare quella vecchia.
Spesso la soluzione ha bisogno di aggiungere / rimuovere / modificare un'annotazione JPA. Altre volte ha a che fare con la modifica della logica DAO.
Non riesco a capire come ottenere la fiducia nel nostro codice usando i test unitari e TDD. Non sono sicuro che sia perché i test unitari e TDD sono inadatti o se mi sto avvicinando al problema.
I test unitari sembrano un brutto aspetto perché posso scoprire questi problemi solo in fase di esecuzione e devo eseguire la distribuzione su un app server per riprodurre i problemi. Di solito è necessario coinvolgere il database che considero esterno alla definizione di un test unitario: si tratta di test di integrazione.
Il TDD sembra un brutto aspetto perché il ciclo di feedback del deploy + test è così lento che mi rende molto improduttivo. Il ciclo di feedback di implementazione + test richiede più di 3 minuti, e solo se eseguo i test specificatamente sul codice che sto scrivendo. Per eseguire tutti i test di integrazione occorrono 30 minuti.
C'è un codice al di fuori di questo stampo e lo collaudo sempre ogni volta che posso. Ma la maggior parte dei nostri bug e il maggior numero di sink coinvolgono sempre JPA o il database.
C'è un'altra domanda che è simile , ma se avessi seguito il consiglio avrei avvolto la parte più instabile del mio codice (il JPA) e testato tutto tranne esso. Nel contesto della mia domanda, sarei nella stessa brutta situazione. Qual è il prossimo passo dopo il wrapping del JPA? IMO quella domanda è (forse) un passo per rispondere alla mia domanda, ma non una risposta ad esso.