Un test ha generato un codice?

4

Il mio team non scrive test per il codice generato (ad esempio alcuni POJO). Un ingegnere che rispetto molto di recente ha scritto sul tema:

Research over the past 10 years has revealed that generated code is as prone to bugs as other code, and in many cases the bugs in generated code are far more costly to triage. Hence, the common recommendation regarding generated code is that it should be unit tested either by:

  1. Generated unit tests (provided along-side the generated code)

  2. Unit tests provided by the integration code

Most of the time #1 isn't available, but #2 above is usually intrinsic to the unit tests written for classes utilizing the generated code, and well written unit tests for the consuming/extended classes results in high coverage of the generated code.

This recommendation has been universally (more-or-less) picked up by the code coverage community, as evidenced by the fact that Cobertura's replacement, JaCoCo, does not even provide exclusions as an option.

Non sono stato in grado di trovare una ricerca su questo argomento, ma di nuovo non sono nel profondo delle prove. Ci sono dati su questa domanda? Se sì, quali sono le implicazioni?

    
posta Justin R. 03.05.2017 - 19:57
fonte

4 risposte

5

Non c'è una risposta diretta a questo. C'è il codice generato, e poi c'è il codice generato. Potremmo parlare di un po 'di codice framework, di inizializzazioni per qualcosa che hai trascinato insieme in un designer, o di una conversione automatica di un'applicazione completa da una lingua / piattaforma a un'altra lingua / piattaforma. In quest'ultimo caso vorrai testare per trovare qualsiasi cambiamento nel comportamento, perché sì, ci sarebbe un comportamento coinvolto.

La generazione del codice ha molte applicazioni. I test possono essere appropriati e necessari o potrebbero essere inutili.

    
risposta data 03.05.2017 - 21:30
fonte
2

No, non dovresti testare il codice generato. E tu davvero non dovresti testare POJO - non ci sono comportamenti da testare.

Ma dovresti probabilmente testare la generazione del codice per assicurarti che faccia le cose giuste, maneggi i casi d'angolo, gestisca i cattivi dati, ecc. Se lo strumento codegen non è tuo e i tuoi input sono semplici, allora forse alcuni controlli a campione o test manuali sono sufficienti.

E poiché probabilmente stai creando POJO per mappare su un'altra interfaccia, dovresti probabilmente fare test di integrazione (eventualmente manuali) per assicurarti che la tua serializzazione o altra motivazione per avere i POJO sia soddisfatta dalle cose che hai creato.

Forse è un po 'di pedanteria, ma se ti concentri solo sull'output dello strumento potresti fare dei bad test che asseriscono solo che l'output è ciò che ti aspetti , non ciò che necessità .

    
risposta data 03.05.2017 - 20:48
fonte
1

Il test di ciò che hai fatto è sempre buono, ma dovresti verificare che il tuo input per il generatore abbia senso, non che il risultato della generazione sia corretto. I test unitari generati possono fare solo il primo, quindi non ha senso. Integrazione o migliori test unitari "socievoli" sono una soluzione molto migliore.

La ragione per usare la generazione del codice o un framework è l'astrazione: si vuole evitare di scrivere codice di tipo standard come schemi di database o codice di serializzazione ed esprimere la propria progettazione dell'applicazione su un livello superiore. (Pensa a linguaggi specifici di dominio, in cui non desideri affatto toccare l'effettivo linguaggio di programmazione, ma rimani solo a livello di dominio.)

Il test non dovrebbe interrompere questa astrazione cercando di "guardare dentro" i componenti. Se la tua astrazione è solida e completa, dovrebbe esserci un modo per esprimere l'aspettativa che hai sullo stesso livello. Se no, la tua astrazione potrebbe essere rotta.

Ad esempio, eseguendo una mappatura del database si desidera astrarre dalla persistenza. Quindi, allegare un database in memoria o un database falso ed eseguire tutti i test delle unità contro di esso è perfettamente corretto. Sebbene questa non sia l'interpretazione più comune dei test unitari, (Martin Fowler li chiama test unitari "socievoli" ) il il vantaggio è che il codice generato o il codice di framework viene eseguito ogni volta che esegui il test.

Ovviamente questo può essere fatto anche a livello di test di integrazione, ma per cose come la persistenza questo richiederebbe troppi test ad un livello ancora più alto.

    
risposta data 03.05.2017 - 23:08
fonte
0

Hai bisogno di testare il POJO?
Probabilmente no.

Devi testare output dal programma Generator?
Assolutamente si!

Che il Programma Generatore produca altro codice per il quale è possibile o meno scegliere di scrivere test è irrilevante. Se qualcuno cambia il Programma Generatore, devi essere sicuro che ciò che esce non rompi nulla.

    
risposta data 04.05.2017 - 12:44
fonte