{
    "componentChunkName": "component---src-templates-docs-js",
    "path": "/02-course-content/01-basics-summary",
    "result": {"data":{"site":{"siteMetadata":{"title":"Linnéuniversitetet","language":"sv"}},"mdx":{"fields":{"id":"c67bc2f9-16e8-5cd2-984c-67103f652e4d","title":"Week 1 (46) Basics of Testing Summary","slug":"/02-course-content/01-basics-summary"},"body":"var _excluded = [\"components\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"Week 1 (46) Basics of Testing Summary\",\n  \"metaTitle\": \"Week 1 (46) Basics of Testing Summary\",\n  \"metaDescription\": \"\",\n  \"hideInNavigation\": true\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, _excluded);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"This is an AI generated summary from the transcription.\"), mdx(\"h1\", null, \"F\\xF6rel\\xE4sning 1 \\u2013 Basics of Testing\"), mdx(\"p\", null, mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://docs.google.com/presentation/d/1FJ6eaYcg1v67z0D1hrbnFoEX_yVeLavE6FO7jdnJObY/edit\"\n  }, \"Presentationsbilder \\u2013 Basics of Testing 2026\")), mdx(\"h2\", null, \"Vad \\xE4r mjukvarutestning?\"), mdx(\"p\", null, \"Mjukvarutestning handlar om att unders\\xF6ka om ett program g\\xF6r det som f\\xF6rv\\xE4ntas och att uppt\\xE4cka fel, helst innan programmet n\\xE5r anv\\xE4ndarna.\"), mdx(\"p\", null, \"Grunden \\xE4r att j\\xE4mf\\xF6ra tv\\xE5 saker:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Expected behaviour:\"), \" Vad vi f\\xF6rv\\xE4ntar oss att systemet ska g\\xF6ra.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Actual behaviour:\"), \" Vad systemet faktiskt g\\xF6r n\\xE4r vi k\\xF6r det.\")), mdx(\"p\", null, \"N\\xE4r dessa skiljer sig \\xE5t kan vi ha uppt\\xE4ckt ett fel.\"), mdx(\"p\", null, \"Testning hj\\xE4lper oss att:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Uppt\\xE4cka buggar och andra problem.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Skapa f\\xF6rtroende f\\xF6r att programvaran fungerar.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"F\\xF6rst\\xE5 hur ett befintligt system faktiskt beter sig.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"F\\xE5 en b\\xE4ttre f\\xF6rst\\xE5else f\\xF6r kraven och anv\\xE4ndarnas behov.\")), mdx(\"p\", null, \"Ett exempel fr\\xE5n f\\xF6rel\\xE4sningen var spelet \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Timebreaker\"), \", d\\xE4r en sv\\xE5ruppt\\xE4ckt bugg i en grafikdrivrutin kunde orsaka en Blue Screen of Death. Felet uppstod bara under vissa omst\\xE4ndigheter och tog sex m\\xE5nader att isolera.\"), mdx(\"p\", null, \"Exemplet visar att buggar kan vara sv\\xE5ra att reproducera och att problemen inte n\\xF6dv\\xE4ndigtvis ligger i v\\xE5r egen kod.\"), mdx(\"h2\", null, \"Validering och verifiering\"), mdx(\"p\", null, \"Tv\\xE5 grundl\\xE4ggande begrepp inom mjukvarutestning \\xE4r \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"validation\"), \" och \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"verification\"), \".\"), mdx(\"h3\", null, \"Validation \\u2013 bygger vi r\\xE4tt produkt?\"), mdx(\"p\", null, \"Validering handlar om att unders\\xF6ka om systemet uppfyller anv\\xE4ndarnas verkliga behov.\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"L\\xF6ser systemet anv\\xE4ndarens problem?\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"\\xC4r produkten anv\\xE4ndbar och tillr\\xE4ckligt bra?\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Beh\\xF6ver kraven eller specifikationen f\\xF6r\\xE4ndras?\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"\\xC4r det r\\xE4tt funktionalitet vi utvecklar?\")), mdx(\"p\", null, \"Ett system kan uppfylla samtliga specificerade krav men \\xE4nd\\xE5 vara sv\\xE5rt att anv\\xE4nda eller misslyckas med att l\\xF6sa anv\\xE4ndarens problem.\"), mdx(\"h3\", null, \"Verification \\u2013 bygger vi produkten r\\xE4tt?\"), mdx(\"p\", null, \"Verifiering handlar om att unders\\xF6ka om implementationen \\xF6verensst\\xE4mmer med specifikationen.\"), mdx(\"p\", null, \"Vi j\\xE4mf\\xF6r systemets faktiska beteende med dess funktionella och icke-funktionella krav.\"), mdx(\"p\", null, \"En implementation kan inneh\\xE5lla:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Correctly implemented functionality:\"), \" Funktioner som beter sig enligt specifikationen.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Faults:\"), \" Funktioner som \\xE4r implementerade men beter sig felaktigt.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Omissions:\"), \" Funktionalitet som finns i specifikationen men \\xE4nnu inte \\xE4r implementerad.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Surprises:\"), \" Funktionalitet i implementationen som inte beskrivs i specifikationen.\")), mdx(\"p\", null, \"Testning ger oss information om systemets beteende, men kan normalt inte bevisa att programmet \\xE4r korrekt f\\xF6r alla t\\xE4nkbara indata. Det \\xE4r viktigt att skilja vanlig testning fr\\xE5n \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"formal program verification\"), \", d\\xE4r man anv\\xE4nder formella metoder f\\xF6r att bevisa egenskaper hos ett program.\"), mdx(\"h2\", null, \"Testing vs Checking\"), mdx(\"p\", null, \"F\\xF6rel\\xE4sningen skiljer p\\xE5 tv\\xE5 aktiviteter.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Testing\"), \" \\xE4r den kreativa processen d\\xE4r vi utformar tester. Vi beh\\xF6ver avg\\xF6ra:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Vad vi vill unders\\xF6ka och varf\\xF6r.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Vilken del av systemet som ska testas (\", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"System Under Test\"), \", SUT).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Vilka specifika indata vi ska anv\\xE4nda.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Vilket resultat vi f\\xF6rv\\xE4ntar oss.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Checking\"), \" \\xE4r att k\\xF6ra ett redan definierat test och kontrollera resultatet.\"), mdx(\"p\", null, \"Att skriva ett enhetstest \\xE4r allts\\xE5 \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"testing\"), \", medan exempelvis \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"npm run test\"), \" utf\\xF6r automatiserad \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"checking\"), \".\"), mdx(\"p\", null, \"Automatisering \\xE4r s\\xE4rskilt v\\xE4rdefull eftersom samma kontroller ofta beh\\xF6ver upprepas m\\xE5nga g\\xE5nger.\"), mdx(\"p\", null, \"Testning som inneb\\xE4r att vi k\\xF6r programmet \\xE4r en \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"dynamisk aktivitet\"), \". Statiska kvalitetskontroller, som kodgranskning och lintning, unders\\xF6ker i st\\xE4llet kod utan att k\\xF6ra programmet.\"), mdx(\"h2\", null, \"Fr\\xE5n bug till observerbart fel\"), mdx(\"p\", null, \"Ett viktigt avsnitt beskriver hur en bugg i koden kan leda till ett synligt fel.\"), mdx(\"h3\", null, \"Centrala begrepp\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Fault / Defect / Bug:\"), \" Ett statiskt fel i k\\xE4llkoden, konfigurationen eller liknande.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Program state:\"), \" Programmets tillst\\xE5nd, exempelvis v\\xE4rden i variabler, databaser och annan lagring.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Error state:\"), \" Ett felaktigt programtillst\\xE5nd som uppst\\xE5tt till f\\xF6ljd av en bugg.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Failure:\"), \" Ett observerbart felaktigt beteende.\")), mdx(\"p\", null, \"Ett exempel \\xE4r en \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"add(a, b)\"), \"-funktion som av misstag subtraherar i st\\xE4llet f\\xF6r att addera.\"), mdx(\"p\", null, \"Om vi anropar \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"add(3, 4)\"), \" f\\xE5r vi \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"-1\"), \" i st\\xE4llet f\\xF6r \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"7\"), \". Buggen har orsakat ett felaktigt tillst\\xE5nd.\"), mdx(\"p\", null, \"Men om vi anropar \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"add(3, 0)\"), \" blir resultatet \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"3\"), \" oavsett om funktionen adderar eller subtraherar. Buggen finns fortfarande, men just det testet avsl\\xF6jar den inte.\"), mdx(\"h3\", null, \"Tre villkor f\\xF6r att uppt\\xE4cka ett fel\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Reachability:\"), \" Testet m\\xE5ste n\\xE5 och exekvera koden d\\xE4r buggen finns.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Infection:\"), \" Buggen m\\xE5ste orsaka ett felaktigt programtillst\\xE5nd.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Propagation:\"), \" Det felaktiga tillst\\xE5ndet m\\xE5ste sprida sig s\\xE5 att det ger ett observerbart fel.\")), mdx(\"p\", null, \"Det r\\xE4cker allts\\xE5 inte att k\\xF6ra kod som inneh\\xE5ller en bugg. Testet m\\xE5ste ocks\\xE5 f\\xE5 buggen att p\\xE5verka beteendet p\\xE5 ett s\\xE4tt som vi kan uppt\\xE4cka.\"), mdx(\"h2\", null, \"Vad g\\xF6r kod testbar?\"), mdx(\"p\", null, \"En viktig egenskap hos mjukvara \\xE4r \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"testability\"), \", allts\\xE5 hur l\\xE4tt det \\xE4r att testa koden.\"), mdx(\"p\", null, \"Tv\\xE5 centrala egenskaper \\xE4r:\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Controllability \\u2013 kontrollerbarhet\")), mdx(\"p\", null, \"M\\xF6jligheten att styra systemet till ett specifikt tillst\\xE5nd och exekvera den kod vi vill unders\\xF6ka. Exempelvis att kunna anropa en funktion med valfria argument eller kontrollera vilka data som finns i databasen.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Observability \\u2013 observerbarhet\")), mdx(\"p\", null, \"M\\xF6jligheten att se vad som h\\xE4nder i systemet och uppt\\xE4cka om beteendet \\xE4r felaktigt.\"), mdx(\"p\", null, \"Tillsammans bidrar dessa till h\\xF6g testbarhet.\"), mdx(\"p\", null, \"Ytterligare m\\xE5l med testfall \\xE4r:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Accuracy:\"), \" Hur v\\xE4l ett test hj\\xE4lper oss att isolera var ett fel finns.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Traceability:\"), \" Hur v\\xE4l vi kan koppla tester till den kod som k\\xF6rs och de krav som ska uppfyllas.\")), mdx(\"p\", null, \"Enhetstester \\xE4r ofta anv\\xE4ndbara eftersom de l\\xE5ter oss unders\\xF6ka sm\\xE5 delar av systemet isolerat, vilket f\\xF6renklar fels\\xF6kningen.\"), mdx(\"h2\", null, \"Testfall och testorakel\"), mdx(\"p\", null, \"Ett testfall (\", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"test case\"), \") beh\\xF6ver inneh\\xE5lla eller definiera f\\xF6ljande:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"System Under Test (SUT):\"), \" Vad som ska testas, exempelvis en funktion, klass eller komponent.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Specific input:\"), \" De exakta indata som anv\\xE4nds.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Expected output:\"), \" Det f\\xF6rv\\xE4ntade resultatet.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Actual output:\"), \" Det resultat som systemet faktiskt producerar.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Observed output:\"), \" Det resultat som testaren eller testverktyget observerar.\")), mdx(\"p\", null, \"D\\xE4refter beh\\xF6ver vi avg\\xF6ra om det observerade beteendet st\\xE4mmer med det f\\xF6rv\\xE4ntade.\"), mdx(\"p\", null, \"Den som g\\xF6r denna bed\\xF6mning kallas \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"test oracle\"), \", eller testorakel.\"), mdx(\"p\", null, \"Ett orakel kan exempelvis vara en \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"assert\"), \" eller \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"expect\"), \" i ett enhetstest, men kan ocks\\xE5 vara en m\\xE4nniska som bed\\xF6mer resultatet.\"), mdx(\"h3\", null, \"Oracle problem\"), mdx(\"p\", null, \"Hur vet vi vilket resultat som faktiskt \\xE4r korrekt?\"), mdx(\"p\", null, \"Detta \\xE4r ett grundl\\xE4ggande problem inom testning och blir s\\xE4rskilt viktigt vid AI-genererad testning.\"), mdx(\"p\", null, \"En AI-agent kan skapa tusentals tester, men om den har missf\\xF6rst\\xE5tt specifikationen kan alla tester kontrollera fel saker.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Att ett test passerar betyder allts\\xE5 inte automatiskt att systemet g\\xF6r r\\xE4tt sak.\"), \" Vi m\\xE5ste ocks\\xE5 kunna lita p\\xE5 testets f\\xF6rv\\xE4ntningar och bed\\xF6mningar.\"), mdx(\"h2\", null, \"Reproducerbarhet och Flaky Tests\"), mdx(\"p\", null, \"Vi vill att tester ska vara deterministiska: samma f\\xF6ruts\\xE4ttningar och samma indata ska ge samma resultat.\"), mdx(\"p\", null, \"Ett \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"flaky test\"), \" \\xE4r ett test som ibland lyckas och ibland misslyckas utan att vi avsiktligt f\\xF6r\\xE4ndrat det som testas.\"), mdx(\"p\", null, \"Vanliga orsaker \\xE4r:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Tidsberoenden, exempelvis datum och klockslag.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Timing och parallell exekvering.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Skillnader i h\\xE5rdvara eller programmilj\\xF6.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Att tester p\\xE5verkar varandras tillst\\xE5nd.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Otydliga testinstruktioner eller olika tolkningar.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Felaktiga tester.\")), mdx(\"p\", null, \"F\\xF6rel\\xE4sningen inneh\\xF6ll ett exempel d\\xE4r studenter testade samma webbapplikation med samma instruktioner men kom fram till olika resultat. Ett datumfel kunde dessutom bara uppt\\xE4ckas under vissa veckodagar.\"), mdx(\"p\", null, \"Det visar vikten av tydliga testfall och kontrollerade testf\\xF6ruts\\xE4ttningar.\"), mdx(\"p\", null, \"F\\xF6r att g\\xF6ra tester mer reproducerbara kan vi exempelvis \\xE5terst\\xE4lla databaser mellan tester, kontrollera systemklockan och anv\\xE4nda best\\xE4mda startv\\xE4rden f\\xF6r slumptalsgeneratorer.\"), mdx(\"h2\", null, \"Input Domain, Correctness och Reliability\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Input domain (input space)\"), \" \\xE4r m\\xE4ngden av alla m\\xF6jliga indata till ett program.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Correctness\"), \" inneb\\xE4r att programmet beter sig korrekt f\\xF6r varje m\\xF6jligt indata i denna m\\xE4ngd.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Reliability\"), \" beskrivs i f\\xF6rel\\xE4sningen som sannolikheten att programmet fungerar korrekt n\\xE4r vi v\\xE4ljer ett slumpm\\xE4ssigt indata ur inputdom\\xE4nen.\"), mdx(\"h3\", null, \"Test Selection Problem\"), mdx(\"p\", null, \"Vi kan normalt inte testa alla m\\xF6jliga indata. \\xC4ven en enkel funktion med tv\\xE5 heltalsargument kan ha ett enormt antal kombinationer.\"), mdx(\"p\", null, \"Att testa samtliga kombinationer kallas \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"exhaustive testing\"), \" och \\xE4r oftast praktiskt om\\xF6jligt.\"), mdx(\"p\", null, \"Vi m\\xE5ste d\\xE4rf\\xF6r v\\xE4lja ett begr\\xE4nsat antal testfall som har god m\\xF6jlighet att avsl\\xF6ja fel. Detta \\xE4r \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"test selection problem\"), \".\"), mdx(\"p\", null, \"Det handlar inte bara om att skriva m\\xE5nga tester utan om att v\\xE4lja r\\xE4tt tester.\"), mdx(\"p\", null, \"Hur mycket testning som beh\\xF6vs beror ocks\\xE5 p\\xE5 systemets anv\\xE4ndningsomr\\xE5de och konsekvenserna av ett fel. Ett fel i ett datorspel kan ha helt andra konsekvenser \\xE4n ett fel i ett s\\xE4kerhetskritiskt system.\"), mdx(\"h2\", null, \"Testniv\\xE5er\"), mdx(\"p\", null, \"Vi skiljer mellan olika niv\\xE5er av testning beroende p\\xE5 hur stor del av systemet vi unders\\xF6ker.\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Unit Testing:\"), \" Testning av en liten isolerad del, exempelvis en metod, klass eller komponent.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Integration Testing:\"), \" Testning av hur flera komponenter fungerar tillsammans, exempelvis frontend och backend.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"System Testing:\"), \" Testning av hela det integrerade systemet, inklusive dess olika komponenter.\")), mdx(\"h3\", null, \"Andra anledningar att testa\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Beta Testing:\"), \" En begr\\xE4nsad grupp anv\\xE4ndare f\\xE5r prova systemet f\\xF6re en bredare lansering.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Acceptance Testing:\"), \" Kunden eller best\\xE4llaren unders\\xF6ker om systemet kan accepteras och uppfyller behoven.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Regression Testing:\"), \" Tidigare tester k\\xF6rs igen efter f\\xF6r\\xE4ndringar f\\xF6r att unders\\xF6ka om n\\xE5got som fungerade tidigare har g\\xE5tt s\\xF6nder.\")), mdx(\"p\", null, \"Regressionstestning \\xE4r s\\xE4rskilt v\\xE4rdefull i ett utvecklingsarbete d\\xE4r programvaran f\\xF6r\\xE4ndras kontinuerligt.\"), mdx(\"h2\", null, \"Olika testtekniker\"), mdx(\"h3\", null, \"Black-box Testing\"), mdx(\"p\", null, \"Vi testar systemets funktionalitet utifr\\xE5n, utan att beh\\xF6va k\\xE4nna till dess interna implementation.\"), mdx(\"p\", null, \"Tester kan skapas utifr\\xE5n specifikationer och f\\xF6rv\\xE4ntat beteende. Vi bryr oss om vad systemet g\\xF6r, inte hur koden \\xE4r skriven.\"), mdx(\"h3\", null, \"White-box Testing\"), mdx(\"p\", null, \"Vi utformar tester med kunskap om systemets interna kod.\"), mdx(\"p\", null, \"Vi kan exempelvis unders\\xF6ka vilka grenar i \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"if\"), \"-satser som exekveras och anv\\xE4nda kodt\\xE4ckning (\", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"code coverage\"), \") f\\xF6r att identifiera kod som inte testats.\"), mdx(\"h3\", null, \"Smoke Testing\"), mdx(\"p\", null, \"Vi k\\xF6r delar av ett system och letar efter tydliga tecken p\\xE5 fel, exempelvis:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Programkrascher eller exceptions.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Felmeddelanden och loggmeddelanden.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Misslyckade assertions.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Utebliven output.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Ett program som fastnar eller f\\xF6rbrukar orimligt mycket resurser.\")), mdx(\"h3\", null, \"Random Testing\"), mdx(\"p\", null, \"Vi genererar slumpm\\xE4ssiga indata och unders\\xF6ker hur systemet reagerar.\"), mdx(\"p\", null, \"Det kan vara anv\\xE4ndbart n\\xE4r det \\xE4r l\\xE4tt att generera stora m\\xE4ngder indata och identifiera felaktigt beteende.\"), mdx(\"p\", null, \"Ett exempel \\xE4r testning av kompilatorer, d\\xE4r vi kan generera kod som borde vara syntaktiskt korrekt respektive felaktig och kontrollera hur kompilatorn reagerar.\"), mdx(\"h2\", null, \"Testning i en tid med AI-agenter\"), mdx(\"p\", null, \"AI-agenter kan hj\\xE4lpa oss att skapa och k\\xF6ra tester, men de f\\xF6r\\xE4ndrar inte de grundl\\xE4ggande principerna f\\xF6r mjukvarutestning.\"), mdx(\"p\", null, \"Tv\\xE4rtom blir flera fr\\xE5gor \\xE4nnu viktigare:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Hur vet vi att agenten har f\\xF6rst\\xE5tt kraven?\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Hur avg\\xF6r vi om de genererade testerna \\xE4r korrekta?\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Hur kan vi sp\\xE5ra tester till specifikationer och implementation?\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Hur s\\xE4kerst\\xE4ller vi att testerna \\xE4r reproducerbara?\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Hur uppt\\xE4cker vi funktionalitet som agenten lagt till utan att vi bett om det?\")), mdx(\"p\", null, \"Automatiserade regressionstester kan ocks\\xE5 hj\\xE4lpa oss att bevara \\xF6verenskommet beteende n\\xE4r vi forts\\xE4tter utveckla ett system.\"), mdx(\"p\", null, \"En viktig tanke fr\\xE5n f\\xF6rel\\xE4sningen \\xE4r att \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"m\\xE4nniskans ansvar f\\xF6r validering blir s\\xE4rskilt betydelsefullt n\\xE4r AI-agenter tar \\xF6ver mer av implementationen och verifieringen\"), \".\"), mdx(\"p\", null, \"Vi beh\\xF6ver fortfarande kunna f\\xF6rst\\xE5, utv\\xE4rdera och ifr\\xE5gas\\xE4tta b\\xE5de testerna och det system som utvecklas.\"), mdx(\"h2\", null, \"Sammanfattning\"), mdx(\"p\", null, \"Det viktigaste fr\\xE5n f\\xF6rel\\xE4sningen \\xE4r att:\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Testning j\\xE4mf\\xF6r f\\xF6rv\\xE4ntat och faktiskt beteende f\\xF6r att uppt\\xE4cka problem.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Verifiering unders\\xF6ker om vi bygger produkten r\\xE4tt, medan validering unders\\xF6ker om vi bygger r\\xE4tt produkt.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"En bugg leder inte n\\xF6dv\\xE4ndigtvis till ett observerbart fel.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Testbarhet bygger bland annat p\\xE5 kontrollerbarhet och observerbarhet.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Bra testfall kr\\xE4ver tydliga indata, f\\xF6rv\\xE4ntade resultat och ett tillf\\xF6rlitligt testorakel.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Tester m\\xE5ste vara reproducerbara f\\xF6r att ge anv\\xE4ndbar information.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Vi kan inte testa allt och beh\\xF6ver d\\xE4rf\\xF6r g\\xF6ra genomt\\xE4nkta val av testfall.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Olika testniv\\xE5er och testtekniker uppt\\xE4cker olika typer av problem.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"AI-genererade tester beh\\xF6ver granskas och v\\xE4rderas precis som andra tester.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Det centrala \\xE4r inte hur m\\xE5nga tester vi har, utan vilket f\\xF6rtroende de ger oss f\\xF6r att systemet fungerar som det ska.\")), mdx(\"h2\", null, \"Fortsatt arbete\"), mdx(\"p\", null, \"Forts\\xE4tt med materialet i \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://coursepress.lnu.se/kurser/mjukvarutestning/02-course-content/01-week-01\"\n  }, \"veckoguiden f\\xF6r vecka 1\"), \".\"), mdx(\"p\", null, \"P\\xE5b\\xF6rja ocks\\xE5 arbetet med Assignment 1. F\\xF6r den som v\\xE4ljer TDD-alternativet rekommenderas s\\xE4rskilt det kompletterande materialet om testdriven utveckling.\"));\n}\n;\nMDXContent.isMDXComponent = true;","tableOfContents":{"items":[{"url":"#föreläsning-1--basics-of-testing","title":"Föreläsning 1 – Basics of Testing","items":[{"url":"#vad-är-mjukvarutestning","title":"Vad är mjukvarutestning?"},{"url":"#validering-och-verifiering","title":"Validering och verifiering","items":[{"url":"#validation--bygger-vi-rätt-produkt","title":"Validation – bygger vi rätt produkt?"},{"url":"#verification--bygger-vi-produkten-rätt","title":"Verification – bygger vi produkten rätt?"}]},{"url":"#testing-vs-checking","title":"Testing vs Checking"},{"url":"#från-bug-till-observerbart-fel","title":"Från bug till observerbart fel","items":[{"url":"#centrala-begrepp","title":"Centrala begrepp"},{"url":"#tre-villkor-för-att-upptäcka-ett-fel","title":"Tre villkor för att upptäcka ett fel"}]},{"url":"#vad-gör-kod-testbar","title":"Vad gör kod testbar?"},{"url":"#testfall-och-testorakel","title":"Testfall och testorakel","items":[{"url":"#oracle-problem","title":"Oracle problem"}]},{"url":"#reproducerbarhet-och-flaky-tests","title":"Reproducerbarhet och Flaky Tests"},{"url":"#input-domain-correctness-och-reliability","title":"Input Domain, Correctness och Reliability","items":[{"url":"#test-selection-problem","title":"Test Selection Problem"}]},{"url":"#testnivåer","title":"Testnivåer","items":[{"url":"#andra-anledningar-att-testa","title":"Andra anledningar att testa"}]},{"url":"#olika-testtekniker","title":"Olika testtekniker","items":[{"url":"#black-box-testing","title":"Black-box Testing"},{"url":"#white-box-testing","title":"White-box Testing"},{"url":"#smoke-testing","title":"Smoke Testing"},{"url":"#random-testing","title":"Random Testing"}]},{"url":"#testning-i-en-tid-med-ai-agenter","title":"Testning i en tid med AI-agenter"},{"url":"#sammanfattning","title":"Sammanfattning"},{"url":"#fortsatt-arbete","title":"Fortsatt arbete"}]}]},"parent":{"relativePath":"02-course-content/01-basics-summary.md"},"frontmatter":{"metaTitle":"Week 1 (46) Basics of Testing Summary","metaDescription":""}},"allMdx":{"edges":[{"node":{"fields":{"slug":"/02-course-content","title":"Course content"}}},{"node":{"fields":{"slug":"/01-course-information","title":"Study guide"}}},{"node":{"fields":{"slug":"/03-examinations","title":"Assignments and Examinations"}}},{"node":{"fields":{"slug":"/","title":"Software Testing 1DV609"}}},{"node":{"fields":{"slug":"/01-course-information/01-communication-strategy","title":"Communication Strategy"}}},{"node":{"fields":{"slug":"/01-course-information/02-course-Literature","title":"Course literature"}}},{"node":{"fields":{"slug":"/01-course-information/02-course-goals-assignments","title":"Assignments and grading"}}},{"node":{"fields":{"slug":"/01-course-information/03-expections","title":"What we expect from you"}}},{"node":{"fields":{"slug":"/01-course-information/04-gitlab-promptlab","title":"Gitlab resources"}}},{"node":{"fields":{"slug":"/02-course-content/01-course-intro-summary","title":"Week 1 (46) Course introduction Summary"}}},{"node":{"fields":{"slug":"/02-course-content/02-week-02","title":"Week 2 (47)"}}},{"node":{"fields":{"slug":"/02-course-content/01-week-01","title":"Week 1 (46)"}}},{"node":{"fields":{"slug":"/02-course-content/03-week-03","title":"Week 3 (48)"}}},{"node":{"fields":{"slug":"/02-course-content/04-week-04","title":"Week 4 (49)"}}},{"node":{"fields":{"slug":"/02-course-content/05-old-lectures","title":"Previous years lectures"}}},{"node":{"fields":{"slug":"/02-course-content/05-week-05","title":"Week 5 (50)"}}},{"node":{"fields":{"slug":"/02-course-content/06-week-06","title":"Week 6 (51)"}}},{"node":{"fields":{"slug":"/02-course-content/07-week-07","title":"Week 7 (52)"}}},{"node":{"fields":{"slug":"/02-course-content/01-basics-summary","title":"Week 1 (46) Basics of Testing Summary"}}},{"node":{"fields":{"slug":"/02-course-content/08-week-08","title":"Week 8 (53)"}}},{"node":{"fields":{"slug":"/02-course-content/09-week-09","title":"Week 9 (1)"}}},{"node":{"fields":{"slug":"/03-examinations/01-assignment-1-part-1","title":"A1.a1 - Alternative 1"}}},{"node":{"fields":{"slug":"/02-course-content/10-week-10","title":"Week 10 (2)"}}},{"node":{"fields":{"slug":"/03-examinations/02-assignment-1-part-1-alternative","title":"A1.a2 - Alternative 2"}}},{"node":{"fields":{"slug":"/03-examinations/03-assignment-1-part-2","title":"A1 Part 2 - Agentic Testing"}}},{"node":{"fields":{"slug":"/03-examinations/04-assignment-2","title":"Assignment 2 - System testing"}}},{"node":{"fields":{"slug":"/03-examinations/05-assignment-3","title":"Assignment 3 - the article"}}},{"node":{"fields":{"slug":"/03-examinations/06-final-exam","title":"Final Exam"}}}]}},"pageContext":{"id":"c67bc2f9-16e8-5cd2-984c-67103f652e4d"}},
    "staticQueryHashes": ["253607798","3706406642","710574383"]}