61 lines
2.3 KiB
Markdown
61 lines
2.3 KiB
Markdown
|
|
||
|
## Tests
|
||
|
##### Power Assertions
|
||
|
Genau wie in Java, gibt es in Groovy auch das Schlüsselwort `assert`. Im Gegensatz zu Java sind Assertions in Groovy jedoch standardmäßig aktiviert. Sie erleichtern die Fehlersuche und das Debugging und zeigen eine Übersicht des Ausdrucks mitsamt der **aktuellen** Variablenwerten. Der Entwickler sieht also genau, welcher Teil des Ausdrucks das Problem verursacht hat.
|
||
|
|
||
|
````Groovy
|
||
|
def a = 1
|
||
|
def b = 2
|
||
|
def c = 3
|
||
|
|
||
|
// Ausdruck liefert 9 statt 10
|
||
|
assert a + b * c == 10
|
||
|
````
|
||
|
<img src="./../img/power-assertions.png" width="350">
|
||
|
|
||
|
Es kann während der Auswertung von Power-Assertions zu inkonsistenten Fehlermeldungen kommen. Das liegt daran, dass bei den Power-Assertions nur die Referenzen auf die Variablen gespeichert. Werden diese Werte also verändert, werden nur die aktuellen Werte angezeigt, da über die Referenz auf die Variable zugegriffen wird.
|
||
|
|
||
|
````Groovy
|
||
|
def getLastAndRemove(list) {
|
||
|
return list.remove(list.size() - 1)
|
||
|
}
|
||
|
def list = [1, 2, 3]
|
||
|
assert getLastAndRemove(list) == 4
|
||
|
````
|
||
|
|
||
|
<img src="./../img/assertion2.png" width="350">
|
||
|
|
||
|
````Groovy
|
||
|
assert [[1,2,3,3,3,3,4]].first().unique() == [1,2,3]
|
||
|
````
|
||
|
<img src="./../img/assertion3.png" width="350">
|
||
|
|
||
|
---
|
||
|
|
||
|
#### Spock:
|
||
|
- Groovy bietet nicht nur Support für JUnit 5 (und älter), sondern liefert auch einen eigenen Satz an Testmethoden, um die testgetriebene Programmierung zu vereinfachen.
|
||
|
|
||
|
Ein Beispiel hierfür wäre Spock. Mit Spock kann man sowohl Java, als auch Groovy Code testen. Getestet wird mit sogenannten Spezifikationen. Die Testklasse muss also von `spock.lang.Specification` erben.
|
||
|
|
||
|
|
||
|
````Groovy
|
||
|
class StackSpec extends Specification {
|
||
|
def "Ein Element zum Stack hinzufuegen führt zur erhoehung von size"() {
|
||
|
setup: "Eine neue Stack-Instanz wurde erstellt"
|
||
|
def stack = new Stack()
|
||
|
when:
|
||
|
stack.push 42
|
||
|
|
||
|
then:
|
||
|
stack.size() == 1
|
||
|
}
|
||
|
}
|
||
|
````
|
||
|
|
||
|
##### Erklärung:
|
||
|
|
||
|
- Der Name der Testmethode muss ein String sein, der beschreibt, was beim Testen erwartet wird.
|
||
|
- Das Schlüsselwort `setup` dient dazu, lokale Variablen zu initialisieren, die für den Test gebraucht werden (vgl. **@BeforeEach** Annotation, JUnit)
|
||
|
3. Das `when` Schlüsselwort beschreibt den Codeabschnitt, der zu einem bestimmten Verhalten führen soll
|
||
|
4. `then` beschreibt das erwartete Verhalten.
|