I test unitari durante la revisione del codice sono un cattivo sostituto per i test unitari durante lo sviluppo.
Quello che stai suggerendo ha molto senso, intuitivamente. A cosa serve la recensione? Per verificare che il codice sia buono. A cosa servono i test? Per verificare che il codice sia buono. Quindi perché non unire i due?
Ecco perché.
Portare il codice sotto test è un duro lavoro. Scrivere codice che funzioni solo all'unica cosa che deve fare è una cosa; la scrittura di codice che può essere testato in modo efficace ed efficiente è un altro. Il solo fatto che il codice ora funzioni in due scenari - "lavoro reale" e "test" - richiede una flessibilità molto maggiore, richiede che quel codice sia in grado di resistere da solo in modo significativo.
Scrivere il codice in modo che sia testabile è un lavoro e un'abilità extra. Rifattorizzare il codice di qualcun altro per la testabilità, quando non è stato scritto pensando alla testabilità all'inizio, può essere un compito importante.
Stai duplicando lo sforzo tra lo sviluppatore e il revisore. Presumibilmente, il tuo sviluppatore non sta consegnando il suo codice per la revisione senza almeno un certo livello di sicurezza che funzioni. Ha già bisogno di testare il codice. Ora, ci sono diversi livelli e ambiti di test. Il QA verifica il codice dopo lo sviluppatore e il revisore. Ma qualunque sia lo scopo che ritieni appropriato per lo sviluppatore e il revisore, non ha senso per lo sviluppatore capire come testare il codice a quel livello una volta , ma rendere i suoi test facili da riprodurre e difficili da riprodurre, quindi portare il revisore a sviluppare di nuovo il test, questa volta quelli che sono automatizzati e riproducibili. Stai solo facendo in modo che entrambi investano tempo nello scrivere gli stessi test - una volta male, una volta bene.
Stai trasformando la recensione in un passaggio molto più lungo e laborioso. Se il test è una parte importante del processo di revisione, cosa succede quando alcuni test falliscono ? Il revisore è responsabile per l'esecuzione di tutti i test, quindi deve eseguire anche il debug del codice? O verrà eseguito il ping-pong avanti e indietro, uno scrive test, l'altro li fa passare?
A volte puoi scrivere un sacco di test che sono tutti ortogonali tra loro, quindi non è necessario il ping-pong. Il revisore scrive una dozzina di test, la metà di essi fallisce, lo sviluppatore corregge i bug e tutti i test rimangono validi e ora passano. Ma ... un sacco di tempo, hai bug di blocco, o bug che richiedono riprogettazione e modifiche API, o quant'altro. Se stai assumendo la responsabilità di superare i test avanti e indietro tra revisore e sviluppatore, in realtà non sei in fase di revisione. Stai ancora sviluppando.
La necessità di scrivere test non incentiva una revisione più approfondita. Fondamentalmente significa che più approfondisci, più test devi scrivere e probabilmente saranno test difficili che devono andare in profondità nel sistema.
Confronta con lo sviluppatore che scrive i test, dove è il suo incentivo: se non scrivo test importanti, il revisore lo evidenzierà nella recensione.
Anche il revisore avrà una comprensione molto migliore del sistema se deve superare test approfonditi del codice , quindi se ha bisogno di decidere da sola quando può smettere di scrivere test di approfondimento e semplicemente OK la revisione del codice.
Se lo sviluppatore non sta scrivendo test unitari, neanche il revisore. Esistono molti ostacoli all'adozione dei test come pratica comune. Forse sei troppo sotto pressione e la tua base di codice è difficile da mettere alla prova. Forse non sei così esperto nei test e senti che non puoi permetterti la curva di apprendimento. Forse hai un assassino di ascia che invia note minacciose a persone che scrivono test. Non lo so!
Ma qualunque sia la causa, è sicuro scommettere che si applica ugualmente al revisore e allo sviluppatore. Se il team è stressato, il revisore non ha più tempo di quanto lo sviluppatore (se lo fa, ridistribuire il lavoro in modo che le persone non siano così stressate ). Se nessuno sa come scrivere bene i test unitari, probabilmente anche la recensione (se lo fa, dovrebbe sedersi e insegnare ai suoi compagni di squadra ).
Questo suggerimento sembra tentare di passare il dollaro da un collega all'altro. E non vedo alcun modo per farlo funzionare bene, prima di tutto perché è davvero difficile (e malsano) creare una situazione in cui una persona è l'unica che può fare test e un'altra persona non può farlo qualsiasi test a tutti.
Ciò che funziona è avere anche i test di copertura della recensione. Se lo sviluppatore ha già scritto dieci test, è molto più probabile che il revisore possa aiutarti a suggerirne altri dieci rispetto a quando lo sviluppatore non ne ha scritto nessuno.
E, se testare casi angolari è un compito importante, potrebbe avere senso distribuirlo in modo più ampio in tutto il team. ** Una volta che il codice è testabile in primo luogo, scrivere più test diventa molto più semplice. **
La recensione è un ottimo momento per individuare casi angolari. E, se il recensore può saltare e scrivere un test per casi angolari che trova, allora ehi - tanto meglio! Ma in generale, supponendo che il revisore possa scrivere test in cui lo sviluppatore non sembra un'idea molto scadente.