In dit artikel leg ik uit hoe je een rapport met daarin grafieken en diagrammen kan testen als je als tester toegang hebt tot de achterliggende database. Hierbij maak ik gebruik van twee tools: Excel en SQL, in mijn geval MySQL.
Na het lezen van dit artikel weet je welke stappen je moet nemen om willekeurige grafieken en diagrammen te testen en zal je inzien dat de query’s die je hebt geschreven testscripts zijn die zich eenvoudig opnieuw laten uitvoeren als je moet her-testen.
Begrijp het datamodel
Als je een rapport wilt testen is de eerste stap het datamodel begrijpen. Wat wordt er vastgelegd per tabel en hoe liggen de relaties tussen de tabellen onderling? Wat zijn de requirements die er gelden als een regel wordt toegevoegd, gewijzigd of verwijderd in een tabel? Doe hierbij geen aannames, maar laat je voorlichten door iemand met kennis van het datamodel.
In dit artikel maken we gebruik van een datamodel dat hoort bij een inzetplanning van een consultancybureau. Dit bureau verhuurt medewerkers aan klanten. De klant doet een aanvraag en het consultancybureau kan een aanbieding doen. Als de klant de aanbieding accepteert volgt een intake. Zo niet, dan is de aanbieding verloren. Afhankelijk van het resultaat van de intake krijgt het bureau óf de opdracht, of is de aanbieding verloren.
Medewerkers van het consultancy maken onderdeel uit van teams; een medewerker kan maar in één team zitten. Teams zijn bijvoorbeeld: analyse, development, testen, beheer, sales.
Eenvoudig voorbeeld
Nadat je het datamodel hebt begrepen, kan je de volgende stap zetten door per grafiek/diagram een query te schrijven die informatie in de grafiek/diagram in tabel-formaat weergeeft.
In bovenstaand diagram zie je het aantal aanvragen per accountmanager. In tabel vorm zou dit er als volgt uit zien:
Deze tabel bevat één dimensie (accountmanager) en één metriek (aantal aanvragen). Deze tabel kun je samenstellen door een query te schrijven op twee tabellen uit de database: aanvraag en medewerker. De SQL-query ziet er dan als volgt uit:
SELECT
medewerker.voornaam,
COUNT(aanvraag.id)
FROM medewerker
JOIN aanvraag ON aanvraag.account_mngr_id = medewerker.id
GROUP BY 1
Tenslotte vergelijk je de uitkomst van de query met de resultaten in de tabel. Als de uitkomsten niet overeenkomen dan zijn er twee mogelijkheden:
Een meer gecompliceerd voorbeeld
In onderstaand grafiek zie per accountmanager het aantal aanbiedingen per laatste status van de aanbieding. Je ziet ook dat er meer statussen zijn dan ‘Aangeboden’, ‘Intake’, ‘Opdracht’ en ‘Verloren’.
Ook nu moeten we de bijbehorende tabel opstellen. De tabel bevat twee dimensies: accountmanager en status, en één metriek: aantal aanbiedingen, en ziet er dan als volgt uit:
Bij het opstellen van de query moet je rekening houden met het feit dat een aanbieding een ontwikkeling doormaakt die wordt vastgelegd in de tabel aanbieding_historie. Bij elke verandering van de status van de aanbieding zal er een rij aan de tabel aanbieding_historie worden toegevoegd met daarin de nieuwe status. Dat betekent dat bij een aanbieding meer dan één rij kan voorkomen in de tabel aanbieding_historie. Voor onze tabel willen we alleen de laatste wijziging hebben die heeft plaatsgevonden op een aanbieding.
Dit betekent dat de query feitelijk uit twee stappen zal bestaan:
Je kan controleren of de eerste stap goed is opgesteld in SQL door het aantal rijen dat je vindt te vergelijken met het aantal rijen in de tabel aanbieding: deze moeten hetzelfde aantal rijen hebben. Elke aanbieding heeft tenslotte één huidige status. De query voor stap 1 ziet er dan als volgt uit:
SELECT
aanbieding_historie.aanbieding_id,
MAX(aanbieding_historie.laatste_wijziging) AS LW
FROM aanbieding_historie
GROUP BY 1
Deze query (oranje kleur) integreer je dan in een tweede query om de hele tabel te krijgen.
SELECT
medewerker.voornaam,
aanbieding_status.naam,
COUNT(aanbieding.id)
FROM medewerker
JOIN aanvraag ON aanvraag.account_mngr_id = medewerker.id
JOIN aanbieding ON aanbieding.aanvraag_id = aanvraag.id
JOIN aanbieding_historie ON aanbieding_historie.aanbieding_id = aanbieding.id
JOIN aanbieding_status ON aanbieding_status.id = aanbieding_historie.aanbieding_status_id
JOIN (
SELECT
aanbieding_historie.aanbieding_id,
MAX(aanbieding_historie.laatste_wijziging) AS LW
FROM aanbieding_historie
GROUP BY 1
) AS X ON
X.aanbieding_id = aanbieding_historie.aanbieding_id AND
X.LW = aanbieding_historie.laatste_wijziging
GROUP BY 1, 2
ORDER BY 1
Tenslotte vergelijk je de uitkomst van de query met de resultaten in de tabel.
Voorbeeld dat gebruik maakt van Excel-draaitabellen
In onderstaande grafiek zie het aantal aanbieding per accountmanager per klant. Als je één klant zou selecteren met behulp van het filter aan de rechterkant dan zie je de aantallen van de geselecteerde klant. Hetzelfde geldt als je een accountmanager selecteert met het bijbehorende filter. Op deze manier kan je veel combinaties krijgen; als je uitgaat van bijvoorbeeld zes accountmanagers, 50 klanten en vijf statussen, dan heb je 6 x 50 x 5= 1500 combinaties die je moet testen.
De tabel die bij deze grafiek bevat de volgende kolommen:
• Dimensie: accountmanager
• Dimensie: klant
• Dimensie: status
• Metriek: aantal aanbiedingen
De query waarmee je deze tabel maakt ziet er als volgt uit (en lijkt veel op de query uit het vorige voorbeeld). Merk op dat de drie dimensies en de metriek die we nodig hebben allemaal zijn opgenomen in de field list van de query (oranje).
SELECT
klant.naam,
medewerker.voornaam,
aanbieding_status.naam,
COUNT(aanbieding.id)
FROM aanvraag
JOIN aanbieding ON aanbieding.aanvraag_id = aanvraag.id
JOIN aanbieding_historie ON aanbieding_historie.aanbieding_id = aanbieding.id
JOIN aanbieding_status ON aanbieding_status.id = aanbieding_historie.aanbieding_status_id
JOIN medewerker ON medewerker.id = aanvraag.account_mngr_id
JOIN klant ON klant.id = aanvraag.klant_id
JOIN (
SELECT
aanbieding_historie.aanbieding_id,
MAX(aanbieding_historie.laatste_wijziging) AS LW
FROM aanbieding_historie
GROUP BY 1
) AS X ON
X.aanbieding_id = aanbieding.id AND
X.LW = aanbieding_historie.laatste_wijziging
GROUP BY 1, 2, 3
ORDER BY 1, 2, 3;
Het resultaat van de query kopieer je vervolgens naar Excel, om de gegevens vervolgens in een draaitabel te presenteren. Het resultaat ziet er dan als volgt uit.
De reden dat ik dit graag met behulp van een draaitabel test, is dat een draaitabel je dezelfde flexibiliteit geeft als de grafiek die je moet testen. Als je bijvoorbeeld niet alleen de gegevens wilt controleren voor Rebecca, dan selecteer je Rebecca in het filter.
Als per klant zou willen testen, dan selecteer je een klant:
Samenvatting
Bij het testen van grafieken en diagrammen doorloop je de volgende stappen:
Als tijdens het testen bevindingen zijn geconstateerd, dan kan je de grafiek of diagram eenvoudig her-testen met de query’s de je al hebt geschreven.
Meer weten over Data & Analytics?
Lees alles over waar wij goed in zijn met Data & Analytics.
Meer weten over Data & Analytics?
Lees alles over waar wij goed in zijn met Data & Analytics.