Slide 1

Slide 1 text

Altijd up to date documentatie met maximaal descriptieve tests Karl van Heijster www.karlvanheijster.com

Slide 2

Slide 2 text

Softwareontwikkelaar Filosoof Test-enthousiasteling www.karlvanheijster.com Karl van Heijster

Slide 3

Slide 3 text

Het leven is zwaar zonder documentatie

Slide 4

Slide 4 text

= Tests zijn een vorm van documentatie

Slide 5

Slide 5 text

Public Sub MC_Test() PublicationTestHelper.RunResponseDeclarationTest(_itemBody1, _solution1, GetMcScoringParams(), _result1, 1) End Sub Maar niet elke test is daarvoor geschikt

Slide 6

Slide 6 text

≈ Tests zijn in potentie een vorm van documentatie

Slide 7

Slide 7 text

Wat documenteer je?

Slide 8

Slide 8 text

Tests documenteren het gedrag van een systeem

Slide 9

Slide 9 text

a aTest b c e f d bTest cTest eTest fTest dTest

Slide 10

Slide 10 text

Als je elke publieke method test, wat documenteer je dan precies?

Slide 11

Slide 11 text

a b c e f d Vraag jezelf af: welke informatie moet ik overbrengen?

Slide 12

Slide 12 text

a aTest a1 a2 a3 a4 a5

Slide 13

Slide 13 text

a aTest a1 a2 a3 a4 a5 Test de interface, niet de implementatie

Slide 14

Slide 14 text

Documenteer wat het systeem doet, niet hoe het dat doet

Slide 15

Slide 15 text

Hoe documenteer je?

Slide 16

Slide 16 text

ests zijn een in potentie informatieve tekst. Het is aan jou als schrijver van de test om ervoor te zorgen dat die potentie gerealiseerd o elfs gemaximaliseerd wordt. Dat doe je door ervoor te zorgen dat de informatie die in de test zit, zo effectief mogelijk bij de leze erechtkomt. Met andere woorden: maak het makkelijk voor de lezer om de boodschap van de test te begrijpen. De belangrijk formatie moet als het ware direct van het scherm af springen, zó het hoofd van de lezer in. Als je het de lezer moeilijk om erachter t omen wat de boodschap van je test (qua informatieve tekst) is, dan zal hij of zij ongetwijfeld het punt missen. In dat geval had j isschien net zo goed geen test kunnen schrijven. Jouw test heeft er in elk geval niet voor gezorgd dat de lezer de boel sneller begree an anders. Een veel voorkomend antipatroon is bijvoorbeeld dat je veel te veel informatie geeft, al helemaal als je dat allemaal in éé eer doet. Vergelijk het met het geven van een PowerPoint. Je kunt je hele presentatie uitschrijven en die uitgeschreven tekst op de slide rojecteren, maar dat is een superinefficiënte manier van die informatie overbrengen. Al helemaal als je er nog bij gaat staan prate ok. Je toehoorders zullen proberen de tekst te gaan lezen, en ondertussen gaan ze ook nog naar je luisteren, met als gevolg dat z eide maar half meekrijgen. PowerPoints hebben zo hun eigen conventies als het om het overbrengen van informatie gaat. Je zet allee aar bulletpoints op je slides – dat is de belangrijke informatie – en daar ga je vervolgens over vertellen – en in dat verhaal werk j e belangrijke punten uit. De slides stellen je toehoorders dan in staat om op hoofdlijnen het verhaal te volgen, terwijl je met je praatj lle interessante details overbrengt. Maar goed, ik ben hier niet om een cursus PowerPoint te geven, ik ben hier om te vertellen over tes ls documentatie. Welnu, daar gelden eigenlijk dezelfde principes. Ook voor tests (qua informatieve tekst) geldt: maak het voor de leze akkelijk om de essentie uit je verhaal te halen. Optimaliseer je tests voor leesbaarheid. Dat doe je bijvoorbeeld door aandacht t esteden aan de titel van je test. Deze moet een samenvatting vormen van de inhoud ervan. Een unittest bestaat gewoonlijk uit dri elen: Arrange, Act en Assert. Zorg ervoor dat je titel dezelfde opdeling kent. Het eerste deel van je titel geeft dan weer: dit is wat d oestand van het systeem is; het tweede deel: dit is de actie die het systeem vervolgens uitvoert, en het derde: dit is wat dit tot gevol eeft. Je kunt deze drie delen in één mooie volzin gieten door het Given When Then-patroon te gebruiken. Een voorbeeld van zo’n tite : GivenNavigator_WhenGoesToBarPage_ThenNavigatesToBarUrl. Daarnaast doe je er goed aan om de inhoud van je test zodanig t chrijven dat de belangrijkste informatie meteen zichtbaar is voor de lezer. Leg de nadruk op de relevante aspecten van je test, en – d ndere kant van de munt – haal dat weg wat niet bijdraagt aan het begrip van de test. Gaat je test over een Navigator met ee epaalde eigenschap, zorg dan dat die eigenschap meteen duidelijk is voor de lezer. Alle andere eigenschappen dragen niet bij aa et begrip van de test en hoeven daarom niet expliciet in de testbody genoemd te worden. Je kunt deze informatie wegwerken doo Gebruik een vorm die je boodschap effectief overbrengt

Slide 17

Slide 17 text

Vat je test samen in de titel

Slide 18

Slide 18 text

Given … When … Then … Arrange Act Assert

Slide 19

Slide 19 text

Gebruik geen logica in je tests

Slide 20

Slide 20 text

[TestMethod] public void Navigator_GoesToBarPage_NavigatesToBarUrl() { var baseUrl = "http://foo.com/"; var nav = new Navigator(baseUrl); nav.GoToBarPage(); nav.GetCurrentUrl().Should().Be(baseUrl + "/bar"); }

Slide 21

Slide 21 text

[TestMethod] public void Navigator_GoesToBarPage_NavigatesToBarUrl() { var nav = new Navigator("http://foo.com/"); nav.GoToBarPage(); nav.GetCurrentUrl().Should().Be("http://foo.com/bar"); }

Slide 22

Slide 22 text

Benadruk het belangrijke

Slide 23

Slide 23 text

[TestMethod] public void TooMuchInformation() { var dependency1 = new Dependency1(); var dependency2 = new Dependency2(); var dependency3 = new Dependency3(dependency1, dependency2); var sut = new SystemUnderTest(); sut.Initialize(dependency1, dependency3); var setup = sut.SomeOperation(); foreach (var thing in setup.Things) { thing.Foo = sut.DoFoo(); thing.Bar = sut.DoBar(); thing.Done(); } var counter = sut.DoSomethingWithSetup(setup); counter.Should().Be(3); sut.DoSomething("Relevant variable"); sut.SomethingDone.Should().BeTrue(); }

Slide 24

Slide 24 text

[TestMethod] public void Factory() { var sut = GetSutWithComplexSetUpLogic(); sut.DoSomething("Relevant variable"); sut.SomethingDone.Should().BeTrue(); } private static SystemUnderTest GetSutWithComplexSetUpLogic() { var dependency1 = new Dependency1(); var dependency2 = new Dependency2(); var dependency3 = new Dependency3(dependency1, dependency2); var sut = new SystemUnderTest(); sut.Initialize(dependency1, dependency3); var setup = sut.SomeOperation(); foreach (var thing in setup.Things) { thing.Foo = sut.DoFoo(); thing.Bar = sut.DoBar(); thing.Done(); }

Slide 25

Slide 25 text

Tests zijn bedoeld om te lezen, niet om over na te denken

Slide 26

Slide 26 text

Een praktijkvoorbeeld

Slide 27

Slide 27 text

Een toets bestaat uit toetsvragen: items

Slide 28

Slide 28 text

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Wat is het juiste antwoord op deze vraag? A. Zus B. Zo Items bevatten een vraag en een bijbehorend antwoord

Slide 29

Slide 29 text

Items worden uitgewisseld tussen systemen middels de QTI-standaard

Slide 30

Slide 30 text

A 0 1

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Image named 'Image.jpg'

Wat is het juiste antwoord op deze vraag?

Zus

Zo

De test: produceren we de juiste QTI voor een meerkeuze-antwoord?

Slide 31

Slide 31 text

Twee systemen: legacy en nieuwbouw

Slide 32

Slide 32 text

Twee tests: slechts één dient als documentatie

Slide 33

Slide 33 text

Public Sub MC_Test() PublicationTestHelper.RunResponseDeclarationTest(_itemBody1, _solution1, GetMcScoringParams(), _result1, 1) End Sub Wat vertelt deze test (niet)?

Slide 34

Slide 34 text

[TestMethod] public void ChoiceInteractionScoredDichotomous_ConvertToQti_ ReturnsValidQtiResponseDeclarationWithoutMapping() { //Arrange var alternativeId = Guid.NewGuid(); var item = GetItemWithBlock(new ChoiceInteraction() { ScorePolytomous = false, Solution = new List() { alternativeId }, }); //Act var result = GetItemGenerator(item).GetQti(); //Assert var responseDeclaration = GetQtiElementOrDefault(result); responseDeclaration.Should().BeEquivalentTo(XElement.Parse($@" _{alternativeId} ")); } Wat vertelt deze test? Hoe doet hij dat?

Slide 35

Slide 35 text

Informatieve, descriptieve tests zijn een communicatiemiddel

Slide 36

Slide 36 text

Take aways

Slide 37

Slide 37 text

Een test is in potentie een informatieve tekst

Slide 38

Slide 38 text

Documenteer het wat, niet het hoe

Slide 39

Slide 39 text

Optimaliseer voor leesbaarheid

Slide 40

Slide 40 text

Goede documentatie maakt het leven aangenaam

Slide 41

Slide 41 text

Altijd up to date documentatie met maximaal descriptieve tests Karl van Heijster www.karlvanheijster.com