Maatschap Fortigi

View Original

Automated Testing Framework Microsoft Identity Manager 2016

Introductie

De afgelopen maanden ben ik druk bezig geweest met het opzetten van ons "Automated  Powershell Test Framework voor Microsoft Identity Manager 2016. Je hoeft niet lang op het internet te zoeken om erachter te komen dat er geen "algemeen test framework" is ontwikkeld voor MIM. Soms kom je wellicht wat kleine voorbeelden tegen maar meestal blijft het bij collega's die ook op zoek zijn naar een al ontwikkelde oplossing.
Dus wat doe je dan? Juist, zelf lekker bouwen :)

Uitdaging

Tijdens een mooie en uitdagende opdracht bij één van onze klanten kreeg ik te maken met de volgende uitdaging: De klant had al een werkende MIM omgeving draaien met vele complexe workflows. Diverse updates aan de omgeving waren nodig en tevens moest er voor worden gezorgd dat bestaande functionaliteit niet omviel. 

De Use Cases die getest moesten worden bestonden al. Fantastisch! Echter bleek dit een behoorlijk document te zijn en waarbij deze use cases telkens handmatig werden getest. Tijdsbesteding? 3 dagen..!

Handmatig....dat moet anno 2018 toch slimmer kunnen. De uitdaging was: Hoe zouden de bestaande Use Cases geautomatiseerd getest kunnen worden m.b.v. Powershell en zonder het gebruik van 3-party modules en frameworks. 

Prerequisites

De meeste Powershell modules die je nodig hebt om scenario's heb je waarschijnlijk al een keer geïmporteerd. (Denk aan de standaard AD Module bijvoorbeeld). Om het framework te kunnen gebruiken is het wel belangrijk om het volgende geïmporteerd en geïnstalleerd te hebben:

- De FIMAutomation Module
- De Microsoft.Exchange.Management.PowerShell.SnapIn
- Volledige MIM Installatie (MIMSync, MIMService, Exchange, etc.)

Scenario's om te testen

De use cases worden elke nacht gedraaid d.m.v. een Scheduled Task in de Task Scheduler. Door het importeren en syncen van fake identities worden de diverse MPR's getriggered in de MIM Portal die ervoor zorgen dat diverse workflows worden uitgevoerd.

In het Framework worden de volgende scenario's / use cases getest:

- User uit dienst
- User in dienst
- User uit dienst en weer in dienst
- Aanmaken van een manager
- User verandert van afdeling en/of functie
- Maak de user een invalid user
- Maak de invalid user weer valid
- Verander de UserName
- Opschonen resultaten tests

Omdat de Use Cases al bestonden en waren ontwikkeld op basis van de bestaande omgeving,  zorgde dit ervoor dat de verwachte resultaten dus al bekend waren. Bij alles heb ik logging ingebouwd. Zodra ik ook maar 1 error terug krijg wordt er automatisch een e-mail gegenereerd.

Opbouw Framework

Het framework is opgezet volgens de Powershell Best Practices en bestaat uit het volgende:

1 module: AutomatedTesting.psm1. Deze module bestaat uit wat ik noem twee "type" functies.
De eerste zijn de losse functies zoals Invoke-DeltaSync, Confirm-AdUser, Confirm-MailSend, etc. Deze losse functies heb ik in "regio's" opgedeeld: MIM sync, MIM Portal, AD, HR om in één opslag te kunnen zijn welke functies waar voor dienen.

De tweede zijn de Use Case Functies. Per Use Case is er een functie zoals Invoke-UCCreateUser, Invoke-UCUserLeave, Invoke-UCUserRejoin.

Vervolgens is er het Run All Use Cases script waarin de fake identity inlaad en alle use cases (en de bijbehorende functies) worden afgetrapt. Het voordeel hiervan is dat functies netjes zijn opgesplitst en ook los gebruikt kunnen worden. Tevens zorgt de heldere structuur ervoor dat deze module stap voor stap gemakkelijk uitgebreid kan worden.

Voorbeeld

In onderstaan voorbeeld is de functie : Voeg PIMGroup toe aan een rol beschreven met bijbehorende resultaten.

• Beschreven Use Case

• Powershell Functie: Invoke-PimGroupToRole

See this content in the original post

• Resultaten

Kleine Tip

Valkuilen tijdens het opzetten zijn er niet echt. Maar wat ik jullie wel als advies mee wil geven is: Maak je code generiek. Generieke geschreven code neemt meer tijd in beslag maar zorgt voor een veel hogere kwaliteit van het script/framework.

Hopelijk inspireert en helpt dit jullie bij het maken van jullie eigen Test Framework. Happy scripting :)

 

See this content in the original post