Entwicklung durch Testen: Fähigkeiten verbessern

Ursprünglicher Autor: Thomas Lombart
Testen ist eine wichtige Fähigkeit, die jeder Entwickler besitzen muss. Einige tun es jedoch nur ungern.

Jeder von uns ist auf einen Entwickler gestoßen, der behauptete, Tests seien nutzlos, erfordere zu viel Aufwand und sein Code sei so gut, dass keine Tests erforderlich seien. Glaube nicht Testen ist extrem wichtig.

Bild

Tests machen Ihren Code stabiler und reduzieren die Anzahl der Fehler. Es scheint Ihnen, dass dies nicht der Fall ist, da Sie jedes Bit Ihres Codes kennen. Immerhin hast du es geschrieben, warum sonst Tests?

Angenommen, Sie erstellen eine Anwendung für das Wetter. Sie haben den Code einige Tage oder Wochen geschrieben, damit Sie den Code in- und auswendig kennen.

Nun stellen Sie sich vor, Sie haben die Arbeit an der Bewerbung abgeschlossen und werden in einigen Monaten darauf zurückkommen. Sie werden sich nicht an jedes Detail des alten Codes erinnern. Du änderst es ... und verdammt noch mal ... etwas ist kaputt. Wie reparierst du das? Sehen Sie sich jede erstellte Datei an und richten Sie sie so ein, dass sie wieder funktioniert. Vielleicht wird es so sein. Das Ändern dieser Datei wird jedoch etwas anderes zerstören.

Nehmen Sie ein anderes Beispiel. Nach einigen Monaten harter Arbeit haben Sie endlich die Position gefunden, die Sie schon lange gesucht haben! Sie treten einem Team bei und beginnen etwas zu kreieren. Sie arbeiten mit dem Code anderer Entwickler und umgekehrt. Und eines Tages bricht alles zusammen. Wenn das Team die Tests nicht in Ihre Anwendung integriert hat, beneide ich Sie nicht.

Jedes Team muss Tests schreiben, wenn es Software oder Anwendungen erstellt. Sie möchten keine Person sein, die nicht weiß, wie sie testen sollen?

Ja, das Schreiben von Tests braucht Zeit. Ja, zunächst schwierig. Ja, das Erstellen von Anwendungen ist interessanter. Tests sind jedoch wichtig und sparen Zeit, wenn sie richtig implementiert werden.

Mein Ziel ist es heute, die Testfähigkeiten zu verbessern. Wir werden Unit-Tests und -Entwicklung durch Testen mit Jest (einem JavaScript-Testwerkzeug) betrachten. Natürlich können Sie auch andere Testwerkzeuge verwenden, z. B. Mocha und Chai.

Lass uns anfangen!

Unit-Tests


Wenn Sie sich entscheiden, eine Anwendung zu testen, begegnen Ihnen verschiedene Arten von Tests: Komponententests (Unit), Integrationstests und Funktionstests. Lassen Sie uns mit modularen Tests aufhören.

Funktions- und Integrationstests sind ebenso wichtig, jedoch schwieriger einzurichten und zu implementieren als Komponententests. Kurz gesagt, besteht ein Komponententest aus dem Testen kleiner Teile Ihres Codes: Funktionen, Klassenmethoden usw. Sie geben Daten ein und bestätigen, dass Sie das erwartete Ergebnis erhalten haben.

Vorteile der Stückprüfung:

  • Macht den Code stabiler;
  • Erleichtert Änderungen in der Implementierung einer Funktion, ohne ihr Verhalten zu ändern.
  • Dokumentiert Ihren Code. Sie werden bald verstehen warum.
  • Macht das richtige Design. In der Tat ist schlecht entwickelter Code oft schwieriger zu testen.

Entwicklung durch Testen (TDD)

Um die Entwicklung durch Testen zu verstehen und zu verwenden, sollten Sie diese beiden Regeln beachten:

  1. Schreiben Sie einen Test, der vor dem Schreiben von Code fehlschlägt.
  2. Dann schreibe den Code, der den Test bestehen kann.

Wenn wir TDD verwenden, sprechen wir über den Zyklus "Rot, Grün, Refaktor".

Rot: Sie schreiben einen fehlgeschlagenen Test, ohne Code zu schreiben.

Grün: Schreiben Sie den einfachsten Code, der den Test bestehen kann. Auch wenn Ihnen der Code am dümmsten erscheint.

Refactor: Code-Refactoring, falls erforderlich. Machen Sie sich keine Sorgen, wenn Sie den Code ändern und die Gerätetests brechen, wenn etwas schief geht.

Strukturieren einer Testdatei


Jest stellt Funktionen zur Strukturierung von Tests bereit:

beschreiben: dient zum Gruppieren Ihrer Tests und zum Beschreiben des Verhaltens Ihrer Funktion / Ihres Moduls / Ihrer Klasse. Es braucht zwei Parameter. Die erste ist eine Zeichenfolge, die Ihre Gruppe beschreibt. Die zweite ist eine Rückruffunktion, in der Sie Testbeispiele oder Hook-Funktionen haben.

it oder test: Ihr Gerätetest. Parameter sind die gleichen wie in beschreiben. Muss beschreibend sein. Die Benennung des Tests liegt bei Ihnen, aber Sie können mit "sollte" beginnen.

beforeAll (afterAll): Die Hook-Funktion führt alle Tests vor (und nach) aus. Akzeptiert einen Parameter, eine Funktion, die Sie vor (und nach) allen Tests ausführen.

beforeEach (afterEach):Hook-Funktion, die vor (und nach) jedem Test ausgeführt wird. Akzeptiert einen Parameter, eine Funktion, die Sie vor (und nach) jedem Test ausführen.

Bevor Sie eine Test schreiben, sollten Sie folgendes wissen:

Sie haben den Test überspringen können mit .skip zu beschreiben und IT : it.skip (...) oder describe.skip (...) . Mit .skip weisen Sie Jest an, einen Test oder eine Gruppe zu ignorieren.

Sie können diese Tests auswählen , die Sie verwenden beginnen wollen .only zu beschreiben und IT : it.only (...) oder describe.only (...). Dies ist nützlich, wenn Sie viele Tests haben und sich nur auf eine Sache konzentrieren möchten oder Ihre Tests "debuggen" möchten.

Scherzeinstellung


Um Ihnen die oben beschriebenen Testfunktionen zu zeigen, müssen Sie Jest konfigurieren. Es ist sehr einfach.

Sie benötigen nur Node.js und npm oder Yarn. Stellen Sie sicher, dass Sie die neueste Version von Node.js verwenden, da wir ES6 verwenden werden. Erstellen Sie ein neues Verzeichnis und initialisieren Sie es.

mkdir test-example && cd test-example
npm init -y
# OR
yarn init -y

-y antwortet mit "Ja" auf alle Fragen npm oder gar. Er musste eine sehr einfache package.json-Datei erstellen.

Fügen Sie dann den Jest zur Entwicklungsumgebung hinzu.

yarn add jest --dev

Fügen Sie dann das folgende Skript zu package.json hinzu :

"scripts": {
  "test": "jest"
}

Garntest führt Ihre Testdateien im Verzeichnis aus. Standardmäßig erkennt Jest Dateien, die sich im Verzeichnis __tests__ befinden, oder Dateien, die auf .spec.js oder .test.js enden.

Das ist alles Sie können den ersten Test schreiben.

Matchers


Wenn Sie etwas überprüfen, benötigen Sie eine Eingabe und ein erwartetes Ergebnis. Deshalb bietet Jest Beispiele zur Überprüfung unserer Werte an:

expect(input).matcher(output)

Jest hat viele Beispiele, hier ist das wichtigste:

toBe: vergleicht strikte Gleichheit (===).

expect(1 + 1).toBe(2)
let testsAreEssential = true
expect(testAreEssential).toBe(true)

toEqual: vergleicht Werte zwischen zwei Variablen, Arrays oder Objekten.

let arr = [1, 2]
arr.push(3)
expect(arr).toEqual([1, 2, 3])
let x= 1
x++
expect(x).toEqual(2)

toBeTruthy (toBeFalsy): Gibt an, ob der Wert true (oder false) ist.

expect(null).toBeFalsy()
expect(undefined).toBeFalsy()
expect(false).toBeFalsy()
expect("Hello world").toBeTruthy()
expect({foo: 'bar'}).toBeTruthy()

toContain: prüft, ob das Array ein Element enthält.

expect(['Apple', 'Banana', 'Strawberry']).toContain('Apple')

toThrow: prüft, ob die Funktion einen Fehler verursacht.

function connect () {
  throw new ConnectionError()
}
expect(connect).toThrow(ConnectionError)

Erste Tests


Jetzt schreiben wir unseren ersten Test und spielen mit unseren Funktionen. Erstellen Sie zuerst eine Datei example.spec.js in Ihrem Verzeichnis und fügen Sie Folgendes ein:

describe('Example', () => {
  beforeAll(() => {
    console.log('running before all tests')
  })
  afterAll(() => {
    console.log('running after all tests')
  })
  beforeEach(() => {
    console.log('running before each test')
  })
  afterEach(() => {
    console.log('running after each test')
  })
  it('Should do something', () => {
    console.log('first test')
  })
  it('Should do something else', () => {
    console.log('second test')
  })
})

Bitte beachten Sie, dass wir nicht alle Funktionen importieren müssen, die wir verwenden. Sie werden bereits von Jest zur Verfügung gestellt.

Garntest ausführen :

Bild

Da Sie keine Aussagen in den Tests haben, werden sie bestanden. Haben Sie andere Console.log-Anweisungen gesehen? Sie sollten besser verstehen, wie Ihre Funktionen und Testfälle funktionieren.

Entfernen Sie nun alle Hook-Funktionen und fügen Sie dem ersten Test .skip hinzu :

describe('Example', () => {
  it.skip('Should do something', () => {
    console.log('first test')
  })
  it('Should do something else', () => {
    console.log('second test')
  })
})

Führen Sie das Garn Test wieder:

Bild

Es ist in Ordnung , wenn der erste Test wird nicht funktionieren.

Fügen Sie einen dritten Test hinzu und verwenden Sie .only :

describe('Example', () => {
  it('Should do something', () => {
    console.log('first test')
  })
  it('Should do something else', () => {
    console.log('second test')
  })
  it.only('Should do that', () => {
    console.log('third test')
  })
})

Rerun Garn Test :

Bild

Im zweiten Teil dieses Artikels werden wir eine einfache Implementierung eines Stapels in JavaScript mit TDD machen.

Jetzt auch beliebt: