Fortgeschrittene Testtechniken
Fortgeschrittene Konzepte des Softwaretestens können dir viel Zeit und Energie sparen. Repeato hilft dir, deine Testprozesse zu verbessern.
Einen Test aus Bausteinen erstellen
Abschnitt mit dem Titel „Einen Test aus Bausteinen erstellen“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
- Die Navigation zum richtigen Bildschirm automatisieren
- Das Erstellen eines To-dos automatisieren
- Das Löschen aller To-dos automatisieren
- Alles zu einem einzigen Test zusammenführen
Skripting
Abschnitt mit dem Titel „Skripting“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.
Das Ergebnis des zuletzt ausgeführten Schritts abrufen
Abschnitt mit dem Titel „Das Ergebnis des zuletzt ausgeführten Schritts abrufen“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 heightif(lastMatch.position.y > 0.7)Den Ball in die richtige Richtung schießen
Abschnitt mit dem Titel „Die Kugel in die richtige Richtung schießen“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 }}