Voor software engineers is het de normaalste zaak van de wereld: testen. Unit tests, de test piramide, code coverage, continuous integration met geautomatiseerd testen, een software engineer denkt er niet eens over na, het zit in zijn systeem. Maar in de data wereld, is het niet zo normaal. Google maar eens op “testing SSIS” en je krijgt ruim 3 miljoen resultaten. Google je op “testing C#”, en je krijgt ruim 272 miljoen resultaten…
Er zijn heel wat redenen waarom testen niet zo normaal is in de wereld van data & analytics. Een niet te verwaarlozen reden is dat lang niet iedereen die zijn brood verdient met het ontwikkelen van data & analytics oplossingen een achtergrond in software engineering heeft. Veel data professionals realiseren zich hierdoor wel dat testen belangrijk is, maar ze weten niet goed hoe ze dat moeten doen. De leveranciers van producten die de data professional gebruikt, helpen hier ook niet echt bij. Tools als Power BI en Tableau, bieden geen ondersteuning om te testen en zelfs een tool als SQL Server Data Tools, biedt weliswaar ondersteuning voor het schrijven van unit tests, maar vergeleken met de mogelijkheden voor het testen van C# code, is die ondersteuning mager. Maar het testen van data is ook lastig. Data is vaak complex, is vaak afhankelijk van andere data en verandert continu (van structuur, maar vooral van inhoud). Daarom is testen van data & analytics oplossingen vaak een kwestie van manuele controles en slechts zelden gebeurt dat op een gestructureerde, herhaalbare en objectieve manier.
Toch zijn er wel wat hulpmiddelen beschikbaar die je kunnen helpen bij het ontwikkelen van testen voor data & analytics oplossingen. Drie daarvan, wil ik in dit artikel kort noemen:
- ssisUnit
- tSQLt
- LegiTest
Deze drie hulpmiddelen zijn allemaal gericht op de Microsoft SQL Server ontwikkelaar die met SQL Server en de BI tools die daarbij horen oplossingen implementeren.
ssisUnit
ssisUnit werd al in 2008 door John Welch via CodePlex gedeeld. Zoals de naam al zegt, is het een framework om unit testen voor SSIS packages te maken en uit te voeren. Het is gratis en met wat trucjes in te bedden in een Azure DevOps build waarmee de testresultaten in het standaard test dashboard kunnen worden getoond. Er is een GUI, onderwater wordt XML gegenereerd. Het framework werd al enige tijd niet meer doorontwikkeld, waardoor het niet meer werkte in nieuwere SSIS versies. Vorig jaar heeft de Poolse SQL Server ontwikkelaar Bartosz Ratajczyk het framework omarmd en ervoor gezorgd dat het weer werkt in SQL Server 2017. Mijn ervaringen met ssisUnit, zijn niet heel erg goed. Het werkt, het is gratis, maar er zitten ook veel bugs in. Op dit moment zou ik niet adviseren er op in te zetten. Al is het, als je geen geld uit wilt geven, misschien wel de enige optie die je hebt om SSIS packages te unit testen.
tSQLt
Dat is heel anders bij tSQLt. Een uitgebreid framework wat door Redgate, een gerenommeerd bedrijf wat tools voor data professionals levert, wordt ondersteund. tSQLt is gebaseerd op de AAA aanpak: Assemble, Act, Assert. Deze aanpak is afkomstig uit Test Driven Development (TDD). Eerst wordt een uitgangssituatie geassembleerd (assemble), vanuit die situatie wordt iets gedaan wat je wilt onderwerpen aan een test (act), vervolgens wordt getoetst of de eindsituatie overeenkomt met de verwachte eindsituatie (assert). Het tSQLt framework biedt ondersteuning voor al deze drie stappen. Als je tSQLt configureert voor een database, krijg je allerlei handige stored procedures en views tot je beschikking, zoals een FakeTable procedure waarmee je, gebaseerd op een bestaande tabel, een uitgangssituatie creëert waarbij de tabel, wat voor data er ook in zit, bekende testdata bevat. tSQLt doet dat door alle stappen altijd binnen een transactie uit te voeren. Hier zit ook het voornaamste verschil met de testmogelijkheden voor database projecten binnen SQL Server Data Tools zelf.
tSQLt werkt perfect voor … T-SQL… Wanneer je ETL logica in stored procedures implementeert, is tSQLt een zeer geschikt unit test framework. Als je in plaats daarvan SQL Server Integration Services (SSIS) gebruikt, blijkt tSQLt minder geschikt. Ook al kun je packages aanroepen met behulp van een stored procedure. Dat komt deels doordat SSIS packages eigenlijk geen units zijn, maar al middels een integratietest getest moeten worden. Je hebt immers bijna altijd met meerdere databases te maken. Daarnaast zet SSIS zelf connecties op naar de verschillende databases, waardoor je buiten de transactie die tSQLt opzet om gaat. Het duurt dan ook even voordat je door hebt dat de uitgangssituatie die je met tSQLt opzet in de Assemble stap niet zichtbaar is binnen een SSIS package wat je als Act stap uitvoert… Kortom, de Assemble stap, zul je op een andere manier moeten doen. Door bijvoorbeeld op een testomgeving altijd bekende datasets voor de te testen systemen beschikbaar te hebben én te onderhouden.
Hoewel tSQLt in eerste instantie toepasbaar lijkt om SSIS packages te testen, merk je bij de toepassing hiervoor dat je steeds door ‘hoepeltjes’ aan het springen bent. Het is er simpelweg niet voor bedoeld. Daarom is mijn advies tSQLt vooral te gebruiken om T-SQL code te testen, maar niet voor SSIS packages.
LegiTest
LegiTest is een commercieel product, oorspronkelijk gemaakt door Pragmatic Works, maar met de overname van dat bedrijf door SentryOne in april 2018, sindsdien onderdeel van de SentryOne productportfolio. Je zou LegiTest kunnen zien als een commerciële doorontwikkeling van ssisUnit: John Welch, de ontwikkelaar van ssisUnit, is ook ontwikkelaar bij Pragmatic Works. Het interessante aan LegiTest is dat het breed toepasbaar is. Database objecten, SSIS packages, SSRS rapporten en SSAS cubes kunnen allemaal worden getest met dit tool. Wat daarnaast opvalt is de gebruikersvriendelijkheid waarmee je met dit tool tests implementeert. Wizard gestuurd, maar met veel configuratiemogelijkheden. Data professionals met minder kennis van en ervaring met tetsen, ervaren dit als veel eenvoudiger dan de voor tSQLt benodigde inspanning. Dat alles komt met een prijs, maar als je dat veel werk bespaard en een hogere kwaliteit data levert, is dit een rekensom die je in ieder geval moet maken.
Conclusie
Als je data oplossingen moet testen, en dat zou je altijd moeten doen, is LegiTest van SentryOne een interessante optie om te bekijken. Er is een gratis evaluatieversie van het pakket verkrijgbaar. Beperkt het te testen werk zich tot T-SQL code, dan is het gratis tSQLt framework heel goed bruikbaar. Wil je gratis SSIS packages testen, kun je naar ssisUnit kijken, maar wees voorbereid op een minder goede ervaring.
Jihn Welch heeft een uitstekend white paper over het testen van data oplossingen geschreven: http://pragmaticworks.com/Portals/1/Whitepapers/Data-Testing-eBook.pdf.
One comment
Mogelijk interessant kan ook nog NBi (http://www.nbi.io) zijn. Zelf geen ervaring mee maar belooft testen mogelijk te maken voor SQL Server Database, SSIS, SSAS en SSRS. Daarnaast wordt er nog steeds actief ontwikkelt aan de commits op GitHub te zien. Mocht iemand die dit leest toevallig wel ervaring hebben dan ben ik heel erg benieuwd!
Yorick