Test automatico di programmi con output grafico

5

Sono un docente per un modulo post-laurea in cui mi aspetto che i miei studenti scrivano codice Python che replica esempi dal libro di testo. Il progetto è attivo da un paio d'anni e quest'anno voglio introdurre più test automatizzati. Il problema è scrivere test per le funzioni che producono principalmente una figura matplotlib. Nota che stiamo solo cercando di replicare le cifre approssimativamente, quindi il confronto binario con un'immagine di destinazione non sarà molto utile.

La domanda breve è quindi: quali strategie posso usare per testare programmi il cui output grafico primario non può essere confrontato con una rigorosa immagine di riferimento?

Alcuni dei problemi che ho con il code base esistente che impedisce il test automatizzato in questo caso:

  • La produzione del grafico interrompe l'esecuzione in molti casi
  • Non è pratico generare una copia della figura nel libro di testo che includa annotazioni e così via, quindi è improbabile che il confronto di immagini algoritmiche sia la risposta.

Per chiarire i miei obiettivi:

  1. Mi piacerebbe poter eseguire tutto il codice nella codebase per verificare che sia effettivamente in esecuzione, anche se questo significa buttare via l'output. Questo potrebbe catturare regressioni in cui una funzione viene modificata
  2. Invece di investire profondamente nell'abbinamento sfocato dell'output grafico con il target, credo che il controllo visivo tra un'immagine di riferimento e l'immagine generata sia probabilmente il più semplice, ma questo dovrebbe essere differito per accadere una volta alla fine della corsa piuttosto che durante la corsa
  3. Poiché si tratta di un progetto collaborativo, non devo supporre che gli studenti saranno contraddittori. Gli errori saranno la buona fede piuttosto che i perversi.
posta chthonicdaemon 15.01.2014 - 08:50
fonte

2 risposte

3

Questo dipende dal contesto di tali test.

In fase di sviluppo, il test è di solito una barriera contro la negligenza, il marciume del codice o incomprensioni. Il software diventa molto complesso, ma normalmente almeno "combatte equamente": non tenta deliberatamente di sovvertire le tue intenzioni con risultati che sono inutili, ma passa il test su un aspetto tecnico.

Quando ti occupi di programmazione degli studenti per i gradi, questa è una possibilità reale. Pertanto, il bilanciamento delle pressioni si sposta in modo impercettibile contro i test automatizzati, in particolare quando il requisito non è una proprietà matematica hard-and-fast, ma qualcosa di vago come "replicare questa cifra approssimativamente". Ovviamente ci sono varie approssimazioni del criterio di obiettivo che puoi usare e che possono essere utili (conta il numero di pixel in bianco e nero, rileva i bordi e confronta la loro struttura, esegui una trasformata di Fourier completa e giudica la somiglianza nello spazio di frequenza piuttosto che sui pixel stessi ...)

Tuttavia, potrebbe essere che osservare i risultati con gli occhi umani e classificarli manualmente sia effettivamente più efficiente. Pensa a come sfruttare l'incredibile accelerazione hardware che il cervello umano fornisce per il riconoscimento dei pattern.

    
risposta data 15.01.2014 - 09:17
fonte
0

Se il risultato non può corrispondere perfettamente all'originale, dovrai eseguire un po 'di corrispondenza fuzzy.

Una misura molto semplice sarebbe quella di utilizzare l'immagine originale come standard d'oro. Sottrai il tuo risultato (usando la differenza assoluta come risultato) e forse la media sull'intera immagine. Questo dovrebbe darti un'idea di quanto almeno la forma delle cose si adatti all'originale.

Un tweak su questo metodo sarebbe quello di ridimensionare entrambe le immagini fino a quando le loro dimensioni coincidono. Un altro sarebbe ridimensionare entrambe le dimensioni più piccole e confrontarle in modo molto più rigoroso, per adattarle alla struttura complessiva dell'originale.

Vorrei anche seguire l'idea di KilianFoth di utilizzare altri spazi di fase, ma stai molto attento a confrontare effettivamente mele e arance in questi casi, ignorando ad esempio i dati di "bassa frequenza" (rumore).

Come consiglio generale, avere per avere qualcosa i risultati possono essere confrontati con se si vuole essere in grado di testarlo. Qualunque cosa sia - una descrizione del testo, una funzione o un'immagine - devi usarla come obiettivo per il test.

    
risposta data 15.01.2014 - 09:14
fonte

Leggi altre domande sui tag