Wie viel IDEA kann uns mit Java-Spock helfen

Einführung

Neulich kam ein Thema wie "Was macht das IDE-Refactor-Tool beim Schreiben mit Java-Test Spock?" Auf, also habe ich es nachgeschlagen. Bitte lassen Sie uns wissen, wenn es Fehler oder Geschichten wie "Ich wünschte, ich könnte dies in einem solchen Fall tun!" Gibt! !!

Einrichten: Schreiben von Java-Tests in Spock

Java-Tests in anderen Sprachen schreiben?

JUnit ist ein bekanntes Java-Testframework. Bei der Prüfung der Wartbarkeit können jedoch einige schwierige Fälle auftreten. Daher besteht auch für in Java implementierte Dienste die Möglichkeit, Testfälle in anderen Sprachen zu schreiben. Hier wird viel diskutiert [^ 1], und ein Beispiel ist das Thema des Schreibens von Java-Tests in Spock.

Was ist Spock?

Ein in Groovy implementiertes Testframework. Groovy hat einige begeisterte Benutzer [^ 2], zum Beispiel sagte Jenkins 'Vater Kawaguchi "Es ist nicht mehr möglich, keine JUnit-Tests in Groovy zu schreiben". jp / kkawa / 2011212).

Spock nutzt die Funktionen von Groovy voll aus und ermöglicht es Ihnen, präziser als JUnit zu schreiben. Informationen zum Schreiben von Java-Code in Spock finden Sie unter Qiita-Artikel und Bücher. -with-spock) usw. kommen heraus, und ich denke, dass es in Zukunft weiter zunehmen wird.

Wie viel können Sie die Leistung von IDE ausleihen

Wenn Sie nun Java-Tests in Groovy schreiben, ist das Problem, wie viel IDE auf Ihrer Seite sein kann. Da Groovy eine dynamische Sprache ist, kann man sich leicht Situationen vorstellen, in denen automatische Methodensignaturänderungen nicht funktionieren [^ 3]. Diesmal ist es ein Bericht, den ich geprüft habe. Die diesmal verwendete IDE ist IntelliJ IDEA 2016.3.4.

Java-Spock mit IDEE

Code, um diese Zeit zu nutzen

Dieses Mal werde ich verschiedene Dinge mit TDDBC-Github-Code ausprobieren.

Produktionscode ist Java


public class SampleOfJava {

    public String say() {
        return "Hello TDD BootCamp!";
    }

}

Der Testcode lautet Groovy(Spock)


class SampleSpec extends Specification {

    def "should return 'Hello TDD BootCamp!' in Java"() {

        given:
        def sut = new SampleOfJava()

        when:
        String actual = sut.say()

        then:
        actual == 'Hello TDD BootCamp!'

    }

}

Methode umbenennen

Lassen Sie uns zunächst die häufig verwendete Methode umbenennen. Benennen wir die "say" -Methode um. Sie können Shift + F6 verwenden.

umbenennen


    public String shout() { //Ich habe es umbenannt, um zu schreien
        return "Hello TDD BootCamp!";
    }

Der Testcode wurde ebenfalls automatisch umbenannt.

        given:
        def sut = new SampleOfJava()

        when:
        String actual = sut.shout() //Umbenannt

        then:
        actual == 'Hello TDD BootCamp!'

Erstens gibt es kein Problem.

Signaturänderungen

Versuchen Sie als Nächstes, die Signatur zu ändern. Der Refactor-Bildschirm wird mit "Befehl + F6" geöffnet. Fügen Sie also mehrere Parameter hinzu, wie unten gezeigt.

Type Name
String addedString
Integer addedInteger

Natürlich wurde die Signatur des Produktionscodes geändert.

Signaturänderungen


    public String say(String addedString, Integer addedInteger) { //Fügen Sie zwei Argumente hinzu
        return "Hello TDD BootCamp!";
    }

Die Signatur des Testcodes hat sich ebenfalls geändert. Aber es ist nicht sehr höflich. .. ..

        when:
        String actual = sut.say(,) //Es wurden Argumente hinzugefügt, aber ich möchte, dass Sie etwas mehr tun

Wenn Ihnen das nicht gefällt, ist es etwas besser, wenn Sie den Standardwert angeben, den Sie zuvor auf dem Refactoring-Bildschirm eingeben können.

        when:
        String actual = sut.say("DEFAULT", i) //Wenn Sie den Standardwert eingeben, sieht er etwas ähnlicher aus

Ich hätte gerne eine andere Stimme, aber lass es uns tun.

Seien Sie vorsichtig, wenn Sie nur ein Argument hinzufügen

Ich versuchte es und bemerkte einen schwierigen Teil. In diesem Fall wird beim Ändern der Signatur das Argument um nur um ein </ b> erhöht. Als ich beispielsweise das Argument mit dem Refactor-Tool wie unten gezeigt vergrößerte, änderte sich der Produktionscode.

Signatur ändern (nur ein Argument hinzufügen)


    public String say(String anotherParameter) { //Argument hinzugefügt
        return "Hello TDD BootCamp!";
    }

Ist das der Testcode? ?? Es wurde nicht geändert.

        when:
        String actual = sut.say() //Argumente erhöhen orz nicht

Ich bin ein Songwriter, weil ich den Test bestehen kann, je nachdem, wie ich ihn schreibe. Der Grund dafür ist, dass in Groovy beim Aufrufen einer Methode mit einem Argument, selbst wenn der Aufrufer sie aufruft, ohne ein Argument festzulegen, automatisch null gesetzt und ordnungsgemäß gemessen wird. [^ 4]. Mit anderen Worten, der vorherige Code

        when:
        String actual = sut.say(null) //Null wird automatisch zugewiesen

Ist äquivalent zu. Es scheint also, dass IDEA dies weiß und das Argument des Anrufers nicht mit dem Moment hinzufügt, dass "dies in Ordnung ist". (Vielleicht ist es ein Fehler) Das ist ziemlich beängstigend.

Gegenmaßnahmen

Deshalb ist es eine Gegenmaßnahme,

  1. Geben Sie beim Refactoring den Standardparameter ein
  2. Fügen Sie der Testklasse "@ CompileStatic" hinzu

Ich denke, dort ist. Ich habe bereits 1. angesprochen, also ist es okay, aber etwas mehr über 2. Groovy ist eine dynamische Sprache, bietet aber auch die Möglichkeit, statisch zu kompilieren. Das ist die Anmerkung @CompileStatic. Wenn Sie dies hinzufügen, wird auch dann ein Kompilierungsfehler angezeigt, wenn das Refactor-System ausfällt. Das heißt, es ist keine gute Lösung, da das Refactor-Tool nicht funktioniert.

Zusammenfassung

In IDEA, als ich zur Java-Spock-Umgebung ging,

  • Sie können häufig verwendete Refactor-Tools wie das Umbenennen und Ändern von Signaturen ohne grundlegende Probleme verwenden.
  • Beachten Sie, dass das Ändern der Signatur mit einem Argument schwierig ist.

Es war eine Geschichte, die ich verstanden habe. Persönlich empfehle ich die Java-Spock-Konfiguration sehr, aber wenn Sie dies tun, lassen Sie uns vorsichtig mit den Details sein.

[^ 1]: Es ist ein bisschen alt, aber http://devtesting.jp/pekema/?0002%2FHotlinks ist gut organisiert. [^ 2]: Natürlich bin ich einer von ihnen. [^ 3]: Der Grund ist, dass nicht entschieden wird, ob die Methode der Signatur, die bis zum Zeitpunkt der Ausführung existiert, aufgerufen wird. Da es meta-programmiert werden kann, ist es konzeptionell möglich, dass Methoden unmittelbar vor der Ausführung dynamisch hinzugefügt werden. [^ 4]: Ich habe es völlig vergessen, aber ich habe vor langer Zeit in Qiita darüber geschrieben. http://qiita.com/PoohSunny/items/a1de52653d09133de4ad

Recommended Posts

Wie viel IDEA kann uns mit Java-Spock helfen
Wie kann ich ein Array effizient füllen?
So speichern Sie, auch wenn der externe Schlüssel Null ist