Die Durchführung von Tests für ähnliche Szenarien kann oft zu einer ermüdenden Wiederholung von Code führen. Hier bieten table-driven (auf Deutsch "tabellengesteuerte") Tests eine effiziente Lösung. Diese Testmethode wurde entwickelt, um die Wiederholung von Code zu minimieren, indem eine Reihe von Tests auf einer Datenbasis erstellt wird.
Die Methode describe.each
von Jest ist ein nützliches Werkzeug, das die Erstellung von Testsuiten ermöglicht, die unterschiedliche Daten verwenden, aber dieselbe Funktionalität überprüfen.
Es gibt zwei Hauptansätze für den Syntax, der hier verwendet werden kann:
Zum einen ist es möglich, eine Datentabelle als Array zu konstruieren, in der mit String-Interpolation gearbeitet wird. Die Jest-Dokumentation bietet hierfür ein anschauliches Beispiel.
Eine Alternative und oft als eleganter angesehene Methode ist die Verwendung eines Arrays von Objekten als Testtabelle. Jedes Objekt repräsentiert Eingabewerte und das erwartete Ergebnis.
Ein Beispiel würde wie folgt aussehen:
1describe.each([
2 {a: 1, b: 1, expected: 2},
3 {a: 1, b: 2, expected: 3},
4 {a: 2, b: 1, expected: 3},
5])('.add($a, $b)', ({a, b, expected}) => {
6 test(`returns ${expected}`, () => {
7 expect(a + b).toBe(expected);
8 });
9
10 test(`does not return more than ${expected}`, () => {
11 expect(a + b).not.toBeGreaterThan(expected);
12 });
13
14 test(`does not return less than ${expected}`, () => {
15 expect(a + b).not.toBeLessThan(expected);
16 });
17});
Darüber hinaus können sogenannte "Tagged template literals" verwendet werden, um Testspezifikationen klarer zu gestalten.
Ein Beispiel wäre:
1describe.each`
2 a | b | expected
3 ${1} | ${1} | ${2}
4 ${1} | ${2} | ${3}
5 ${2} | ${1} | ${3}
6`('$a + $b', ({a, b, expected}) => {
7 test(`returns ${expected}`, () => {
8 expect(a + b).toBe(expected);
9 });
10
11 test(`does not return more than ${expected}`, () => {
12 expect(a + b).not.toBeGreaterThan(expected);
13 });
14
15 test(`does not return less than ${expected}`, () => {
16 expect(a + b).not.toBeLessThan(expected);
17 });
18});
Diese Beispiele zeigen, wie Jest table-driven Tests ermöglicht, um die Erstellung von kompakten und dynamischen Testsuiten zu vereinfachen.