Come si scrive test per il codice che dipende da concrete implementazioni esterne che non possono essere derise?

17

Background: sto pensando di provare a introdurre il concetto di unit test ai miei collaboratori creando alcuni per un modulo su cui ho lavorato; i requisiti sono cambiati di recente e richiedono alcune più astrazioni / interazioni, quindi sembra un buon modo per sviluppare una serie di test che "dimostreranno" che funziona senza dover attirare manualmente l'applicazione.

Il problema, tuttavia, è che il modulo si basa su fattori esterni non bloccabili, vale a dire PDF e XSL. Fondamentalmente leggo XML dal database e applico una trasformazione XSL su di esso, quindi lo converto in PDF usando una libreria chiamata ABCPDF. Questo PDF viene quindi unito a un altro PDF basato su un modello statico. So che posso testare l'XML e assicurarmi che i valori siano corretti, ma molti dei potenziali bug e problemi sono correlati alla visualizzazione effettiva del documento finito, ad es. le minuzie come la lunghezza delle stringhe di testo, in cui alcune aree HTML sono posizionate in relazione al documento, ecc. È anche possibile testare queste cose (mi rendo conto che questi sono probabilmente test di integrazione o ... il terzo tipo di test il cui nome I dimenticare [non prove di Accettazione, l'altro tipo], e non test unità ) dal momento che non posso, per quanto ne so, deridere un PDF senza averlo creato, quindi averlo letto o creato un HTML string (cioè XML trasformato) e analizzandolo a mano per verificare la presenza di determinate celle di tabella in relazione ad altre celle di tabella.

In una situazione come questa dovrei concentrarmi solo sui test unitari per assicurarmi che le informazioni siano corrette e che posso creare il PDF, o unirle o altro e ricorrere al test manuale per problemi di visualizzazione effettiva?

    
posta Wayne Molina 20.05.2011 - 17:48
fonte

3 risposte

13

Verifica la funzione non l'unità

Utilizzando input xml conosciuti, genera un PDF e manualmente (e meticolosamente) verifica che sia corretto. Quindi salvalo come riferimento.

Test futuri che utilizzano gli stessi input xml possono fare un confronto di file binari con il riferimento.

Se un confronto a livello di file non è soddisfacente, visualizza il PDF alla fine del test e fai screenshot, quindi confronta il test automatico con gli screenshot di riferimento.

    
risposta data 20.05.2011 - 19:42
fonte
5

Normalmente in un caso come questo si astraggono tutto ciò che non è possibile testare dietro un'implementazione che è possibile utilizzare con un'interfaccia. Farò semplicemente qualcosa di sciocco come un PDF builder perché sembra ragionevole.

public class PdfBuilder : IPdfBuilder
{
  public byte[] BuildPdf(...)
  {
    // actual untestable code here
  }
}

public interface IPdfBuilder
{
  byte[] BuildPdf(...);
}

Puoi quindi prendere in giro l'IPdfBuilder nei tuoi test per fare quello che vuoi. Ciò significa spesso che devi iniziare a utilizzare un contenitore IoC ( link e link come luogo di partenza) se non ne stai usando uno ora.

E i test che non sono unit test vengono spesso chiamati test di integrazione. Spesso i test di integrazione complicati non ne valgono la pena, quindi è sufficiente astrarre questa parte e ridurre la quantità di logica aziendale in quella astrazione, in modo da poterla testare in un test unitario.

Fammi sapere se questo non è completamente chiaro.

    
risposta data 20.05.2011 - 18:00
fonte
1

Ho creato qualcosa di molto simile un po 'indietro, e ho appena usato i test visivi di base. I test non devono essere automatizzati, quindi non c'è niente di sbagliato semplicemente cercando un risultato atteso (ovviamente, in una varietà di situazioni che sono predeterminate). Spesso, un'immagine vale più di mille test in cui le immagini sono interessate . Uso estensivamente i test di unità automatizzate, ma penso che alcune persone possano essere un po 'trascurate quando si entra nel test della GUI, o qualsiasi cosa visiva IMHO. Con determinati prodotti, riconosco che questo approccio "abbastanza buono" non sarà sufficiente per YMMV.

Sarei un po 'preoccupato, tuttavia, per le esternazioni imperdibili. Questo può essere un segno di accoppiamento stretto, che è buono da evitare come regola generale, ma non speculerò troppo sul codice in questo senso senza ulteriori dettagli.

    
risposta data 20.05.2011 - 19:58
fonte

Leggi altre domande sui tag