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! !!
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.
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.
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.
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!'
}
}
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.
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.
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.
Deshalb ist es eine Gegenmaßnahme,
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.
In IDEA, als ich zur Java-Spock-Umgebung ging,
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