Insights, technology, people and more

Altijd up-to-date met onze laatste artikelen.

@
Applicatiemonitoring door unit testing

Applicatiemonitoring door unit testing

22 February 2011 door in Development DevOps

Binnen Cyso verzorgen wij veel hostingoplossingen voor webapplicaties. Dit varieert van eenvoudige websites tot complete multi-server applicatieplatformen. Hoe groot applicaties ook zijn, zij zullen altijd één ding gemeen hebben: u wilt te allen tijde dat deze goed blijven werken. Hier hebben wij uiteraard oplossingen voor. Zo leveren wij voor een groot deel van onze klanten 24/7 statusmonitoring, waarbij wij permanent stand-by staan om eventuele problemen direct voor u op te lossen. Echter garandeert de beschikbaarheid van de applicatie niet per definitie dat deze ook daadwerkelijk werkt zoals u dit verwacht. Hiervoor moet de applicatie zelf ook goed getest worden. In dit blog artikel zal ik dieper ingaan op welke manieren hiervoor beschikbaar zijn.

Weet u echt wel wat uw code doet?

Tijdens de ontwikkeling van projecten, worden de resultaten hiervan vaak bekeken vanuit het oogpunt van de opdrachtgever. Als de eindgebruikers de goede gegevens invoeren, is het resultaat dan datgene wat er verwacht wordt? Deze methode brengt echter vaak met zich mee, dat aspecten als beveiliging op de achtergrond belanden, en minder goed getest worden. Dit verergert alleen maar naarmate de tijdsdruk binnen een project hoger ligt.

Zowel applicatiebeheerders als ontwikkelaars komen vaak in aanraking met code die zij zelf niet ontwikkeld hebben. Denk hierbij bijvoorbeeld aan het gebruik van open-source projecten of code van derde partijen. Bovendien wordt nogal eens vergeten hoe de opzet van de eigen code precies in elkaar stak. En juist de combinatie van uw eigen code en die van anderen is cruciaal voor het eindresultaat. Weet u zeker dat het geheel werkt zoals verwacht? Is dit enkele updaterondes later ook nog het geval?

Ken uw code!

Tegenwoordig worden veel bedrijfsprocessen geautomatiseerd. Bij testprocessen is dit ook mogelijk, mits u de correcte technieken gebruikt. Eén van deze technieken is ‘unit testing’. Unit testing is een testmethode waarin op zichzelf staande stukken code getest worden op hun correcte werking.

Unit tests hebben een beperkte scope en houden daarom geen rekening met het uiteindelijke eindresultaat. Bij automatisering ervan worden de verschillende stappen naar het eindresultaat echter vastgelegd. U weet dus wanneer dat deze correct afgelegd worden, u er ook vanuit kunt gaan dat het eindresultaat correct zal zijn. Dit kunt u al terugvinden in iets simpels als een rekensom.

Unit test voor optellen:

  • Bij invoer van 1 en 5 moet er 6 uitkomen
  • Bij invoer van 4 en 3 moet er geen 5 uitkomen
  • Etc..

Unit test voor vermenigvuldigen:

  • Bij invoer van 1 en 3 moet er 3 uitkomen
  • Bij invoer van 6 en 5 moet er 30 uitkomen
  • Etc..

In dit voorbeeld ziet u dat de testcases voor optellen en vermenigvuldigen beide gelukt zijn. U kunt dus aannemen dat wanneer deze gecombineerd worden, bijvoorbeeld als (1 + 5) x 5 = 30, er het gewenste eindresultaat uitkomt. Zolang beide stappen werken zoals in de test omschreven wordt, is het eindresultaat ook correct.

Binnen unit tests kunnen er meerdere condities getest worden. U kunt in deze condities opgeven wat het resultaat moet zijn, maar ook wat het juist niet moet zijn. Meer condities leiden tot een betrouwbare test, maar uiteindelijk wilt u natuurlijk zoveel mogelijk tijd besteden aan het bouwen van uw applicatie en niet alleen het definiëren van tests. Hier moet u dus een goede balans in vinden.


Lees ook: Microservices: van software design naar infrastructuur architectuur

Waarom Unit testing?

Unit testing houdt dus geen rekening met het eindresultaat, maar test deze indirect wel. Dit komt eigenlijk overeen met wat u in uw huidige methode ook test. Waarom zou u tijd steken in een nieuwe testmethode, terwijl dit hetzelfde resultaat geeft als uw eerdere testmethode?

Binnen unit testing zijn de tests gericht op de werking van de code en niet wat dit betekent voor het eindresultaat. In de eerste instantie zal dit op hetzelfde neerkomen, maar het echte voordeel ontstaat zodra de bestaande code aangepast of uitgebreid wordt. Zodra u de stappen naar het eindresultaat aanpast, zal het eindresultaat zelf ook aangepast worden. Als hierin ineens fouten optreden, kan met unit tests snel opgespoord worden waar dit veroorzaakt wordt. Deze test immers de stappen op hun correcte werking, niet het eindresultaat.

Hiernaast gebeurt het vaak dat nieuwe uitbreidingen deels gebruik maken van functionaliteit uit een eerdere versie. Voordat deze uitbreidingen gemaakt worden, is het goed om te weten dat deze afhankelijkheden ook correct werken. Als u alleen naar het eindresultaat kijkt, kan het ook gebeuren dat 2 fouten in de applicatie elkaar opheffen, waardoor de applicatie goed lijkt te werken. Doordat unit tests dieper in uw code kijken, zal dit minder snel gebeuren.

Samenhangend met het feit dat unit tests meer in de code duiken, hebben zij de eigenschap dat zij niet kunnen beredeneren. Wanneer u zelf aan het testen bent, en iets lijkt ongeveer te werken, kan het gebeuren dat u aan uzelf gaat twijfelen. Ben ik misschien zelf iets vergeten, waardoor het eindresultaat niet precies klopt? Een unit test zal hier nooit over nadenken, en is zo precies als computers kunnen zijn. Een fout is een fout, en een unit test zal dit ook aangeven.

Last but not least, frameworks die unit testing implementeren zijn zelf vaak losse applicaties. Unit tests kunnen hierdoor dus automatisch uitgevoerd worden.


Conclusies

Unit testing kan leiden tot een stabielere applicatie. Het eindresultaat is veel minder belangrijk dan de weg die wordt afgelegd om tot dit eindresultaat te komen. Via deze weg worden er meerdere aspecten van uw applicatie getest, wat meer zekerheid geeft zodra u code gaat uitbreiden of hergebruiken. Een unit test kan niet redeneren. Ook wanneer iets op het eerste gezicht lijkt te werken, zal een goede unit test hier direct doorheen prikken.

Unit testing is primair bedoeld voor het testen van uw applicaties tijdens het ontwikkelingstraject en bij het implementeren van nieuwe features en updates. Maar u kunt het binnen een bestaande productieomgeving ook uitstekend gebruiken voor monitoring doeleinden. Door Unit tests te definiëren die het correct functioneren van verschillende onderdelen van uw applicatie controleren, wordt het mogelijk om problemen binnen het platform zeer precies te detecteren. Het monitoring systeem van Cyso is in staat om via verschillende methodes het resultaat van uw tests uit te lezen en waarschuwingen te geven als er iets mis is. Wilt u hier met ons ideeën over uitwisselen? Neem gerust contact op.

Aan de slag

In dit artikel is slechts besproken wat unit testing inhoudt. Over het daadwerkelijke gebruik ervan zijn ook op internet veel artikelen te vinden. Wellicht dat één van de volgende artikelen u op weg kan helpen.

Unit testing tutorial: gaat dieper in op het gebruik van unit testing.

PHPUnit: Framework voor unit testing binnen PHP.

NUnit: Unit testing binnen het .NET framework.

JUnit: Unit testing binnen Java.

Ik zou hier een opsomming kunnen geven van alle verschillende unit testing frameworks die beschikbaar zijn voor de verschillende talen. De namen van deze projecten komen net als bovenstaande voorbeelden echter sterk overeen. Enkele andere voorbeelden zijn CUnit voor C, JSUnit voor Javascript en ASPUnit voor ASP applicaties. Deze zijn eenvoudig terug te vinden in verschillende beschikbare zoekmachines.


Altijd up-to-date met onze laatste artikelen.

@

Kwaliteit. Betrouwbaar. Betrokken.
  • 24/7 service support
  • Nederlandse datacenters
  • ISO 27001 gecertificeerd
vmware enterprise service provider