iOS: Continuous integration

Door Bas van Kuijck, mobile developer - @basvankuijck
8 januari 2014 - 2722 x bekeken - Categorieën: Tech

Continuous integration (CI) is een term die vaak wordt gebruikt voor software ontwikkeling. CI is eigenlijk niets meer, of minder, dan een aanpak die ervoor zorgt dat tijdens de gehele ontwikkeling van een product de code continu wordt gecontroleerd.

Uiteraard is het nog belangrijker dat een applicatie doet wat van hem wordt verwacht na de productiefase, als deze bijvoorbeeld in de App Store staat. Hiervoor zijn ook de tools die Xcode en OSX server aanbiedt te gebruiken.
Deze tools dragen bij om je (als developer) te helpen bij het controleren van gemaakte stukken code en te waarschuwen mocht er iets kapot gaan. Dit is uiteraard beter dan handmatig alles te controleren, zodra je een wijziging maakt.

Unit Testing

Elk platform en ontwikkeltaal heeft zo zijn eigen tools om CI goed in te zetten, wat ze -over het algemeen- allemaal gemeen hebben, is dat ze gebruik maken van Unit tests. 

Unittesten is een methode om softwaremodulen of stukjes broncode (units) afzonderlijk te testen. Bij unittesten zal voor iedere unit een of meerdere tests ontwikkeld worden. Hierbij worden dan verschillende testcases doorlopen. In het ideale geval zijn alle testcases onafhankelijk van andere tests © wikipedia

In deze blogpost richt ik mezelf op het inzetten van Unit Tests en CI tijdens (en na) de ontwikkeling van iOS applicaties d.m.v. Xcode.

Toen iOS7 beschikbaar werd gesteld voor iOS ontwikkelaars kwam er ook een nieuwe Xcode versie uit, Xcode 5. Waarbij naast het algemene uiterlijk en de gebruikelijke bug-fixes in zaten, zaten er ook een hoop nieuwe features in verpakt:
https://developer.apple.com/technologies/tools/whats-new.html.
Met natuurlijk Bots for Continuous Integration:

Xcode 5 works closely with OS X Server for OS X Mavericks to easily create ‘bots’ that continuously build your app, execute your complete test suite, and run the Xcode static analyzer to find potential bugs. You can create a new bot in only a few clicks, and immediately start it running on any Mac in your network. While the remote Mac is doing all the integration work, Xcode on your local machine displays the build and test reports.

A nightly bot is great for generating a regular release for your QA team. Bots can also be configured to execute on every check-in, alerting committers immediately when something is broken. Bots can even test your iOS app on connected iPhones and iPads, surfacing any device-specific bugs.

Inzetten van CI

Voor deze blogpost gebruik ik een intern project genaamd "Huslr" (waarover later meer).
De Huslr iOS app bevat een 16-tal tests  die kijken of (voornamelijk) de communicatie met de node.js server goed werkt en of de app deze gegevens goed gebruikt.
Deze tests zijn gebundeld in 2 suites. 1 suite die alles test en een andere suite die alleen de verbinding controleert van de app met de node.js server.

De tests zijn geschreven met het gebruik van het XCTest framework
Een klein voorbeeld van hoe een dergelijke test er uit ziet:

 

Deze test controleert of de verbinding succesvol is opgezet met de node.js server met een bepaalde timeout (10 seconden). Unit tests zijn (over het algemeen) niet echt geschikt om asynchrone processen uit te voeren, vandaar ook een slimmigheidje d.m.v. de waitForComplete methode. Op deze  manier kun je je hele class volhangen met tests en deze worden een voor een afgewerkt en de resultaten worden opgeslagen met eventuele logregels. Nu is het zo dat al deze tests handmatig gestart moeten worden, wat uiteraard nog steeds een hoop minder werk is dan zelf al deze test scenario's langs te gaan. Gelukkig is met de komst van Xcode5 de mogelijkheid om zogenaamde Xcode Bots te schrijven, die deze tests voor je doen. Enige kanttekning is wel dat je OSX Server App (€ 17,99 of gratis voor iOS of OSX developers) nodig hebt.

Xcode Bots

Bij het aanmaken van een Xcode Bot kun je aangeven welke test-suite deze bot moet doorlopen. Aangezien we 2 suites hebben, hebben we ook 2 bots gemaakt. Zo hebben we de bot die enkel de verbinding controleert op een kort interval draaien en de bot die alles test op een wat hoger interval. 

Elke bot kan manueel gestart worden; periodiek; of bij een (SVN, GIT of Mercurial) commit. Vooral de commit 'schedule' is erg handig. Op die manier kun je zonder op een knop te drukken een melding krijgen als jouw commit ervoor heeft gezorgt dat de applicatie niet meer werkt. Maar natuurlijk periodieke controles zijn handig, zodat elke nacht of elk uur gecontroleert kan worden of de app (code) nog wel doet wat hij hoort te doen. Zou kun je pro-actief reageren op eventuele problemen of servers die niet meer correct reageren.

Resultaten

Elk test resultaat wordt netjes opgeslagen in het systeem, zodat deze later bekeken kan worden en gedetailleerde informatie over een eventueel mislukte test:

Hier is in 1 oogopslag te zien dat de laatste test succesvol is geweest.
Alleen test 186 en 196 zijn niet helemaal gelukt en test 197 t/m 202 zijn volledig mislukt.
Daarnaast hebben we bij E-sites schermen aan de muur hangen waar allerlei project gerelateerde informatie op voorbij komt, zo heeft het scherm bij het mobiele team een pagina waarin CI informatie voorbij komt:

 

Conclusie

Unit testing en Continuous integration bestaan uiteraard al een tijdje in het 'software ontwikkeling landschap'. En vooral Unit Testing wordt al een tijdje goed ondersteund door Xcode om iOS developers te helpen betere applicaties te maken. Alleen het continu monitoren in combinatie met testen van code was iets waar menig iOS ontwikkelteam moeite mee had om dit goed in te zetten. Eigen omgevingen, koppelingen met jenkins, etc hebben de revue gepasseerd als halve oplossingen.
Gelukkig heeft Apple goed geluisterd naar de iOS (en OSX) developers en hebben ze een makkelijke manier gevonden om Xcode te koppelen aan OSX server. Uiteraard zijn de Xcode Bots nieuw, dus ze ontbreken nog aan verschillende functies. Vooral de rapportage (logs) van foutieve tests is nog redelijk onduidelijk. Je dient de complete log door te lezen om erachter te komen waarom een bepaalde test dan is mislukt. Alleen ik verwacht dat in toekomstige versies, dit allemaal netjes wordt rechtgetrokken.

Vanaf het verschijnen van de nieuwe Xcode hebben we direct onze OSX server ingericht, zodat deze op de juiste manier CI inzet, zo kunnen we altijd zien of bepaalde applicaties kapot gaan door verschillende aanpassingen. Vooral bij applicaties waarvan de update-cycle relatief laag is, komt dit goed van pas. Zodat we niet extra tijd kwijt zijn om de applicatie weer werkend te krijgen, voordat we echt aan de update kunnen gaan werken.
Wij zijn dus erg tevreden over de nieuwe features binnen Xcode. 

 

 

 

Wij zoeken collega's!

 

Wil jij deel uitmaken van een bureau met een passie voor technologie? Kijk dan snel naar onze openstaande vacatures!

 

Zepto Builder: van idee tot uitwerking

Door E-sites

Zo nu en dan komt er een idee voorbij waar je als web developer iets mee moet doen. Degenen die zich aangesproken voelen weten ongetwijfeld waar ik… - Lees meer

Lees verder