Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Altijd up to date documentatie met maximaal descriptieve tests (28-02-2023 Nimma Codes)

Altijd up to date documentatie met maximaal descriptieve tests (28-02-2023 Nimma Codes)

Niemand vindt documentatie schrijven leuk - en terecht! Documentatie schrijven en onderhouden kost veel energie. Tegelijkertijd wordt het nauwelijks gelezen en veroudert snel. Toch is documentatie een belangrijke hulpbron voor (nieuwe) ontwikkelaars om snel up to speed te komen over de werking van een codebase. Tests kunnen hier een uitkomst bieden. Door extra aandacht te besteden aan de scope en leesbaarheid van je tests, kun je deze transformeren van eenvoudig validatiemechanisme naar gezaghebbende bron van informatie voor ontwikkelaars.

Karl van Heijster

February 28, 2023
Tweet

More Decks by Karl van Heijster

Other Decks in Technology

Transcript

  1. =

  2. [TestMethod] public void GivenNavigator_WhenGoesToBarPage_ThenNavigatesToBarUrl() { var baseUrl = "http://foo.com/"; var

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

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

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

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

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

    nav.GoToBarPage(); nav.GetCurrentUrl().Should().Be("http://foo.com/bar"); }
  8. [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(); }
  9. [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(); }
  10. [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(); } var counter = sut.DoSomethingWithSetup(setup);
  11. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Wat is

    het juiste antwoord op deze vraag? A. Zus B. Zo
  12. QTI

  13. <qti-assessment-item title="TestItem" time-dependent="false" adaptive="false" identifier="TestItemId"> <qti-item-body> <div class="qti-layout-row"> <div class="qti-layout-col12">

    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> </div> </div> </qti-item-body> </qti-assessment-item>
  14. <qti-assessment-item title="TestItem" time-dependent="false" adaptive="false" identifier="TestItemId"> <qti-item-body> <div class="qti-layout-row"> <div class="qti-layout-col12">

    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> <img src="Image.jpg" alt="Image named 'Image.jpg'" width="200" height="113"/> </div> </div> </qti-item-body> </qti-assessment-item>
  15. <qti-assessment-item title="TestItem" time-dependent="false" adaptive="false" identifier="TestItemId"> <qti-item-body> <div class="qti-layout-row"> <div class="qti-layout-col12">

    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> <img src="Image.jpg" alt="Image named 'Image.jpg'" width="200" height="113"/> <p>Wat is het juiste antwoord op deze vraag?</p> </div> </div> </qti-item-body> </qti-assessment-item>
  16. <qti-assessment-item title="TestItem" time-dependent="false" adaptive="false" identifier="TestItemId"> <qti-item-body> <div class="qti-layout-row"> <div class="qti-layout-col12">

    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> <img src="Image.jpg" alt="Image named 'Image.jpg'" width="200" height="113"/> <p>Wat is het juiste antwoord op deze vraag?</p> <qti-choice-interaction max-choices="1" min-choices="0" shuffle="false" response-identifier="RESPONSE"> <qti-simple-choice identifier="A"> <p>Zus</p> </qti-simple-choice> <qti-simple-choice identifier="B"> <p>Zo</p> </qti-simple-choice> </qti-choice-interaction> </div> </div> </qti-item-body> </qti-assessment-item>
  17. <qti-assessment-item title="TestItem" time-dependent="false" adaptive="false" identifier="TestItemId"> <qti-response-declaration identifier="RESPONSE" cardinality="single" base-type="identifier"> <qti-correct-response>

    <qti-value>A</qti-value> </qti-correct-response> </qti-response-declaration> <qti-item-body> <div class="qti-layout-row"> <div class="qti-layout-col12"> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> <img src="Image.jpg" alt="Image named 'Image.jpg'" width="200" height="113"/> <p>Wat is het juiste antwoord op deze vraag?</p> <qti-choice-interaction max-choices="1" min-choices="0" shuffle="false" response-identifier="RESPONSE"> <qti-simple-choice identifier="A"> <p>Zus</p> </qti-simple-choice> <qti-simple-choice identifier="B"> <p>Zo</p> </qti-simple-choice> </qti-choice-interaction> </div> </div> </qti-item-body> </qti-assessment-item>
  18. <qti-assessment-item title="TestItem" time-dependent="false" adaptive="false" identifier="TestItemId"> <qti-response-declaration identifier="RESPONSE" cardinality="single" base-type="identifier"> <qti-correct-response>

    <qti-value>A</qti-value> </qti-correct-response> </qti-response-declaration> <qti-outcome-declaration identifier="SCORE" cardinality="single" base-type="float"> <qti-default-value> <qti-value>0</qti-value> </qti-default-value> </qti-outcome-declaration> <qti-outcome-declaration identifier="MAXSCORE" cardinality="single" base-type="float"> <qti-default-value> <qti-value>1</qti-value> </qti-default-value> </qti-outcome-declaration> <qti-item-body> <div class="qti-layout-row"> <div class="qti-layout-col12"> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> <img src="Image.jpg" alt="Image named 'Image.jpg'" width="200" height="113"/> <p>Wat is het juiste antwoord op deze vraag?</p> <qti-choice-interaction max-choices="1" min-choices="0" shuffle="false" response-identifier="RESPONSE"> <qti-simple-choice identifier="A"> <p>Zus</p> </qti-simple-choice> <qti-simple-choice identifier="B"> <p>Zo</p> </qti-simple-choice> </qti-choice-interaction> </div> </div> </qti-item-body> <qti-response-processing template="https://purl.imsglobal.org/spec/qti/v3p0/rptemplates/match_correct.xml"/> </qti-assessment-item>
  19. [TestMethod] public void ChoiceInteractionScoredDichotomous_ConvertToQti_ReturnsValidQtiResponseDeclarationWithoutMapping() { //Arrange var alternativeId = Guid.NewGuid();

    var item = GetItemWithBlock(new ChoiceInteraction() { ScorePolytomous = false, Solution = new List<Guid>() { alternativeId }, }); //Act var result = GetItemGenerator(item).GetQti(); //Assert var responseDeclaration = GetQtiElementOrDefault(result); responseDeclaration.Should().BeEquivalentTo(XElement.Parse($@" <qti-response-declaration identifier=""RESPONSE"" cardinality=""single"" base-type=""identifier"" xmlns=""http://www.imsglobal.org/xsd/imsqtiasi_v3p0""> <qti-correct-response> <qti-value>_{alternativeId}</qti-value> </qti-correct-response> </qti-response-declaration>")); }
  20. [TestMethod] public void ChoiceInteractionScoredDichotomous_ConvertToQti_ReturnsValidQtiResponseDeclarationWithoutMapping() { //Arrange var alternativeId = Guid.NewGuid();

    var item = GetItemWithBlock(new ChoiceInteraction() { ScorePolytomous = false, Solution = new List<Guid>() { alternativeId }, }); //Act var result = GetItemGenerator(item).GetQti(); //Assert var responseDeclaration = GetQtiElementOrDefault(result); responseDeclaration.Should().BeEquivalentTo(XElement.Parse($@" <qti-response-declaration identifier=""RESPONSE"" cardinality=""single"" base-type=""identifier"" xmlns=""http://www.imsglobal.org/xsd/imsqtiasi_v3p0""> <qti-correct-response> <qti-value>_{alternativeId}</qti-value> </qti-correct-response> </qti-response-declaration>")); }
  21. [TestMethod] public void ChoiceInteractionScoredDichotomous_ConvertToQti_ReturnsValidQtiResponseDeclarationWithoutMapping() { //Arrange var alternativeId = Guid.NewGuid();

    var item = GetItemWithBlock(new ChoiceInteraction() { ScorePolytomous = false, Solution = new List<Guid>() { alternativeId }, }); //Act var result = GetItemGenerator(item).GetQti(); //Assert var responseDeclaration = GetQtiElementOrDefault(result); responseDeclaration.Should().BeEquivalentTo(XElement.Parse($@" <qti-response-declaration identifier=""RESPONSE"" cardinality=""single"" base-type=""identifier"" xmlns=""http://www.imsglobal.org/xsd/imsqtiasi_v3p0""> <qti-correct-response> <qti-value>_{alternativeId}</qti-value> </qti-correct-response> </qti-response-declaration>")); }
  22. [TestMethod] public void ChoiceInteractionScoredDichotomous_ConvertToQti_ReturnsVa { //Arrange var alternativeId = Guid.NewGuid();

    var item = GetItemWithBlock(new ChoiceInteraction() { ScorePolytomous = false, Solution = new List<Guid>() { alternativeId }, }); //Act var result = GetItemGenerator(item).GetQti(); //Assert var responseDeclaration = GetQtiElementOrDefault(result); responseDeclaration.Should().BeEquivalentTo(XElement.Parse($@"
  23. [TestMethod] public void ChoiceInteractionScoredDichotomous_ConvertToQti_ReturnsVa { //Arrange var alternativeId = Guid.NewGuid();

    var item = GetItemWithBlock(new ChoiceInteraction() { ScorePolytomous = false, Solution = new List<Guid>() { alternativeId }, }); //Act var result = GetItemGenerator(item).GetQti(); //Assert var responseDeclaration = GetQtiElementOrDefault(result); responseDeclaration.Should().BeEquivalentTo(XElement.Parse($@"
  24. [TestMethod] public void ChoiceInteractionScoredDichotomous_ConvertToQti_ReturnsVa { //Arrange var alternativeId = Guid.NewGuid();

    var item = GetItemWithBlock(new ChoiceInteraction() { ScorePolytomous = false, Solution = new List<Guid>() { alternativeId }, }); //Act var result = GetItemGenerator(item).GetQti(); //Assert var responseDeclaration = GetQtiElementOrDefault(result); responseDeclaration.Should().BeEquivalentTo(XElement.Parse($@"
  25. }); //Act var result = GetItemGenerator(item).GetQti(); //Assert var responseDeclaration =

    GetQtiElementOrDefault(result); responseDeclaration.Should().BeEquivalentTo(XElement.Parse($@" <qti-response-declaration identifier=""RESPONSE"" cardinality=""single"" base-type=""identifier"" xmlns=""http://www.imsglobal.org/xsd/imsqtiasi_v3p0""> <qti-correct-response> <qti-value>_{alternativeId}</qti-value> </qti-correct-response> </qti-response-declaration>")); }
  26. }); //Act var result = GetItemGenerator(item).GetQti(); //Assert var responseDeclaration =

    GetQtiElementOrDefault(result); responseDeclaration.Should().BeEquivalentTo(XElement.Parse($@" <qti-response-declaration identifier=""RESPONSE"" cardinality=""single"" base-type=""identifier"" xmlns=""http://www.imsglobal.org/xsd/imsqtiasi_v3p0""> <qti-correct-response> <qti-value>_{alternativeId}</qti-value> </qti-correct-response> </qti-response-declaration>")); }
  27. }); //Act var result = GetItemGenerator(item).GetQti(); //Assert var responseDeclaration =

    GetQtiElementOrDefault(result); responseDeclaration.Should().BeEquivalentTo(XElement.Parse($@" <qti-response-declaration identifier=""RESPONSE"" cardinality=""single"" base-type=""identifier"" xmlns=""http://www.imsglobal.org/xsd/imsqtiasi_v3p0""> <qti-correct-response> <qti-value>_{alternativeId}</qti-value> </qti-correct-response> </qti-response-declaration>")); }
  28. <qti-assessment-item title="TestItem" time-dependent="false" adaptive="false" identifier="TestItemId"> <qti-response-declaration identifier="RESPONSE" cardinality="single" base-type="identifier"> <qti-correct-response>

    <qti-value>A</qti-value> </qti-correct-response> </qti-response-declaration> <qti-outcome-declaration identifier="SCORE" cardinality="single" base-type="float"> <qti-default-value> <qti-value>0</qti-value> </qti-default-value> </qti-outcome-declaration> <qti-outcome-declaration identifier="MAXSCORE" cardinality="single" base-type="float"> <qti-default-value> <qti-value>1</qti-value> </qti-default-value> </qti-outcome-declaration> <qti-item-body> <div class="qti-layout-row"> <div class="qti-layout-col12"> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> <img src="Image.jpg" alt="Image named 'Image.jpg'" width="200" height="113"/> <p>Wat is het juiste antwoord op deze vraag?</p> <qti-choice-interaction max-choices="1" min-choices="0" shuffle="false" response-identifier="RESPONSE"> <qti-simple-choice identifier="A"> <p>Zus</p> </qti-simple-choice> <qti-simple-choice identifier="B"> <p>Zo</p> </qti-simple-choice> </qti-choice-interaction> </div> </div> </qti-item-body> <qti-response-processing template="https://purl.imsglobal.org/spec/qti/v3p0/rptemplates/match_correct.xml"/> </qti-assessment-item>
  29. [TestMethod] public void ChoiceInteractionScoredDichotomous_ConvertToQti_ReturnsValidQtiResponseDeclarationWithoutMapping() { //Arrange var alternativeId = Guid.NewGuid();

    var item = GetItemWithBlock(new ChoiceInteraction() { ScorePolytomous = false, Solution = new List<Guid>() { alternativeId }, }); //Act var result = GetItemGenerator(item).GetQti(); //Assert var responseDeclaration = GetQtiElementOrDefault(result); responseDeclaration.Should().BeEquivalentTo(XElement.Parse($@" <qti-response-declaration identifier=""RESPONSE"" cardinality=""single"" base-type=""identifier"" xmlns=""http://www.imsglobal.org/xsd/imsqtiasi_v3p0""> <qti-correct-response> <qti-value>_{alternativeId}</qti-value> </qti-correct-response> </qti-response-declaration>")); }