Datorhårdvara

Enhetstestning en abstrakt klass - bästa praxis

Frågan om "hur man enhet-test en abstrakt klass?" kommer upp ganska ofta. Du förlänga det, och sedan ersätta de abstrakta metoderna med stubbar och testa sedan endast den konkreta delen av metoden? Eller du utveckla en abstrakt enhetstest?

Vi tror att detta är nog fel fråga att ställa när det kommer till abstrakta klasser. Vi anser i själva verket finns det ett bra sätt att undvika problemet helt och hållet. När du överväga en abstrakt bas klass det är verkligen två standardmetoder att närma sig detta:

Först är där du måste specialisera sig ett abstrakt objekt. Här hittar du nästan säkert att klienterna behöver använda den abstrakta klassen som du skapar genom en bas gränssnitt.

I andra hand bygger du den abstrakta klassen för att försöka skära ner på dubbelarbete. I så fall ser du snabbt att klienterna faktiskt har åtkomst till konkreta versioner av klassen när de komma åt dem via ett gränssnitt.

En förändring i utvecklingsstrategi för testning av programvara

Om du tar den första metoden ovan kommer du redan har ett gränssnitt som är fullt definierats. Det är genom de virtuella metoderna inuti klasserna genomförs av din nyligen härledda klasser. Varför inte göra som har gränssnitt en riktig gränssnitt? Du byta den abstrakta klassen för en konkret. Sedan ta en ögonblicksbild av det nya gränssnittet från konstruktören. Alla dina härledda klasser kan sedan använda riktiga gränssnittet.

Detta gör testning den abstrakta klassen enkel. Du bara använda en mock-up av gränssnittet och arbeta igenom någon ytterligare implementationer med vad som nu är en verklig gränssnitt.

För den andra metoden, är detta redan fungerar som en hjälpklass. Du kan undersöka funktionen inom den abstrakta klassen och prova och arbeta den in i de objekt du arbetar med. Om du hittar det finns fortfarande material inom dessa klasser när det är klart - gör det en hjälpklass i konstruktören (Glöm inte att ta bort basklassen) och det är en konkret genomförande. Detta är mycket lättare att testa en abstrakt.

Det är möjligt att kombinera metoder 1 och 2, och vi har upptäckt att det bästa sättet att synsätt som är att använda metoden för den andra metoden och sedan helt enkelt ta arv trädet och omvandla den till ett strategi-mönster.

Det bästa sättet att enhet test abstrakta klasser är helt enkelt att minska klassen till något lättare att hantera.