Designa för unittestning

Hittade en bra artikelTheServerSide.COM som beskriver hur man kan/bör designa sin kod med tanke på att koden ska bli testbar och därmed mindre buggig. Se nedan för en kort sammanfattning av artikeln.

  • Programmera mot interface istället för implementationer
    Detta ger en lösare koppling i koden och ger möjlighet att byta ut implementationer i runtime och man kan ex mocka klasser vid testning.
  • Använd ”object composition” istället för arv
    Genom att ”object composition” dvs att anropa funktionalitet i ett annat objekt istället för att ärva funktionalitet blir det enklare att unittesta din applikation och du uppnår en lösare koppling mellan dina klasser. Använd endast arv om din klass faktiskt är en subtyp till en annan klass.
  • Undvik onödiga singletons
    Singletons är ytterst svåra att hantera i tester eftersom state i en singleton typiskt hålls mellan de olika testerna. Genom att undvika singletons ökas applikationens flexibilitet och det blir enklare att unittesta.
  • Om möjligt, använd ett ramverk för DI/IoC
    Genom att använda ett ramverk för Dependency Injection ex Spring så motverkar man användet av singletons, du får ett enhetligt/enkelt sätt att hantera beroenden, det blir enkelt att byta ut implementationer i runtime och du får ett inbyggt stöd för unittestning.
  • Dokumentera dina metoder
    Dokumentera vad din metod faktiskt gör, hur den hanterar parametrar, returvärden, gränsvärden, undantag etc.
  • Se till att dokumentation och kod gör samma sak
    Verifiera att koden och JavaDoc:en säger samma sak, annars måste den ena ändras.
  • Testa gränsvärden och antaganden
    Testa alla scenarios dvs. success, fail, boundary conditions, exceptions, assumptions