Zum Inhalt springen

Fortgeschrittene Testtechniken

Fortgeschrittene Konzepte des Softwaretestens können dir viel Zeit und Energie sparen. Repeato hilft dir, deine Testprozesse zu verbessern.

Hast du dich schon gefragt, wie Tests erstellt werden können, ohne dich zu wiederholen? Testautomatisierung ermöglicht es, Tests aufzuzeichnen und beliebig wiederzuverwenden – ein großer Vorteil von automatisierten gegenüber manuellen Tests.

In diesem Video zeigen wir, wie du deine Tests in wiederverwendbare Teile aufteilen kannst. Außerdem behandeln wir einige der Skripting-Möglichkeiten von Repeato und zeigen, warum es nützlich sein kann, Testschritte optional zu machen. Als Testobjekt verwenden wir die To-do-Listen-App „Asana“. Wir testen das Erstellen von To-dos.

Videoinhalt

  1. Die Navigation zum richtigen Bildschirm automatisieren
  2. Das Erstellen eines To-dos automatisieren
  3. Das Löschen aller To-dos automatisieren
  4. Alles zu einem einzigen Test zusammenführen

Hier ist ein Beispiel für einen komplexeren Automatisierungsfall. Wir automatisieren ein Spiel (Power-Pop-Blasen) mit einigen optionalen „Inhalt prüfen“-Schritten und ein paar Codezeilen.

Sieh dir den unten beschriebenen detaillierten Code an.

Eine Funktion definieren, die in anderen Schritten verwendet werden kann

Abschnitt mit dem Titel „Eine Funktion definieren, die in anderen Schritten verwendet werden kann“

Wenn du eine Funktion definierst, ist sie normalerweise nur innerhalb desselben Schritts verfügbar. Wir möchten unsere Funktion in anderen Schritten aufrufen. Dafür müssen wir eines der langlebigeren Objekte zum Speichern der Funktion verwenden. data ist ein solches Objekt, und wir können eine Funktion so definieren:

data.checkLastMatchAndShoot = async function() {
// myCode goes here
}

Wir fügen async hinzu, weil wir asynchronen Code innerhalb unserer Funktion verwenden. Grundsätzlich müssen alle Funktionen, die mit await verwendet werden, in async Funktionen eingeschlossen werden. Andernfalls schlägt unser Skript fehl. Du kannst hier mehr über async / await lesen.

Nach der Ausführung eines optionalen Schritts können wir in unserem Skript prüfen, ob das zurückgegebene Ergebnis erfolgreich war. Über testRunner.lastStepResult.

können wir auf das Ergebnis der letzten Schrittausführung zugreifen. Außerdem lässt sich prüfen, wie viele Treffer es gab (wie oft das Objekt gefunden wurde):

testRunner.lastStepResult.matches.length

Wenn es also keine Treffer gab, das heißt, wenn keine Kugeln einer bestimmten Farbe gefunden wurden, kehren wir einfach zurück.

Andernfalls sortieren wir die Treffer von oben nach unten. Das ist wichtig, weil wir zwischen der Kugel im Abschussgerät und den Kugeln darüber auf dem Spielfeld unterscheiden müssen.

Das tun wir, indem wir den y-Positionswert des Treffers prüfen:

// if y position of last match is lower than 70% of the screen height
if(lastMatch.position.y > 0.7)

Wenn wir also eine Kugel einer bestimmten Farbe gefunden haben, müssen wir wissen, in welche Richtung wir schießen sollen, richtig?

Dazu prüfen wir die Trefferliste und sehen uns den vorherigen Treffer genauer an (den direkt über der Kugel im Abschussgerät).

const oneBeforeLastMatch = matches[matches.length - 2]

Mit diesem Treffer können wir die Schussrichtung festlegen. Zum Schießen führen wir eine Ziehbewegung von der Kugel im Abschussgerät zur gleichfarbigen Kugel direkt darüber aus.

Für den Gesamtüberblick folgt hier der vollständige Code:

data.checkLastMatchAndShoot = async function() {
var matches = testRunner.lastStepResult.matches
if(matches.length === 0){ // no ball of this color found
return false
}
// we sort the matches from top to bottom
matches = matches.sort((match1, match2) => match1.position.y - match2.position.y)
// get the most bottom match
const lastMatch = matches[matches.length - 1]
// if most bottom match is not in the field, but at the very bottom, this means that it is inside the launcher
if(lastMatch.position.y > 0.7) {
const oneBeforeLastMatch = matches[matches.length - 2]
testRunner.deviceConnector.sendDown(lastMatch.position.x, lastMatch.position.y)
await sleep(1000)
testRunner.deviceConnector.sendMove(oneBeforeLastMatch.position.x, oneBeforeLastMatch.position.y)
await sleep(1000)
testRunner.deviceConnector.sendUp()
return true
} else {
return false
}
}
DE