Maskinvare

En abstrakt klasse - beste praksis for enhetstesting

Spørsmålet om "hvordan enhet-test en abstrakt klasse?" kommer opp ganske ofte. Du utvide den, og deretter erstatte de abstrakte metodene med stubber og deretter teste bare den konkrete delen av metoden? Eller du utvikler en abstrakt Enhetstest?

Vi tror at dette er sannsynligvis feil spørsmål å spørre når det gjelder abstrakte klasser. Faktisk tror vi det er en god måte for å unngå problemet helt. Når du vurdere et abstrakt base klassen der er virkelig to standard metoder for nærmer dette:

Først er der du trenger å spesialisere seg et abstrakt objekt. I dette tilfellet vil du nesten helt sikkert finne at klientene må bruke abstrakte klassen du oppretter gjennom en base grensesnittet.

I den andre forekomsten bygge du den abstrakte klassen for å prøve å kutte ned på duplisering. I så fall vil du raskt se at klientene er faktisk tilgang til konkrete versjoner av klassen når de får tilgang til dem via et grensesnitt.

En endring i utviklingstilnærming av programvaretesting

Hvis du tar den første metoden ovenfor vil du allerede har et grensesnitt som er fullstendig definert. Det er gjennom prosessen med de virtuelle metodene i klassene som blir gjennomført av din nylig avledede klasser. Hvorfor ikke gjøre det grensesnitt et ekte grensesnitt? Du bytte abstrakte klassen for en konkret. Så ta et øyeblikksbilde av det nye grensesnittet fra konstruktøren. Alle avledede klasser kan deretter bruke virkelige grensesnittet.

Dette gjør testing abstrakte klassen enkel. Du bare bruker en uekte av grensesnittet og arbeide gjennom noen ekstra implementasjoner bruker det som nå er et ekte grensesnitt.

For den andre metoden fungerer dette allerede som en helper class. Du kan undersøke funksjonaliteten i den abstrakte klassen og prøve og arbeid det inn objektene du arbeider med. Hvis du finner det er fortsatt materiale i disse klassene når det er ferdig - gjør det en helper class i konstruktøren (ikke glem å ta bort grunnklassen) og det er en konkret implementering. Dette er mye lettere å teste et abstrakt.

Det er mulig å kombinere metoder 1 og 2, og vi har funnet ut at den beste måten å tilnærming er å bruke tilnærming for den andre metoden og bare ta arv treet og konvertere den til et strategimønster.

Den beste måten å enhet test abstrakte klasser er bare å redusere klassen til noe lettere å håndtere.