<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://staging.moocwiki.org/index.php?action=history&amp;feed=atom&amp;title=Anwendungsentwicklung_und_Softwarequalit%C3%A4t_%E2%80%93_Testebenen_f%C3%BCr_Software_planen</id>
	<title>Anwendungsentwicklung und Softwarequalität – Testebenen für Software planen - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://staging.moocwiki.org/index.php?action=history&amp;feed=atom&amp;title=Anwendungsentwicklung_und_Softwarequalit%C3%A4t_%E2%80%93_Testebenen_f%C3%BCr_Software_planen"/>
	<link rel="alternate" type="text/html" href="https://staging.moocwiki.org/index.php?title=Anwendungsentwicklung_und_Softwarequalit%C3%A4t_%E2%80%93_Testebenen_f%C3%BCr_Software_planen&amp;action=history"/>
	<updated>2026-10-10T06:59:51Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in MOOCsWiki Staging</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://staging.moocwiki.org/index.php?title=Anwendungsentwicklung_und_Softwarequalit%C3%A4t_%E2%80%93_Testebenen_f%C3%BCr_Software_planen&amp;diff=63469&amp;oldid=prev</id>
		<title>Glanz: aiMOOC über GPT aiMOOC Action erstellt</title>
		<link rel="alternate" type="text/html" href="https://staging.moocwiki.org/index.php?title=Anwendungsentwicklung_und_Softwarequalit%C3%A4t_%E2%80%93_Testebenen_f%C3%BCr_Software_planen&amp;diff=63469&amp;oldid=prev"/>
		<updated>2026-10-09T19:20:32Z</updated>

		<summary type="html">&lt;p&gt;aiMOOC über GPT aiMOOC Action erstellt&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{T}}&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Einleitung =&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Anwendungsentwicklung und Softwarequalität – Testebenen für Software planen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Zielgruppe:&amp;#039;&amp;#039;&amp;#039; Fachinformatikerinnen und Fachinformatiker für Anwendungsentwicklung in der Ausbildung.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Dauer:&amp;#039;&amp;#039;&amp;#039; Etwa 90–120 Minuten in kurzen Lerneinheiten.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Ausbildungsfall:&amp;#039;&amp;#039;&amp;#039; Du entwickelst und testest eine kleine Bestell-App für einen fiktiven Schulkiosk.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Deine Mission:&amp;#039;&amp;#039;&amp;#039; Plane und erprobe [[Einheitstest|Einheitstests]], [[Integrationstest|Integrationstests]] und vollständige [[Anwendungsfall|Nutzungsfalltests]].&lt;br /&gt;
&lt;br /&gt;
[[Datei:Testing Pyramid.svg|500px|rahmenlos|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Die Testpyramide zeigt ein mögliches Verhältnis zwischen Unit-, Integrations- und End-to-End-Tests. Grafik: Abbe98, CC BY-SA 4.0, [https://commons.wikimedia.org/wiki/File:Testing_Pyramid.svg Wikimedia Commons].&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Sicherheitsregel:&amp;#039;&amp;#039;&amp;#039; Alle Programmierexperimente laufen ausschließlich lokal mit erfundenen Daten. Keine fremden Systeme, Produktivanlagen, Kundeninformationen, Zugangsdaten oder Netzwerkdienste verwenden. Die Aufgaben benötigen weder einen Server noch einen Internetzugang.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Datenschutzhinweis:&amp;#039;&amp;#039;&amp;#039; Eingebundene YouTube-, Wikipedia- und LearningApps-Angebote sind externe Medien. Beim Laden können Verbindungsdaten an die jeweiligen Anbieter gelangen. Nutze diese Angebote nur im Rahmen der Freigaben Deiner Bildungseinrichtung. Für die praktischen Softwaretests wird keine Verbindung zu ihnen benötigt.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Lernziele ==&lt;br /&gt;
&lt;br /&gt;
Nach dem Kurs kannst Du:&lt;br /&gt;
# [[Teststufe|Teststufen]] unterscheiden und fachlich korrekt benennen.&lt;br /&gt;
# Einen Testplan aus Anforderungen und Risiken ableiten.&lt;br /&gt;
# Einen isolierten [[Unit-Test]] programmieren.&lt;br /&gt;
# Das Zusammenspiel von Komponenten prüfen.&lt;br /&gt;
# Einen vollständigen Nutzungsfall mit erwarteten Ergebnissen beschreiben.&lt;br /&gt;
# Testresultate interpretieren und Verbesserungen begründen.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Lerneinheit 1: Der Ausbildungsfall =&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Zeit: 10 Minuten&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Dein Ausbildungsbetrieb entwickelt die fiktive App &amp;#039;&amp;#039;&amp;#039;PausenKiosk&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Eine Person bestellt Brötchen. Das Programm berechnet den Preis, prüft den Lagerbestand und bestätigt oder verweigert den Kauf.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Anforderung !! Fachliche Regel&lt;br /&gt;
|-&lt;br /&gt;
| R1: Preisberechnung || Ein Brötchen kostet 250 Cent. Zwei Brötchen kosten 500 Cent.&lt;br /&gt;
|-&lt;br /&gt;
| R2: Lagerprüfung || Eine Bestellung darf den Lagerbestand nicht unterschreiten.&lt;br /&gt;
|-&lt;br /&gt;
| R3: Bestellablauf || Eine erfolgreiche Bestellung vermindert den Bestand und liefert den korrekten Gesamtpreis.&lt;br /&gt;
|-&lt;br /&gt;
| R4: Fehlerbehandlung || Mengen kleiner oder gleich null sowie ungültige Preise werden zurückgewiesen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Dein Testauftrag:&amp;#039;&amp;#039;&amp;#039; Wie überprüfst Du diese Anforderungen mit möglichst schnellen, aussagekräftigen Tests?&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Drei Blickrichtungen auf dieselbe Software ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Blickrichtung !! Prüffrage !! Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Einheitstest&amp;#039;&amp;#039;&amp;#039; || Ist die einzelne Funktion richtig? || Zwei Brötchen kosten 500 Cent.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Integrationstest&amp;#039;&amp;#039;&amp;#039; || Arbeiten die Komponenten zusammen? || Preisberechnung und Lagerreservierung liefern einen konsistenten Bestellzustand.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Nutzungsfalltest&amp;#039;&amp;#039;&amp;#039; || Funktioniert ein Ablauf aus Anwendersicht? || Kaufen, erneut bestellen, Ablehnung erhalten und Restbestand prüfen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Wichtige fachliche Unterscheidung:&amp;#039;&amp;#039;&amp;#039; Nach dem ISTQB-Lehrplan gehören Komponenten-, Komponentenintegrations-, System-, Systemintegrations- und Abnahmetests zu den Teststufen. Ein &amp;#039;&amp;#039;&amp;#039;Nutzungsfalltest&amp;#039;&amp;#039;&amp;#039; ist dagegen keine zusätzliche formale Teststufe, sondern eine szenariobasierte Testperspektive. Ein vollständiger Nutzungsfall kann beispielsweise im [[Systemtest]] oder [[Abnahmetest]] überprüft werden.&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|   https://www.youtube.com/watch?v=TLccnKIMggA   |500|center}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Video: Lucas Paganini – Static, Unit, Integration, and End-to-End Tests Explained. Englisch, mit praktischen Beispielen. Vertiefung: Welche Fehler erkennt jede Testperspektive?&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Lerneinheit 2: Einheitstest =&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Zeit: 15 Minuten&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Ein [[Modultest|Einheitstest]] prüft eine kleine, klar abgegrenzte Funktion. Andere Komponenten werden dafür möglichst nicht benötigt.&lt;br /&gt;
&lt;br /&gt;
Unser Testobjekt heißt &amp;lt;code&amp;gt;positionswert&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def positionswert(preis_cent, anzahl):&lt;br /&gt;
    if preis_cent &amp;lt;= 0 or anzahl &amp;lt;= 0:&lt;br /&gt;
        raise ValueError(&amp;quot;Ungueltiger Wert&amp;quot;)&lt;br /&gt;
    return preis_cent * anzahl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Testidee:&amp;#039;&amp;#039;&amp;#039; Die Eingaben 250 und 2 müssen das Ergebnis 500 ergeben.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Testeingabe !! Erwartung&lt;br /&gt;
|-&lt;br /&gt;
| Preis 250, Menge 2 || Ergebnis 500 Cent&lt;br /&gt;
|-&lt;br /&gt;
| Preis 250, Menge 0 || ValueError&lt;br /&gt;
|-&lt;br /&gt;
| Preis -1, Menge 1 || ValueError&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Merksatz:&amp;#039;&amp;#039;&amp;#039; Ein guter Einheitstest ist nachvollziehbar, wiederholbar und weitgehend unabhängig von anderen Teilen der Anwendung.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Tdd-abstract.png|500px|rahmenlos|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Abbildung zum [[Testgetriebene Entwicklung|Test-driven Development]]. Grafik: Kristijan Kralj, CC0, [https://commons.wikimedia.org/wiki/File:Tdd-abstract.png Wikimedia Commons]. Testgetriebene Entwicklung ist eine mögliche, aber nicht die einzige Vorgehensweise für Einheitstests.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|   https://www.youtube.com/watch?v=6tNS--WetLI   |500|center}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Video: Corey Schafer – Python Tutorial: Unit Testing Your Code with the unittest Module. Englisch. Beobachte insbesondere Testmethoden und Assertions.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Basisaufgabe:&amp;#039;&amp;#039;&amp;#039; Erkläre, weshalb ein Preisberechnungstest keinen echten Lagerdienst benötigt.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Feedback:&amp;#039;&amp;#039;&amp;#039; Die Funktion berechnet nur einen Wert aus Eingaben. Ein Lagerdienst würde eine zusätzliche Abhängigkeit erzeugen und die Fehlersuche unnötig erschweren.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Lerneinheit 3: Integrationstest =&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Zeit: 15 Minuten&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Ein [[Integrationstest]] prüft die Zusammenarbeit von Komponenten und ihre [[Schnittstelle|Schnittstellen]].&lt;br /&gt;
&lt;br /&gt;
Für PausenKiosk arbeiten die Funktionen &amp;lt;code&amp;gt;positionswert&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bestellen&amp;lt;/code&amp;gt; und die Klasse &amp;lt;code&amp;gt;Lager&amp;lt;/code&amp;gt; zusammen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Eingabe: 2 Broetchen&lt;br /&gt;
        |&lt;br /&gt;
        v&lt;br /&gt;
Preisfunktion -&amp;gt; 500 Cent&lt;br /&gt;
        |&lt;br /&gt;
        v&lt;br /&gt;
Lager -&amp;gt; reserviert 2 von 3&lt;br /&gt;
        |&lt;br /&gt;
        v&lt;br /&gt;
Antwort: bestaetigt&lt;br /&gt;
Restbestand: 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Testfrage:&amp;#039;&amp;#039;&amp;#039; Wird ein richtiger Preis berechnet und gleichzeitig der Lagerbestand korrekt verändert?&lt;br /&gt;
&lt;br /&gt;
[[Datei:V-Modell.svg|500px|rahmenlos|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Das V-Modell veranschaulicht Beziehungen zwischen Entwicklungsaktivitäten und Teststufen. Grafik: Michael Pätzold und S. Seyfert, CC BY-SA 3.0, [https://commons.wikimedia.org/wiki/File:V-Modell.svg Wikimedia Commons].&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Praxisentscheidung:&amp;#039;&amp;#039;&amp;#039; Im Beispiel werden echte lokale Python-Komponenten miteinander verbunden. Es werden keine externen Schnittstellen kontaktiert.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Anwendungsaufgabe:&amp;#039;&amp;#039;&amp;#039; Ein Test prüft nur den richtigen Kaufpreis, aber nicht die Lageränderung. Warum ist der Integrationstest unvollständig?&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Feedback:&amp;#039;&amp;#039;&amp;#039; Die Schnittstelle kann den Preis korrekt liefern und trotzdem den Bestand falsch verwalten. Beide Auswirkungen gehören zum erwarteten Verhalten und müssen überprüft werden.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Lerneinheit 4: Nutzungsfalltest =&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Zeit: 15 Minuten&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Ein [[Anwendungsfall|Nutzungsfall]] beschreibt, was eine Person mit einer Software erreichen möchte.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Nutzungsfall: Brötchen einkaufen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
# Startbestand: drei Brötchen.&lt;br /&gt;
# Die Person bestellt zwei Brötchen.&lt;br /&gt;
# Das System bestätigt 500 Cent; ein Brötchen bleibt übrig.&lt;br /&gt;
# Eine weitere Bestellung von zwei Brötchen wird abgelehnt.&lt;br /&gt;
# Anschließend kann das letzte Brötchen bestellt werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:UML Use Case diagram.svg|500px|rahmenlos|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Beispiel eines allgemeinen [[UML]]-Anwendungsfalldiagramms, nicht die konkrete PausenKiosk-App. Grafik: Slashme, CC BY-SA 4.0, [https://commons.wikimedia.org/wiki/File:UML_Use_Case_diagram.svg Wikimedia Commons].&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Prüfkriterien:&amp;#039;&amp;#039;&amp;#039; Reihenfolge, Rückmeldungen, Preis und verbleibender Bestand.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fachliche Grenze:&amp;#039;&amp;#039;&amp;#039; Unser Konsolenbeispiel testet einen vollständigen fachlichen Ablauf durch lokale Funktionen. Es simuliert keinen Webbrowser, kein Bezahlsystem und keine echte Benutzeroberfläche. Ein realer End-to-End-Test einer größeren Anwendung würde gegebenenfalls weitere Komponenten benötigen.&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|   https://www.youtube.com/watch?v=YdZ-sduNb48   |500|center}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Video: Software Testing Mentor – Types of Software Testing. Englisch. Vergleiche Komponenten-, Integrations-, System- und Abnahmetests.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Lerneinheit 5: Dein lokales Python-Testlabor =&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Zeit: 20–30 Minuten&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Du brauchst Python 3 und einen lokalen Texteditor. Das Programm verwendet ausschließlich die Python-Standardbibliothek und verarbeitet nur selbst erzeugte Beispieldaten im Arbeitsspeicher.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Anleitung:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
# Erstelle lokal einen Ordner mit dem Namen &amp;lt;code&amp;gt;pausenkiosk&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Speichere den folgenden vollständigen Code als &amp;lt;code&amp;gt;bestelltests.py&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Starte im Ordner &amp;lt;code&amp;gt;python bestelltests.py&amp;lt;/code&amp;gt; oder, je nach Installation, &amp;lt;code&amp;gt;python3 bestelltests.py&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Starte die interaktive Sandbox mit &amp;lt;code&amp;gt;python bestelltests.py demo&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Unter Windows kann stattdessen der Befehl &amp;lt;code&amp;gt;py bestelltests.py&amp;lt;/code&amp;gt; verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Vollständiges Beispiel: sieben automatisierte Tests und eine lokale Sandbox&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
import unittest&lt;br /&gt;
&lt;br /&gt;
# Fachlogik&lt;br /&gt;
def positionswert(preis_cent, anzahl):&lt;br /&gt;
    if preis_cent &amp;lt;= 0 or anzahl &amp;lt;= 0:&lt;br /&gt;
        raise ValueError(&amp;quot;Ungueltiger Wert&amp;quot;)&lt;br /&gt;
    return preis_cent * anzahl&lt;br /&gt;
&lt;br /&gt;
class Lager:&lt;br /&gt;
    def __init__(self, bestand):&lt;br /&gt;
        if bestand &amp;lt; 0:&lt;br /&gt;
            raise ValueError(&amp;quot;Ungueltiger Bestand&amp;quot;)&lt;br /&gt;
        self.bestand = bestand&lt;br /&gt;
&lt;br /&gt;
    def reservieren(self, anzahl):&lt;br /&gt;
        if anzahl &amp;lt;= 0:&lt;br /&gt;
            raise ValueError(&amp;quot;Ungueltige Menge&amp;quot;)&lt;br /&gt;
        if anzahl &amp;gt; self.bestand:&lt;br /&gt;
            return False&lt;br /&gt;
        self.bestand -= anzahl&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
def bestellen(lager, anzahl, preis_cent=250):&lt;br /&gt;
    betrag = positionswert(preis_cent, anzahl)&lt;br /&gt;
    if not lager.reservieren(anzahl):&lt;br /&gt;
        return (&amp;quot;abgelehnt&amp;quot;, 0)&lt;br /&gt;
    return (&amp;quot;bestaetigt&amp;quot;, betrag)&lt;br /&gt;
&lt;br /&gt;
# Einheitstests&lt;br /&gt;
class Einheitstests(unittest.TestCase):&lt;br /&gt;
    def test_zwei_broetchen(self):&lt;br /&gt;
        self.assertEqual(positionswert(250, 2), 500)&lt;br /&gt;
&lt;br /&gt;
    def test_nullmenge(self):&lt;br /&gt;
        with self.assertRaises(ValueError):&lt;br /&gt;
            positionswert(250, 0)&lt;br /&gt;
&lt;br /&gt;
    def test_negativer_preis(self):&lt;br /&gt;
        with self.assertRaises(ValueError):&lt;br /&gt;
            positionswert(-1, 1)&lt;br /&gt;
&lt;br /&gt;
# Integrationstests&lt;br /&gt;
class Integrationstests(unittest.TestCase):&lt;br /&gt;
    def test_reservierung_und_preis(self):&lt;br /&gt;
        lager = Lager(3)&lt;br /&gt;
        self.assertEqual(&lt;br /&gt;
            bestellen(lager, 2),&lt;br /&gt;
            (&amp;quot;bestaetigt&amp;quot;, 500)&lt;br /&gt;
        )&lt;br /&gt;
        self.assertEqual(lager.bestand, 1)&lt;br /&gt;
&lt;br /&gt;
    def test_ablehnung_ohne_bestandsverlust(self):&lt;br /&gt;
        lager = Lager(1)&lt;br /&gt;
        self.assertEqual(&lt;br /&gt;
            bestellen(lager, 2),&lt;br /&gt;
            (&amp;quot;abgelehnt&amp;quot;, 0)&lt;br /&gt;
        )&lt;br /&gt;
        self.assertEqual(lager.bestand, 1)&lt;br /&gt;
&lt;br /&gt;
# Nutzungsfalltests&lt;br /&gt;
class Nutzungsfalltests(unittest.TestCase):&lt;br /&gt;
    def test_einkauf_in_schritten(self):&lt;br /&gt;
        lager = Lager(3)&lt;br /&gt;
        self.assertEqual(&lt;br /&gt;
            bestellen(lager, 2),&lt;br /&gt;
            (&amp;quot;bestaetigt&amp;quot;, 500)&lt;br /&gt;
        )&lt;br /&gt;
        self.assertEqual(&lt;br /&gt;
            bestellen(lager, 2),&lt;br /&gt;
            (&amp;quot;abgelehnt&amp;quot;, 0)&lt;br /&gt;
        )&lt;br /&gt;
        self.assertEqual(&lt;br /&gt;
            bestellen(lager, 1),&lt;br /&gt;
            (&amp;quot;bestaetigt&amp;quot;, 250)&lt;br /&gt;
        )&lt;br /&gt;
        self.assertEqual(lager.bestand, 0)&lt;br /&gt;
&lt;br /&gt;
    def test_ausverkauft(self):&lt;br /&gt;
        lager = Lager(0)&lt;br /&gt;
        self.assertEqual(&lt;br /&gt;
            bestellen(lager, 1),&lt;br /&gt;
            (&amp;quot;abgelehnt&amp;quot;, 0)&lt;br /&gt;
        )&lt;br /&gt;
        self.assertEqual(lager.bestand, 0)&lt;br /&gt;
&lt;br /&gt;
# Isolierte interaktive Testumgebung&lt;br /&gt;
def sandbox():&lt;br /&gt;
    lager = Lager(3)&lt;br /&gt;
    print(&amp;quot;Lokale Demo: Broetchen 250 Cent&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Startbestand:&amp;quot;, lager.bestand)&lt;br /&gt;
    while True:&lt;br /&gt;
        eingabe = input(&amp;quot;Menge oder q: &amp;quot;).strip()&lt;br /&gt;
        if eingabe.lower() == &amp;quot;q&amp;quot;:&lt;br /&gt;
            break&lt;br /&gt;
        try:&lt;br /&gt;
            menge = int(eingabe)&lt;br /&gt;
            print(&lt;br /&gt;
                &amp;quot;Ergebnis:&amp;quot;, bestellen(lager, menge),&lt;br /&gt;
                &amp;quot;Restbestand:&amp;quot;, lager.bestand&lt;br /&gt;
            )&lt;br /&gt;
        except ValueError:&lt;br /&gt;
            print(&amp;quot;Bitte eine positive ganze Zahl eingeben.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    if len(sys.argv) == 2 and sys.argv[1] == &amp;quot;demo&amp;quot;:&lt;br /&gt;
        sandbox()&lt;br /&gt;
    else:&lt;br /&gt;
        unittest.main(verbosity=2)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Die Sandbox ist isoliert:&amp;#039;&amp;#039;&amp;#039; Kein Netzwerkzugriff, keine Datenbank und keine Verbindung zu anderen Anwendungen. Nach einem Neustart beginnt der fiktive Lagerbestand wieder bei drei.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Experiment A: Alle Tests starten ==&lt;br /&gt;
&lt;br /&gt;
Führe &amp;lt;code&amp;gt;python bestelltests.py&amp;lt;/code&amp;gt; aus.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Erwartung:&amp;#039;&amp;#039;&amp;#039; Sieben Tests werden ausgeführt, alle erfolgreich. In der Zusammenfassung erscheint &amp;lt;code&amp;gt;Ran 7 tests&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;OK&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Testgruppe !! Anzahl !! Darstellung&lt;br /&gt;
|-&lt;br /&gt;
| Einheitstest || 3 || 🟩🟩🟩&lt;br /&gt;
|-&lt;br /&gt;
| Integrationstest || 2 || 🟩🟩&lt;br /&gt;
|-&lt;br /&gt;
| Nutzungsfalltest || 2 || 🟩🟩&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Gesamt&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;7&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;7 erfolgreiche Tests&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Diese Zahlen gelten nur für das bereitgestellte Beispiel. Die Anzahl erfolgreicher Tests ist weder eine Codeabdeckungsquote noch ein Beweis für vollständige Fehlerfreiheit.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Experiment B: Interaktive Sandbox ==&lt;br /&gt;
&lt;br /&gt;
Führe &amp;lt;code&amp;gt;python bestelltests.py demo&amp;lt;/code&amp;gt; aus.&lt;br /&gt;
&lt;br /&gt;
Gib nacheinander &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; ein.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Eingabe !! Erwartete Antwort !! Restbestand&lt;br /&gt;
|-&lt;br /&gt;
| 2 || bestaetigt, 500 Cent || 1&lt;br /&gt;
|-&lt;br /&gt;
| 2 || abgelehnt, 0 Cent || 1&lt;br /&gt;
|-&lt;br /&gt;
| 1 || bestaetigt, 250 Cent || 0&lt;br /&gt;
|-&lt;br /&gt;
| q || Simulation beendet || Keine weitere Bestellung&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Feedback:&amp;#039;&amp;#039;&amp;#039; Eine fehlgeschlagene Reservierung verändert den Bestand nicht. Das verhindert, dass nicht vorhandene Ware verkauft wird.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Experiment C: Fehler gezielt erkennen ==&lt;br /&gt;
&lt;br /&gt;
Ersetze &amp;#039;&amp;#039;&amp;#039;nur in Deiner lokalen Kopie&amp;#039;&amp;#039;&amp;#039; die Zeile&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
return preis_cent * anzahl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
durch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
return preis_cent + anzahl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Starte anschließend alle sieben Tests erneut.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Codeversion !! Erfolgreich !! Fehlgeschlagen !! Testbild&lt;br /&gt;
|-&lt;br /&gt;
| Original || 7 || 0 || 🟩🟩🟩🟩🟩🟩🟩&lt;br /&gt;
|-&lt;br /&gt;
| Absichtlich veränderte Berechnung || 4 || 3 || 🟩🟩🟩🟩🟥🟥🟥&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Legende: Grün bedeutet bestandener Test, Rot fehlgeschlagener Test. Die Ergebnisse beziehen sich auf die unveränderte Testsuite.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Begründetes Feedback:&amp;#039;&amp;#039;&amp;#039; Der direkte Preis-Einheitstest erkennt die falsche Rechenoperation. Ein Integrationstest und ein Nutzungsfalltest erkennen ebenfalls einen falschen Betrag. Andere Tests bleiben grün, weil ihre überprüften Eigenschaften durch diese Änderung nicht verletzt werden.&lt;br /&gt;
&lt;br /&gt;
Stelle danach die Multiplikation wieder her und überprüfe erneut alle Tests. Dies ist ein einfaches Beispiel für einen [[Regressionstest]].&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Gestufte Hilfen ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Stufe !! Hilfe&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Hilfe 1: Denkfrage&amp;#039;&amp;#039;&amp;#039; || Welcher Eingabewert ist für den Fehler besonders aussagekräftig?&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Hilfe 2: Testentwurf&amp;#039;&amp;#039;&amp;#039; || Vergleiche für Menge 2 die erwarteten 500 Cent mit dem tatsächlich berechneten Ergebnis.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Hilfe 3: Diagnose&amp;#039;&amp;#039;&amp;#039; || Bei einer Addition ergeben 250 und 2 den Wert 252 statt 500. Prüfe die Berechnungsoperation.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lernregel:&amp;#039;&amp;#039;&amp;#039; Nutze zunächst Hilfe 1. Hilfe 2 und Hilfe 3 sind für den Fall gedacht, dass Du selbst noch nicht weiterkommst.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Lerneinheit 6: Einen Testplan erstellen =&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Zeit: 10 Minuten&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Ein [[Testplan]] verbindet Anforderungen, Testobjekte, Daten und erwartete Ergebnisse.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID !! Anforderung !! Testebene oder Perspektive !! Testfall !! Erwartung&lt;br /&gt;
|-&lt;br /&gt;
| T1 || R1 || Einheit || Zwei Brötchen berechnen || 500 Cent&lt;br /&gt;
|-&lt;br /&gt;
| T2 || R4 || Einheit || Menge null übergeben || ValueError&lt;br /&gt;
|-&lt;br /&gt;
| T3 || R2 || Integration || Zwei Brötchen bei Bestand eins || Ablehnung, Bestand unverändert&lt;br /&gt;
|-&lt;br /&gt;
| T4 || R3 || Integration || Zwei Brötchen bei Bestand drei || 500 Cent, Bestand eins&lt;br /&gt;
|-&lt;br /&gt;
| T5 || R2 und R3 || Nutzungsfall || Mengenfolge zwei, zwei, eins || Bestätigung, Ablehnung, Bestätigung; Bestand null&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Qualitätsfrage:&amp;#039;&amp;#039;&amp;#039; Welche Anforderungen wurden geprüft und welche könnten noch zusätzliche Tests benötigen?&lt;br /&gt;
&lt;br /&gt;
Beachte insbesondere fehlende Testfälle, Änderungen an Preisen, größere Bestellmengen und unzulässige Eingabedatentypen. Das vereinfachte Ausbildungsprogramm ist keine vollständige Produktionsanwendung.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Interaktive Aufgaben =&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Quiz: Teste Dein Wissen ==&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Welcher Test prüft eine einzelne Funktion möglichst isoliert?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Einheitstest)&lt;br /&gt;
(!Systemintegrationstest)&lt;br /&gt;
(!Nutzungsfalltest)&lt;br /&gt;
(!Abnahmetest)&lt;br /&gt;
&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Was ist das hauptsächliche Ziel eines Integrationstests?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Das Zusammenspiel von Komponenten prüfen)&lt;br /&gt;
(!Nur die Gestaltung einer Benutzeroberfläche bewerten)&lt;br /&gt;
(!Den gesamten Quellcode automatisch verbessern)&lt;br /&gt;
(!Eine Benutzerbefragung durchführen)&lt;br /&gt;
&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Welche Aussage zu einem Nutzungsfalltest ist fachlich richtig?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Er prüft einen Ablauf aus Anwendersicht)&lt;br /&gt;
(!Er ist immer eine eigenständige formale Teststufe)&lt;br /&gt;
(!Er darf keine Fehlerfälle berücksichtigen)&lt;br /&gt;
(!Er überprüft nur einzelne Variablen)&lt;br /&gt;
&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Welches Ergebnis liefern zwei Brötchen zu jeweils 250 Cent?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(500 Cent)&lt;br /&gt;
(!252 Cent)&lt;br /&gt;
(!125 Cent)&lt;br /&gt;
(!750 Cent)&lt;br /&gt;
&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Was muss bei einer Bestellung über dem vorhandenen Lagerbestand passieren?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Die Bestellung wird abgelehnt und der Bestand bleibt unverändert)&lt;br /&gt;
(!Der Lagerbestand wird negativ)&lt;br /&gt;
(!Die Bestellung wird trotzdem bestätigt)&lt;br /&gt;
(!Der Lagerbestand wird automatisch verdoppelt)&lt;br /&gt;
&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Wofür wird assertRaises bei Python unittest verwendet?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Zum Prüfen einer erwarteten Ausnahme)&lt;br /&gt;
(!Zum Starten eines Webservers)&lt;br /&gt;
(!Zum dauerhaften Speichern von Kundendaten)&lt;br /&gt;
(!Zum Ändern des Betriebssystems)&lt;br /&gt;
&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Welche Testumgebung ist für diesen Ausbildungskurs vorgesehen?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Eine lokale Sandbox mit fiktiven Daten)&lt;br /&gt;
(!Eine fremde Produktionsdatenbank)&lt;br /&gt;
(!Ein öffentlich erreichbarer Unternehmensserver ohne Freigabe)&lt;br /&gt;
(!Ein unbekannter Internetdienst mit echten Kundendaten)&lt;br /&gt;
&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Wann ist ein Regressionstest besonders sinnvoll?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Nach einer Änderung an der Software)&lt;br /&gt;
(!Nur vor dem ersten Schreiben von Quellcode)&lt;br /&gt;
(!Ausschließlich vor der Projektidee)&lt;br /&gt;
(!Nur wenn keinerlei Testfälle existieren)&lt;br /&gt;
&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Was zeigt ein erfolgreicher Lauf aller sieben Beispieltests?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Die sieben überprüften Fälle haben bestanden)&lt;br /&gt;
(!Das Programm kann keine weiteren Fehler besitzen)&lt;br /&gt;
(!Alle Qualitätsanforderungen sind vollständig erfüllt)&lt;br /&gt;
(!Ein Abnahmetest ist grundsätzlich unnötig)&lt;br /&gt;
&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Welche Aussage beschreibt ein geeignetes Testorakel?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Es legt fest welches Ergebnis erwartet wird)&lt;br /&gt;
(!Es ersetzt automatisch jede Anforderung)&lt;br /&gt;
(!Es verhindert jede spätere Programmänderung)&lt;br /&gt;
(!Es führt alle Tests ohne Programmcode aus)&lt;br /&gt;
&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Memory ==&lt;br /&gt;
&lt;br /&gt;
Finde die passenden Fachbegriffe und Bedeutungen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;memo-quiz&amp;quot;&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| Einheitstest || Isolierte Prüfung einer kleinen Codeeinheit&lt;br /&gt;
|-&lt;br /&gt;
| Integrationstest || Prüfung des Zusammenspiels mehrerer Komponenten&lt;br /&gt;
|-&lt;br /&gt;
| Nutzungsfalltest || Prüfung eines fachlichen Anwenderablaufs&lt;br /&gt;
|-&lt;br /&gt;
| Testorakel || Festlegung des erwarteten Ergebnisses&lt;br /&gt;
|-&lt;br /&gt;
| Testdaten || Vorgegebene Werte für einen Testfall&lt;br /&gt;
|-&lt;br /&gt;
| Regressionstest || Erneute Prüfung nach einer Softwareänderung&lt;br /&gt;
|-&lt;br /&gt;
| Sandbox || Abgegrenzte Umgebung für sichere Experimente&lt;br /&gt;
|}&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Drag and Drop ==&lt;br /&gt;
&lt;br /&gt;
Ordne den Fachbegriffen ihre jeweilige Aufgabe zu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;lueckentext-quiz&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ordne die richtigen Begriffe zu.&lt;br /&gt;
! Aufgabe&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Einheitstest&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Eine einzelne Berechnungsfunktion isoliert kontrollieren&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Integrationstest&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Preisberechnung und Lagerreservierung gemeinsam prüfen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Nutzungsfalltest&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Den vollständigen Ablauf einer fiktiven Bestellung verfolgen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Negativtest&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Eine Bestellung mit unzulässiger Menge zurückweisen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Regressionstest&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Nach einer Fehlerkorrektur vorherige Testfälle wiederholen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Testorakel&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Erwartete Ausgabe und erwarteten Zustand festlegen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Kreuzworträtsel ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;kreuzwort-quiz&amp;quot;&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| Modultest || Wie heißt ein Test für eine einzelne abgegrenzte Programmeinheit?&lt;br /&gt;
|-&lt;br /&gt;
| Integration || Wie heißt das Zusammenführen von Komponenten zur gemeinsamen Nutzung?&lt;br /&gt;
|-&lt;br /&gt;
| Nutzungsfall || Wie heißt ein fachlicher Ablauf aus Anwendersicht?&lt;br /&gt;
|-&lt;br /&gt;
| Testorakel || Wie heißt die Grundlage für die erwartete Testentscheidung?&lt;br /&gt;
|-&lt;br /&gt;
| Regression || Wie heißt die Prüfung gegen unerwünschte Auswirkungen einer Änderung?&lt;br /&gt;
|-&lt;br /&gt;
| Sandbox || Wie heißt eine abgegrenzte Umgebung für sichere Experimente?&lt;br /&gt;
|}&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== LearningApps ==&lt;br /&gt;
&lt;br /&gt;
Hier kannst Du nach ergänzenden Übungen zum Kursthema suchen. Externe Aktivitäten nur nach Freigabe öffnen; keine echten Betriebsdaten verwenden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iframe&amp;gt; https://learningapps.org/index.php?s=Anwendungsentwicklung+und+Softwarequalit%C3%A4t+%E2%80%93+Testebenen+f%C3%BCr+Software+planen &amp;lt;/iframe&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Lückentext ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;quiz display=simple&amp;gt;&lt;br /&gt;
{&amp;#039;&amp;#039;&amp;#039;Vervollständige den Text.&amp;#039;&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
|type=&amp;quot;{}&amp;quot;}&lt;br /&gt;
Eine kleine, möglichst isolierte Softwareeinheit überprüfst Du mit einem { Einheitstest } .&lt;br /&gt;
Die Zusammenarbeit von Komponenten wird durch einen { Integrationstest } untersucht.&lt;br /&gt;
Ein vollständiger Ablauf aus Anwendersicht heißt { Nutzungsfall } .&lt;br /&gt;
Im PausenKiosk kostet ein Brötchen 250 { Cent } .&lt;br /&gt;
Der noch verfügbare Warenvorrat heißt { Lagerbestand } .&lt;br /&gt;
Bei einer ungültigen Menge löst das Beispiel eine { ValueError } aus.&lt;br /&gt;
Die Python-Standardbibliothek enthält das Testframework { unittest } .&lt;br /&gt;
Die Methode zur Überprüfung von Gleichheit heißt { assertEqual } .&lt;br /&gt;
Eine wiederholte Prüfung nach Codeänderungen ist ein { Regressionstest } .&lt;br /&gt;
Die Festlegung der erwarteten Ergebnisse wird als { Testorakel } bezeichnet.&lt;br /&gt;
Eine getrennte Umgebung für gefahrlose Experimente heißt { Sandbox } .&lt;br /&gt;
Ein erfolgreich abgeschlossener Test beweist nicht die vollständige { Fehlerfreiheit } .&lt;br /&gt;
&amp;lt;/quiz&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Offene Aufgaben =&lt;br /&gt;
&lt;br /&gt;
Bearbeite die Aufgaben in Deinem Tempo. Die Niveaustufen entsprechen &amp;#039;&amp;#039;&amp;#039;Basis&amp;#039;&amp;#039;&amp;#039; (Leicht), &amp;#039;&amp;#039;&amp;#039;Anwendung&amp;#039;&amp;#039;&amp;#039; (Standard) und &amp;#039;&amp;#039;&amp;#039;Transfer&amp;#039;&amp;#039;&amp;#039; (Schwer).&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
=== Leicht ===&lt;br /&gt;
&lt;br /&gt;
# [[Testpyramide|Testpyramide zeichnen]]: Gestalte eine beschriftete Testpyramide mit Einheitstest, Integrationstest und End-to-End-Test. Erkläre ihre Aussage und eine Grenze der Darstellung.&lt;br /&gt;
# [[Testfall|Testfälle beschreiben]]: Formuliere drei Eingaben und ihre erwarteten Ausgaben für die Preisfunktion.&lt;br /&gt;
# [[Testautomatisierung|Tests untersuchen]]: Markiere im Python-Beispiel die drei Testgruppen und erläutere ihre unterschiedlichen Ziele.&lt;br /&gt;
# [[Sandbox|Sandbox erproben]]: Probiere die Mengen eins, drei und vier lokal aus. Halte für jeden Versuch die Antwort und den Restbestand fest.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Feedback zur Basisstufe:&amp;#039;&amp;#039;&amp;#039; Entscheidend sind richtige Zuordnungen und überprüfbare Erwartungen. Aussagen wie „funktioniert“ reichen ohne konkrete Sollwerte nicht aus.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
=== Standard ===&lt;br /&gt;
&lt;br /&gt;
# [[Grenzwertanalyse|Grenzwerttests entwerfen]]: Ergänze Tests für die Mengen null, eins, drei und vier. Begründe, warum gerade diese Werte wichtig sind.&lt;br /&gt;
# [[Fehleranalyse|Fehlerexperiment dokumentieren]]: Ersetze lokal die Multiplikation durch eine Addition. Erstelle eine Tabelle mit fehlgeschlagenen Tests, Ursache und Korrektur.&lt;br /&gt;
# [[Testplanung|Testplan erweitern]]: Erstelle eine Anforderungs-Test-Matrix. Ergänze zu jedem Testobjekt Eingabe, erwartete Ausgabe und erwartete Zustandsänderung.&lt;br /&gt;
# [[Bildschirmaufnahme|Lernvideo erstellen]]: Produziere ein kurzes Video Deiner lokalen Sandbox mit einer erfolgreichen und einer abgelehnten fiktiven Bestellung. Zeige ausschließlich Demo-Daten.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Feedback zur Anwendungsstufe:&amp;#039;&amp;#039;&amp;#039; Ein vollständiger Testfall dokumentiert Ausgangszustand, Handlung und erwartetes Ergebnis. Eine nachvollziehbare Fehlerursache ist wertvoller als die bloße Feststellung eines Fehlers.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
=== Schwer ===&lt;br /&gt;
&lt;br /&gt;
# [[Teststrategie|Risikobasierte Teststrategie]]: Du hast nur zehn Minuten Testzeit. Begründe, welche Tests Du zuerst ausführst und welche Risiken dadurch noch nicht abgedeckt sind.&lt;br /&gt;
# [[Mock-Objekt|Externe Zahlung simulieren]]: Entwirf einen lokalen Speicher-Dummy für eine fiktive Bezahlbestätigung. Beschreibe, wie er in einem Integrationstest eingesetzt werden könnte, ohne einen Zahlungsdienst aufzurufen.&lt;br /&gt;
# [[Softwareanforderung|Neue Geschäftsregel]]: Erweitere eine lokale Kopie des Programms um einen selbst festgelegten Mengenrabatt. Formuliere neue Tests und erkläre, welche bisherigen Tests wegen der Regeländerung angepasst werden müssen.&lt;br /&gt;
# [[Qualitätssicherung|Testkonzept verteidigen]]: Erstelle ein kurzes Testkonzept und präsentiere es einem Lernpartner. Begründe Teststufen, Daten, Zuständigkeiten, Risiken und Freigabekriterien. Überarbeite es nach dem Feedback.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Feedback zur Transferstufe:&amp;#039;&amp;#039;&amp;#039; Gute Lösungen machen Annahmen transparent, priorisieren Risiken und erklären die Grenzen der eigenen Tests. Eine größere Testanzahl ist nicht automatisch eine bessere Teststrategie.&lt;br /&gt;
&lt;br /&gt;
{{:Offene Aufgabe - MOOC erstellen}}&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Lernkontrolle =&lt;br /&gt;
&lt;br /&gt;
Bearbeite mindestens fünf der folgenden Aufgaben schriftlich und begründe Deine Entscheidungen.&lt;br /&gt;
&lt;br /&gt;
# [[Fehlerlokalisierung]]: Alle Einheitstests sind erfolgreich, aber die Bestandsänderung ist falsch. Welche Testperspektive hilft Dir bei der Eingrenzung? Begründe die Wahl.&lt;br /&gt;
# [[Änderungsfolgenanalyse]]: Der Stückpreis erhöht sich von 250 auf 300 Cent. Welche Tests müssen angepasst werden und welche unverändert bleiben? Unterscheide fachliche Änderungen von Fehlern.&lt;br /&gt;
# [[Testfallentwurf]]: Eine Person möchte vier Brötchen kaufen, obwohl nur drei vorhanden sind. Entwirf einen Test mit Ausgangszustand, Eingabe und erwartetem Zustand.&lt;br /&gt;
# [[Testpriorisierung]]: Ein Team kann vor einer Vorführung nur zwei Tests durchführen. Begründe anhand des Risikos, welche Tests Du auswählen würdest.&lt;br /&gt;
# [[Testumgebung]]: Ein Teammitglied möchte statt der Sandbox eine echte Produktivdatenbank verwenden. Entwickle eine sichere Alternative und begründe Deine Entscheidung.&lt;br /&gt;
# [[Qualitätsurteil]]: Sieben automatisierte Tests sind grün. Erkläre, weshalb dennoch weitere Prüfungen nötig sein können und welches zusätzliche Testziel Du vorschlägst.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beurteilung:&amp;#039;&amp;#039;&amp;#039; Achte auf fachlich korrekte Begriffe, begründete Entscheidungen, erkennbare Zusammenhänge und praktikable sichere Lösungen.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Lernnachweis =&lt;br /&gt;
&lt;br /&gt;
Zum Abschluss reichst Du ein kleines &amp;#039;&amp;#039;&amp;#039;Testportfolio&amp;#039;&amp;#039;&amp;#039; ein.&lt;br /&gt;
&lt;br /&gt;
Es enthält:&lt;br /&gt;
# Einen Testplan mit Anforderungen und zugeordneten Testfällen.&lt;br /&gt;
# Eine Beschreibung der Unterschiede zwischen Einheitstest, Integrationstest und Nutzungsfallprüfung.&lt;br /&gt;
# Den lokal ausführbaren Python-Code mit mindestens sieben dokumentierten Tests.&lt;br /&gt;
# Ein Testprotokoll mit Eingabe, Sollwert, Istwert und Ergebnis.&lt;br /&gt;
# Eine Fehleranalyse des absichtlich veränderten Programms.&lt;br /&gt;
# Eine Begründung der Testpriorisierung und der Grenzen Deiner Testabdeckung.&lt;br /&gt;
# Eine Erklärung Deiner Maßnahmen zur Datensicherheit und Isolation.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bewertungskriterium !! Gewichtung&lt;br /&gt;
|-&lt;br /&gt;
| Fachliche Zuordnung der Tests || 20 %&lt;br /&gt;
|-&lt;br /&gt;
| Ausführbarkeit und Qualität der Testfälle || 30 %&lt;br /&gt;
|-&lt;br /&gt;
| Nachvollziehbarkeit von Ergebnissen und Fehleranalyse || 25 %&lt;br /&gt;
|-&lt;br /&gt;
| Begründete Transferleistung || 15 %&lt;br /&gt;
|-&lt;br /&gt;
| Dokumentation und sicheres Arbeiten || 10 %&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Erfolgsmerkmal:&amp;#039;&amp;#039;&amp;#039; Du kannst nicht nur Tests ausführen, sondern begründen, was ein Test überprüft, welche Aussage sein Ergebnis erlaubt und welche Risiken offenbleiben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= OERs zum Thema =&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Wikipedia-Grundlagen:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iframe&amp;gt; https://de.m.wikipedia.org/wiki/Softwaretest &amp;lt;/iframe&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Artikel:&lt;br /&gt;
# [[Softwaretest]]&lt;br /&gt;
# [[Modultest]]&lt;br /&gt;
# [[Integrationstest]]&lt;br /&gt;
# [[Systemtest]]&lt;br /&gt;
# [[Abnahmetest]]&lt;br /&gt;
# [[Testgetriebene Entwicklung]]&lt;br /&gt;
# [[Testautomatisierung]]&lt;br /&gt;
# [[Anwendungsfall]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Verifizierte fachliche Quellen:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
# [https://istqb.org/wp-content/uploads/2024/11/ISTQB_CTFL_Syllabus_v4.0.1.pdf ISTQB Certified Tester Foundation Level Syllabus, Version 4.0.1] – Teststufen, Testarten, Testplanung und Testdesign. Offizielle fachliche Referenz.&lt;br /&gt;
# [https://docs.python.org/3/library/unittest.html Python-Dokumentation: unittest] – Offizielle Dokumentation des verwendeten Testframeworks.&lt;br /&gt;
# [https://de.wikipedia.org/wiki/Softwaretest Wikipedia: Softwaretest] – Überblick über Testziele und Teststufen.&lt;br /&gt;
# [https://de.wikipedia.org/wiki/Integrationstest Wikipedia: Integrationstest] – Zusammenspiel von Komponenten und Integrationsstrategien.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Nachweise der verwendeten Bildmedien und Nutzungsrechte:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
# [https://commons.wikimedia.org/wiki/File:Testing_Pyramid.svg Testing Pyramid.svg] – Abbe98, Creative Commons BY-SA 4.0.&lt;br /&gt;
# [https://commons.wikimedia.org/wiki/File:V-Modell.svg V-Modell.svg] – Michael Pätzold und S. Seyfert, Creative Commons BY-SA 3.0.&lt;br /&gt;
# [https://commons.wikimedia.org/wiki/File:Tdd-abstract.png Tdd-abstract.png] – Kristijan Kralj, CC0 1.0.&lt;br /&gt;
# [https://commons.wikimedia.org/wiki/File:UML_Use_Case_diagram.svg UML Use Case diagram.svg] – Slashme, Creative Commons BY-SA 4.0.&lt;br /&gt;
&lt;br /&gt;
Bei einer Weiterverwendung gelten die jeweils angegebenen Lizenzbedingungen, einschließlich Namensnennung und gegebenenfalls Weitergabe unter gleichen Bedingungen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Videoquellen:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
# [https://www.youtube.com/watch?v=TLccnKIMggA Lucas Paganini – Static, Unit, Integration, and End-to-End Tests Explained]&lt;br /&gt;
# [https://www.youtube.com/watch?v=6tNS--WetLI Corey Schafer – Python Tutorial: Unit Testing Your Code with the unittest Module]&lt;br /&gt;
# [https://www.youtube.com/watch?v=YdZ-sduNb48 Software Testing Mentor – Types of Software Testing]&lt;br /&gt;
&lt;br /&gt;
Die Videos sind als Links beziehungsweise offizielle YouTube-Einbettungen eingebunden. Ihre öffentliche Zugänglichkeit bedeutet nicht, dass sie unter einer freien OER-Lizenz stehen. Eine Bearbeitung oder Weiterveröffentlichung benötigt die entsprechenden Nutzungsrechte.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Quellenstand:&amp;#039;&amp;#039;&amp;#039; Oktober 2026. Testbegriffe wurden insbesondere anhand des ISTQB-Lehrplans 4.0.1 abgeglichen. Verfügbarkeit externer Medien und die Einbindung über YouTube, Wikimedia Commons oder iFrames können sich ändern.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Verknüpfte Lernbereiche =&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
{{:D-Tab}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;[[Softwaretest]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# [[Komponententest]]&lt;br /&gt;
# [[Integrationstest]]&lt;br /&gt;
# [[Systemtest]]&lt;br /&gt;
# [[Abnahmetest]]&lt;br /&gt;
# [[Testautomatisierung]]&lt;br /&gt;
# [[Regressionstest]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
{{:D-Tab}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;[[Anwendungsentwicklung]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# [[Python (Programmiersprache)|Python]]&lt;br /&gt;
# [[Unittest]]&lt;br /&gt;
# [[Softwareanforderung]]&lt;br /&gt;
# [[Anwendungsfall]]&lt;br /&gt;
# [[Softwarequalität]]&lt;br /&gt;
# [[Fehlerbehandlung]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
{{:D-Tab}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;[[Qualitätssicherung]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# [[Testplanung]]&lt;br /&gt;
# [[Testfall]]&lt;br /&gt;
# [[Grenzwertanalyse]]&lt;br /&gt;
# [[Testumgebung]]&lt;br /&gt;
# [[Risikomanagement]]&lt;br /&gt;
# [[Softwaredokumentation]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Softwareentwicklung]]&lt;br /&gt;
[[Kategorie:Softwaretest]]&lt;br /&gt;
[[Kategorie:Softwarequalität]]&lt;br /&gt;
[[Kategorie:Programmierung]]&lt;br /&gt;
[[Kategorie:Python]]&lt;br /&gt;
[[Kategorie:Berufsausbildung]]&lt;br /&gt;
[[Kategorie:Fachinformatiker Anwendungsentwicklung]]&lt;br /&gt;
[[Kategorie:Qualitätssicherung]]&lt;br /&gt;
[[Kategorie:OER]]&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= aiMOOC-Projekte =&lt;br /&gt;
[[Kategorie:AI_MOOC]] [[Kategorie:GPT aiMOOC]]&lt;br /&gt;
{{MT}}&lt;/div&gt;</summary>
		<author><name>Glanz</name></author>
	</entry>
</feed>