Java >> Java Tutorial >  >> Java

Unit-Tests mit Spock Framework schreiben:Einführung in die Spezifikationen, Teil Drei

Der vorherige Teil dieses Tutorials hat die Struktur einer Feature-Methode beschrieben und uns geholfen, das erwartete Verhalten des zu spezifizierenden Systems zu spezifizieren.

Diesmal schauen wir uns das wo genauer an -Block, der verwendet wird, um Eingabedaten für unsere Feature-Methoden bereitzustellen, wenn wir parametrisierte Tests mit Spock Framework schreiben.

Fangen wir an.

Parametrierte Tests mit Spock Framework schreiben

Nehmen wir an, wir müssten das erwartete Verhalten von Math spezifizieren Klasse' max(int ​​a, int b) Methode. Sein Javadoc besagt, dass es:

Gibt den größeren von zwei int-Werten zurück. Das heißt, das Ergebnis ist das Argument, das näher am Wert von Integer.MAX_VALUE liegt . Wenn die Argumente denselben Wert haben, ist das Ergebnis derselbe Wert.

Der Quellcode unserer (etwas naiven) Spezifikationsklasse sieht wie folgt aus:

import spock.lang.Specification

class MathSpec extends Specification {

    def "Get the max value of two numbers (without parameters)"() {

        expect: 'Should return the bigger number'
        Math.max(1, 0) == 1
        Math.max(2, 3) == 3
    }
}

Lassen Sie uns herausfinden, wie wir diese Feature-Methode umschreiben können, indem wir die datengesteuerte Testunterstützung von Spock Framework verwenden.

Umschreiben des Expect-Blocks

Als erstes müssen wir expect umschreiben Block unserer Feature-Methode. Wir können dies tun, indem wir diesen Schritten folgen:

Zuerst , müssen wir die fest codierten int-Werte durch die "Datenvariablen" a ersetzen , b , und c . Diese Datenvariablen werden im Folgenden beschrieben:

  • Das a und b Datenvariablen sind die Methodenparameter, die an max() übergeben werden Methode der Mathematik Klasse.
  • Das c Datenvariable ist der erwartete Wert, der von Math zurückgegeben wird Klasse' max() Methode.

Zweiter , müssen wir das erwartete Verhalten von Math spezifizieren Klasse' max() Methode mithilfe dieser Datenvariablen.

Der Quellcode unserer umgeschriebenen Feature-Methode sieht wie folgt aus:

import spock.lang.Specification

class MathSpec extends Specification {

    def "Get the max value of two numbers"() {

        expect: 'Should return the bigger number'
        Math.max(a, b) == c
    }
}

Nachdem wir expect umgeschrieben haben Block unserer Feature-Methode verwenden, um Datenvariablen zu verwenden, müssen wir die Eingabedaten für unsere Feature-Methode bereitstellen. Lassen Sie uns herausfinden, wie wir die Eingabedaten mithilfe sogenannter Datenpipes bereitstellen können.

Bereitstellung von Eingabedaten durch Verwendung von Datenpipes

Wir können die Eingabedaten für unsere Feature-Methode bereitstellen, indem Sie diesen Schritten folgen:

  1. Fügen Sie ein neues Wo hinzu block in unsere Feature-Methode.
  2. Konfigurieren Sie die Werte jeder Datenvariablen, indem Sie diesen Schritten folgen:
    1. Verbinden Sie die Datenvariable a mit einem Datenanbieter, der die int enthält Werte:1 und 2.
    2. Verbinden Sie die Datenvariable b mit einem Datenanbieter, der die int enthält Werte:0 und 3.
    3. Verbinden Sie die Datenvariable c mit einem Datenanbieter, der die int enthält Werte:1 und 3.

Der Quellcode unserer Spezifikationsklasse sieht wie folgt aus:

import spock.lang.Specification

class MathSpec extends Specification {

    def "Get the max value of two numbers"() {

        expect: 'Should return the bigger number'
        Math.max(a, b) == c

        where:
        a << [1,2]
        b << [0,3]
        c << [1,3]
    }
}

Obwohl unser wo Block ist voll funktionsfähig, es ist nicht sehr gut lesbar. Wir können es viel besser lesbar machen, indem wir Datentabellen verwenden.

Bereitstellung von Eingabedaten durch Verwendung von Datentabellen

Wir können eine Datentabelle erstellen, indem wir diese Regeln befolgen:

  • Die erste Zeile der Datentabelle deklariert die Datenvariablen.
  • Die nachfolgenden Tabellenzeilen werden Datenzeilen genannt. Diese Datenzeilen enthalten die Werte von Datenvariablen, die an unsere Feature-Methode übergeben werden, und unsere Feature-Methode wird einmal pro Datenzeile aufgerufen.
  • Die verschiedenen Spaltenwerte einer Tabellenzeile werden durch das Pipe-Zeichen ('|') getrennt.

Nachdem wir unser altes where ersetzt haben Block mit einem where Block, der die Eingabedaten mithilfe von Datentabellen bereitstellt, sieht der Quellcode unserer Spezifikationsklasse wie folgt aus:

import spock.lang.Specification

class MathSpec extends Specification {

    def "Get the max value of two numbers"() {

        expect: 'Should return the bigger number'
        Math.max(a, b) == c

        where:
        a | b | c
        1 | 0 | 1
        2 | 3 | 3
    }
}

Obwohl unser neues wo block ist viel sauberer als das where Block, der Datenpipes verwendet, können wir es etwas besser machen, indem wir die Eingabewerte und den/die erwarteten Ausgabewert(e) mit einem doppelten Pipe-Symbol ('||') trennen. Nachdem wir dies getan haben, sieht der Quellcode unserer Spezifikationsklasse wie folgt aus:

import spock.lang.Specification

class MathSpec extends Specification {

    def "Get the max value of two numbers"() {

        expect: 'Should return the bigger number'
        Math.max(a, b) == c

        where:
        a | b || c
        1 | 0 || 1
        2 | 3 || 3
    }
}

Fassen wir zusammen, was wir aus diesem Blogbeitrag gelernt haben.

Zusammenfassung

Dieser Blogpost hat uns drei Dinge gelehrt:

  • Wir können die Eingabewerte und die erwarteten Ausgabewerte spezifizieren, indem wir Datenvariablen verwenden.
  • Wir können Eingabedaten für unsere Feature-Methoden bereitstellen, indem wir ein where hinzufügen Block in unsere Feature-Methode einfügen und entweder Datenpipes oder Datentabellen verwenden.
  • Die Bereitstellung von Eingabedaten mithilfe von Datentabellen ist viel sauberer als die Verwendung von Datenpipes.

Der nächste Teil dieses Tutorials beschreibt, wie wir Testdoubles mit Spock Framework erstellen können.

P.S. Sie können die Beispielanwendung dieses Blogbeitrags von Github herunterladen.


Java-Tag