Blog tvlooy

Sylius e-commerce met Behavior Driven Development

Symfony2, Sylius, BDD | May 14, 2013

Dit artikel is geschreven voor Intracto en verscheen voor het eerst op de Intracto blog op Mei 14, 2013.

Open source PHP projecten, waar we bij Intracto mee in aanraking komen, maken vaak gebruik van test-driven development (TDD). Door het schrijven van geautomatiseerde testen, kan je het gedrag van een volledig systeem testen.

De granulariteit van een test kan zo klein zijn als een unit test en zo groot als een gebruikers acceptatie test. In een unit test kan de kleinst mogelijk testbare eenheid, bv. een PHP functie, binnen de applicatie getest worden. De gebruikers acceptatie test daarentegen baseert zich op user stories die tijdens een analyse fase opgesteld worden.

TDD versus BDD

Bij TDD worden de testen eerst geschreven, nog voor de effectieve functionaliteit uitgewerkt is. Daardoor zal de eerste test mislukken en pas lukken als je de functionaliteit effectief hebt voorzien.

Nu is er echter een nieuwe vorm van testen populair in de PHP wereld. Namelijk behavior-driven development (BDD). Deze techniek bouwt verder op TDD, maar vervangt het woord "test" door zaken als "gedrag", "voorbeeld", "scenario", enz.

Hierdoor sluiten de tests zich dichter aan bij de definitie van het probleem domein door dezelfde "ubiquitous language" te gebruiken. BDD combineert de algemene technieken en principes van TDD met ideeën uit domain-driven design (DDD) en object-georiënteerde analyse en ontwerp.

Dit is vrij theoretisch, maar wordt al snel duidelijk aan de hand van een paar voorbeelden.

Sylius e-commerce

Sylius is een modern PHP e-commerce platform voor Symfony2, en werd volledig ontwikkeld aan de hand van BDD. Het project is open-source en wordt commercieel ondersteund door KNP Labs. Sylius maakt gebruik van een aantal bundles waar steeds een bepaald onderdeel van ecommerce in ontwikkeld wordt. Zo is er bijvoorbeeld een assortiment bundle, een payments bundle, een shipping bundle, ... Al deze bundles worden aan elkaar gekoppeld in het Sylius ecommerce platform, dat je kan installeren als een volwaardige product.

Sylius logo

Het platform ontwikkelt zich op dit ogenblik nog zeer snel, maar heeft alle belangrijkste features aan boord om een bruikbaar e-commerce platform te zijn. Zo is er een uitgebreid product en categorie beheer systeem aanwezig, inclusief stock beheer. Er is een shipping engine aanwezig en er werd ondersteuning voor betalingen uitgewerkt, inclusief BTW. Het platform is beschikbaar in meerdere talen, en sinds kort ook in het Nederlands. Het platform is gebouwd op Symfony2 en daardoor makkelijk uitbreidbaar en aanpasbaar door developers. Een voorbeeld van hoe de Sylius backend er uit ziet:

Sylius dashboard

SpecBDD

Binnen BDD kan men testen laten baseren op specificaties of op user stories. De Sylius bundles werden ontwikkeld op basis van SpecBDD met de development tool phpspec. De techniek bestaat er uit om telkens het gedrag van de objecten te beschrijven vooraleer men deze gaat implementeren. Vervolgens wordt er dan net voldoende code geschreven om aan de specificatie te voldoen. De code kan zodoende veilig gerefactored worden tot een clean design om vervolgens weer verder te gaan met de volgende stap. Deze werkwijze wordt in kleine iteratieve stapjes toegepast tot het gewenste resultaat bekomen is. Een phpspec spec file ziet er bijvoorbeeld uit als de ShippingMethod.php uit de SyliusShippingBundle.

Als we de spec file uitvoeren zien we volgende resultaat:

PhpSpec successful run

Als een test zou falen, dan zien we volgende resultaat:

PhpSpec run with errors

Soms zal een bepaalde klasse afhankelijkheden hebben op een andere klasse, die mogelijk nog niet bestaan. Bij het unit testen worden de afhankelijkheden steeds vervangen door zogenaamde test doubles. Phpspec maakt hiervoor gebruik van het Prophecy object mocking framework. Prophecy voorspelt als het ware hoe objecten zich zullen gedragen.

StoryBDD

Een andere manier van testen met BDD baseert zich op verhalen. Binnen het Sylius e-commerce platform zelf worden op deze manier de user stories getest. De tool die hier voor gebruikt wordt is Behat. Behat leest feature bestanden uit, waar scenario's in beschreven staan. De scenario's worden geschreven in de domein specifieke taal (DSL) genaamd Gherkin. Standaard worden scenario's geschreven in het Engels, maar je kan Gherkin ook in je eigen taal laten werken. Een feature file ziet er bijvoorbeeld uit als de countries.feature uit het Sylius platform.

Als we de feature file uitvoeren zien we het volgende resultaat:

Behat successful run

Als een test zou falen, dan zien we volgend resultaat:

Behat run with errors

Je kan Behat eigenlijk gebruiken om verschillende soorten applicaties te testen. Command line applicaties, GUI applicaties en zoals het geval bij Sylius ook web applicaties. Behat maakt gebruik van Mink als browser emulatie en abstractie laag om de web tests uit te voeren. Wanneer je applicaties gebruik maken van JavaScript en AJAX, volstaat Mink echter niet om tests uit te voeren, aangezien deze niet in een echte browser draait en geen JavaScript engine aan boord heeft. Behat kan daarvoor gebruik maken van Selenium2, waar wel JavaScript sessies gebruikt kunnen worden. Selenium2 schakelt hiervoor een echte browser in, die je zelf kan kiezen, om echte stappen uit te voeren.

Besluit

Met behavior-driven development kunnen applicaties op een moderne manier getest worden. Het Sylius e-commerce platform is hiervan een mooie testcase. Het goede ontwerp en de kwaliteit van de code tonen aan dat dat phpspec en Behat een grote meerwaarde hebben betekend in de ontwikkeling van het product. Sylius is een e-commerce platform dat zeker potentieel heeft om uit te groeien tot één van de grote PHP e-commerce platformen.