ÜbungBaut auf Katas: Suchen auf
icon: bi-check2-square kind: uebung duration: 1 Doppelstunde languages: [ruby, python, javascript] idea: Tests schreiben, die jeden Fehler finden curriculum: "Oberstufe: Softwareprojekt (systematische Softwareentwicklung: Testen)" requires: [kata-search]

Katas: Tests schreiben

Diesmal schreibst du keine Funktionen, sondern Tests für sie. Die Prüfung hat jeweils eine richtige Fassung und einige fehlerhafte: Deine Tests müssen mit der richtigen bestehen und jede fehlerhafte entlarven.

1. Ein Test ist eine Behauptung

Ein Test sagt, was eine Funktion für einen bestimmten Wert zurückgeben soll, und meldet sich, wenn sie etwas anderes tut:

assert_equal(12, gcd(60, 48))    # erwartet 12
assert_equal(7, gcd(7, 7))
assert_equal(12, gcd(60, 48))    # erwartet 12
assert_equal(7, gcd(7, 7))
assertEqual(12, gcd(60, 48));    // erwartet 12
assertEqual(7, gcd(7, 7));

Zuerst steht, was herauskommen soll, dann der Aufruf. Ein guter Test sucht die Stellen, an denen Fehler wohnen: die Ränder (0, eine leere Liste, das erste und das letzte Element), die Fälle, in denen eine Regel eine Ausnahme hat, und Werte, die nicht ganz gewöhnlich sind (negative Zahlen, zwei gleiche). Ein Test, der nur das Erwartbare prüft, besteht auch mit vielen fehlerhaften Fassungen.

Die Prüfung bringt die Funktion selbst mit; schreib sie nicht hinein, nur die Tests. Meldet die Prüfung, dass eine fehlerhafte Fassung besteht, sagt sie auch, was diese Fassung anders macht.

2. Einstieg

Aufgabe 1Tests für gerade ZahlenEinstieg

even(n) soll true zurückgeben, wenn n gerade ist, und sonst false. Schreib Tests, die jede falsche Fassung entlarven: Die Prüfung hat eine richtige und drei, die sich in verschiedenen Fällen irren. Ein Test ist eine Zeile assert_equal(erwartet, ergebnis); der erste steht schon da. Denk an die 0 und an negative Zahlen.

Tipp

Was macht jede der falschen Fassungen anders? Sie irren sich bei ungeraden Zahlen, bei 0 und negativen Zahlen, oder bei großen Zahlen.

Nächster Tipp

Für jede Art von Zahl ein Test: eine ungerade, die 0, eine negative gerade, eine große gerade.

Aufgabe 1Tests für gerade ZahlenEinstieg

even(n) soll True zurückgeben, wenn n gerade ist, und sonst False. Schreib Tests, die jede falsche Fassung entlarven: Die Prüfung hat eine richtige und drei, die sich in verschiedenen Fällen irren. Ein Test ist eine Zeile assert_equal(erwartet, ergebnis); der erste steht schon da. Denk an die 0 und an negative Zahlen.

Tipp

Was macht jede der falschen Fassungen anders? Sie irren sich bei ungeraden Zahlen, bei 0 und negativen Zahlen, oder bei großen Zahlen.

Nächster Tipp

Für jede Art von Zahl ein Test: eine ungerade, die 0, eine negative gerade, eine große gerade.

Aufgabe 1Tests für gerade ZahlenEinstieg

even(n) soll true zurückgeben, wenn n gerade ist, und sonst false. Schreib Tests, die jede falsche Fassung entlarven: Die Prüfung hat eine richtige und drei, die sich in verschiedenen Fällen irren. Ein Test ist eine Zeile assertEqual(erwartet, ergebnis); der erste steht schon da. Denk an die 0 und an negative Zahlen.

Tipp

Was macht jede der falschen Fassungen anders? Sie irren sich bei ungeraden Zahlen, bei 0 und negativen Zahlen, oder bei großen Zahlen.

Nächster Tipp

Für jede Art von Zahl ein Test: eine ungerade, die 0, eine negative gerade, eine große gerade.

Aufgabe 2Tests für die größere ZahlEinstieg

max_of_two(a, b) soll die größere der beiden Zahlen zurückgeben. Schreib Tests, die jede falsche Fassung entlarven; die Prüfung hat drei. Denk daran, in welcher Reihenfolge die Zahlen kommen können.

Tipp

Eine Fassung gibt immer die erste Zahl zurück, eine immer die zweite. Wie viele Tests brauchst du, um beide zu erwischen?

Aufgabe 2Tests für die größere ZahlEinstieg

max_of_two(a, b) soll die größere der beiden Zahlen zurückgeben. Schreib Tests, die jede falsche Fassung entlarven; die Prüfung hat drei. Denk daran, in welcher Reihenfolge die Zahlen kommen können.

Tipp

Eine Fassung gibt immer die erste Zahl zurück, eine immer die zweite. Wie viele Tests brauchst du, um beide zu erwischen?

Aufgabe 2Tests für die größere ZahlEinstieg

maxOfTwo(a, b) soll die größere der beiden Zahlen zurückgeben. Schreib Tests, die jede falsche Fassung entlarven; die Prüfung hat drei. Denk daran, in welcher Reihenfolge die Zahlen kommen können.

Tipp

Eine Fassung gibt immer die erste Zahl zurück, eine immer die zweite. Wie viele Tests brauchst du, um beide zu erwischen?

Aufgabe 3Tests für den BetragEinstieg

absolute(n) soll den Betrag von n zurückgeben: die Zahl ohne ihr Minus, absolute(-5) ergibt 5. Schreib Tests, die jede der drei falschen Fassungen entlarven.

Tipp

Welche Arten von Zahlen gibt es für den Betrag? Negative, positive und die 0.

Aufgabe 3Tests für den BetragEinstieg

absolute(n) soll den Betrag von n zurückgeben: die Zahl ohne ihr Minus, absolute(-5) ergibt 5. Schreib Tests, die jede der drei falschen Fassungen entlarven.

Tipp

Welche Arten von Zahlen gibt es für den Betrag? Negative, positive und die 0.

Aufgabe 3Tests für den BetragEinstieg

absolute(n) soll den Betrag von n zurückgeben: die Zahl ohne ihr Minus, absolute(-5) ergibt 5. Schreib Tests, die jede der drei falschen Fassungen entlarven.

Tipp

Welche Arten von Zahlen gibt es für den Betrag? Negative, positive und die 0.

3. Übung

Aufgabe 4Tests für SchaltjahreÜbung

leap_year(year) soll sagen, ob ein Jahr ein Schaltjahr ist: Durch 4 teilbare Jahre sind es, außer die durch 100 teilbaren, außer wieder die durch 400 teilbaren. 2024 ist eins, 1900 nicht, 2000 schon. Schreib Tests, die jede der drei falschen Fassungen entlarven.

Tipp

Die Regel hat drei Teile. Für jeden Teil ein Jahr, an dem man sieht, ob er beachtet wird: eins durch 4, eins durch 100, eins durch 400.

Aufgabe 4Tests für SchaltjahreÜbung

leap_year(year) soll sagen, ob ein Jahr ein Schaltjahr ist: Durch 4 teilbare Jahre sind es, außer die durch 100 teilbaren, außer wieder die durch 400 teilbaren. 2024 ist eins, 1900 nicht, 2000 schon. Schreib Tests, die jede der drei falschen Fassungen entlarven.

Tipp

Die Regel hat drei Teile. Für jeden Teil ein Jahr, an dem man sieht, ob er beachtet wird: eins durch 4, eins durch 100, eins durch 400.

Aufgabe 4Tests für SchaltjahreÜbung

leapYear(year) soll sagen, ob ein Jahr ein Schaltjahr ist: Durch 4 teilbare Jahre sind es, außer die durch 100 teilbaren, außer wieder die durch 400 teilbaren. 2024 ist eins, 1900 nicht, 2000 schon. Schreib Tests, die jede der drei falschen Fassungen entlarven.

Tipp

Die Regel hat drei Teile. Für jeden Teil ein Jahr, an dem man sieht, ob er beachtet wird: eins durch 4, eins durch 100, eins durch 400.

Aufgabe 5Tests für die AdresseÜbung

slug(text) soll aus einem Titel eine Adresse machen, wie in den Texten: klein, nur Buchstaben von a bis z und Ziffern, die Wörter mit - verbunden. slug('Hello World!') ergibt 'hello-world'. Schreib Tests, die jede der drei falschen Fassungen entlarven.

Tipp

Jede falsche Fassung vergisst etwas anderes: groß und klein, Satzzeichen, mehrere Leerzeichen. Ein Titel, in dem alles vorkommt, kann mehrere auf einmal erwischen.

Aufgabe 5Tests für die AdresseÜbung

slug(text) soll aus einem Titel eine Adresse machen, wie in den Texten: klein, nur Buchstaben von a bis z und Ziffern, die Wörter mit - verbunden. slug('Hello World!') ergibt 'hello-world'. Schreib Tests, die jede der drei falschen Fassungen entlarven.

Tipp

Jede falsche Fassung vergisst etwas anderes: groß und klein, Satzzeichen, mehrere Leerzeichen. Ein Titel, in dem alles vorkommt, kann mehrere auf einmal erwischen.

Aufgabe 5Tests für die AdresseÜbung

slug(text) soll aus einem Titel eine Adresse machen, wie in den Texten: klein, nur Buchstaben von a bis z und Ziffern, die Wörter mit - verbunden. slug('Hello World!') ergibt 'hello-world'. Schreib Tests, die jede der drei falschen Fassungen entlarven.

Tipp

Jede falsche Fassung vergisst etwas anderes: groß und klein, Satzzeichen, mehrere Leerzeichen. Ein Titel, in dem alles vorkommt, kann mehrere auf einmal erwischen.

Aufgabe 6Tests für FizzBuzzÜbung

fizzbuzz(n) soll für FizzBuzz zurückgeben, was man bei n sagt, als Text: 'Fizz' bei durch 3 teilbaren, 'Buzz' bei durch 5 teilbaren, 'FizzBuzz' bei durch beide teilbaren, sonst die Zahl als Text. Schreib Tests, die jede der drei falschen Fassungen entlarven.

Tipp

Vier Arten von Zahlen, vier Antworten. Welche davon prüfst du schon?

Aufgabe 6Tests für FizzBuzzÜbung

fizzbuzz(n) soll für FizzBuzz zurückgeben, was man bei n sagt, als Text: 'Fizz' bei durch 3 teilbaren, 'Buzz' bei durch 5 teilbaren, 'FizzBuzz' bei durch beide teilbaren, sonst die Zahl als Text. Schreib Tests, die jede der drei falschen Fassungen entlarven.

Tipp

Vier Arten von Zahlen, vier Antworten. Welche davon prüfst du schon?

Aufgabe 6Tests für FizzBuzzÜbung

fizzbuzz(n) soll für FizzBuzz zurückgeben, was man bei n sagt, als Text: 'Fizz' bei durch 3 teilbaren, 'Buzz' bei durch 5 teilbaren, 'FizzBuzz' bei durch beide teilbaren, sonst die Zahl als Text. Schreib Tests, die jede der drei falschen Fassungen entlarven.

Tipp

Vier Arten von Zahlen, vier Antworten. Welche davon prüfst du schon?

4. Knobelei

Aufgabe 7Tests für die binäre SucheKnobelei

binary_search(numbers, wanted) soll in einer aufsteigend sortierten Liste verschiedener Zahlen den Index von wanted zurückgeben, und None, wenn die Zahl nicht darin steht. Schreib Tests, die jede der drei falschen Fassungen entlarven. Die Fehler stecken in den Rändern.

Tipp

Fehler in einer Suche stecken an den Rändern: die erste Zahl, die letzte, eine Liste mit nur einer Zahl, eine Zahl, die fehlt.

Aufgabe 7Tests für die binäre SucheKnobelei

binarySearch(numbers, wanted) soll in einer aufsteigend sortierten Liste verschiedener Zahlen den Index von wanted zurückgeben, und null, wenn die Zahl nicht darin steht. Schreib Tests, die jede der drei falschen Fassungen entlarven. Die Fehler stecken in den Rändern.

Tipp

Fehler in einer Suche stecken an den Rändern: die erste Zahl, die letzte, eine Liste mit nur einer Zahl, eine Zahl, die fehlt.

Aufgabe 8Tests fürs MischenKnobelei

merge_sorted(a, b) soll zwei aufsteigend sortierte Listen zu einer sortierten mischen, wie in den Listen: merge_sorted([1, 4], [2, 3]) ergibt [1, 2, 3, 4]. Schreib Tests, die jede der drei falschen Fassungen entlarven.

Tipp

Jede falsche Fassung scheitert an einer anderen Art von Listen: verschieden lang, ineinander verschränkt, mit einer Zahl in beiden. Ein Test mit allem zugleich erwischt mehrere.

Aufgabe 8Tests fürs MischenKnobelei

merge_sorted(a, b) soll zwei aufsteigend sortierte Listen zu einer sortierten mischen, wie in den Listen: merge_sorted([1, 4], [2, 3]) ergibt [1, 2, 3, 4]. Schreib Tests, die jede der drei falschen Fassungen entlarven.

Tipp

Jede falsche Fassung scheitert an einer anderen Art von Listen: verschieden lang, ineinander verschränkt, mit einer Zahl in beiden. Ein Test mit allem zugleich erwischt mehrere.

Aufgabe 8Tests fürs MischenKnobelei

mergeSorted(a, b) soll zwei aufsteigend sortierte Listen zu einer sortierten mischen, wie in den Listen: mergeSorted([1, 4], [2, 3]) ergibt [1, 2, 3, 4]. Schreib Tests, die jede der drei falschen Fassungen entlarven.

Tipp

Jede falsche Fassung scheitert an einer anderen Art von Listen: verschieden lang, ineinander verschränkt, mit einer Zahl in beiden. Ein Test mit allem zugleich erwischt mehrere.

Ausprobieren: Nimm einen deiner Tests heraus und führe wieder aus. Welche fehlerhafte Fassung kommt jetzt durch? So findest du heraus, welcher Test wofür da ist.

5. Extras Extra

Ein Extra für Schnelle: Die Seite ist ohne dieses Kapitel vollständig.

Zwei Katas, die nicht mitzählen.

Aufgabe 9Finde den FehlerExtra

Diese Fassung von max_of_three(a, b, c) soll die größte der drei Zahlen zurückgeben, hat aber einen Fehler. Finde ihn, indem du einen Test schreibst, an dem sie scheitert und den eine richtige Fassung besteht.

def max_of_three(a, b, c)
  if a > b && a > c
    a
  elsif b > a && b > c
    b
  else
    c
  end
end
Tipp

Bei verschiedenen Zahlen stimmt sie. Was ist, wenn zwei Zahlen gleich sind?

Aufgabe 9Finde den FehlerExtra

Diese Fassung von max_of_three(a, b, c) soll die größte der drei Zahlen zurückgeben, hat aber einen Fehler. Finde ihn, indem du einen Test schreibst, an dem sie scheitert und den eine richtige Fassung besteht.

def max_of_three(a, b, c):
    if a > b and a > c:
        return a
    elif b > a and b > c:
        return b
    else:
        return c
Tipp

Bei verschiedenen Zahlen stimmt sie. Was ist, wenn zwei Zahlen gleich sind?

Aufgabe 9Finde den FehlerExtra

Diese Fassung von maxOfThree(a, b, c) soll die größte der drei Zahlen zurückgeben, hat aber einen Fehler. Finde ihn, indem du einen Test schreibst, an dem sie scheitert und den eine richtige Fassung besteht.

function maxOfThree(a, b, c) {
  if (a > b && a > c) return a;
  else if (b > a && b > c) return b;
  else return c;
}
Tipp

Bei verschiedenen Zahlen stimmt sie. Was ist, wenn zwei Zahlen gleich sind?

Aufgabe 10Tests für CaesarExtra

caesar(text, shift) soll verschlüsseln wie in den Texten: Klein- und Großbuchstaben rücken um shift weiter, nach z geht es bei a weiter, auch rückwärts, und alles andere bleibt. Schreib Tests, die jede der vier falschen Fassungen entlarven.

Tipp

Vier Fehler, vier Fälle, die eine Verschlüsselung beherrschen muss: über z hinaus, Großbuchstaben, rückwärts, alles andere stehen lassen.

Aufgabe 10Tests für CaesarExtra

caesar(text, shift) soll verschlüsseln wie in den Texten: Klein- und Großbuchstaben rücken um shift weiter, nach z geht es bei a weiter, auch rückwärts, und alles andere bleibt. Schreib Tests, die jede der vier falschen Fassungen entlarven.

Tipp

Vier Fehler, vier Fälle, die eine Verschlüsselung beherrschen muss: über z hinaus, Großbuchstaben, rückwärts, alles andere stehen lassen.

Aufgabe 10Tests für CaesarExtra

caesar(text, shift) soll verschlüsseln wie in den Texten: Klein- und Großbuchstaben rücken um shift weiter, nach z geht es bei a weiter, auch rückwärts, und alles andere bleibt. Schreib Tests, die jede der vier falschen Fassungen entlarven.

Tipp

Vier Fehler, vier Fälle, die eine Verschlüsselung beherrschen muss: über z hinaus, Großbuchstaben, rückwärts, alles andere stehen lassen.