Testausführung im Batchmodus

Grundlage für die Ausführung von Tests über die Kommandozeile bildet eine Vielzahl von Argumenten, mit denen QF-Test im Batchmodus gestartet werden kann. Anschließend werden exemplarisch einige davon behandelt; eine Übersicht über alle Optionen findet man in Kapitel 42.

Die nachfolgenden Beispiele sind für Windows geschrieben, lassen sich aber leicht auf Linux übertragen. Neben den Pfadangaben unterscheidet sich die Syntax nur noch im Bezug auf die Platzhalter (Abschnitt 42.2.4): Unter Linux kann neben der Form +X auch %X verwendet werden. Unter Windows gibt es außerdem neben der GUI-Anwendung qftest.exe auch eine Konsolen-Variante qftestc.exe. Diese wartet, bis die Ausführung von QF-Test beendet ist und gibt u. a. auch print-Ausgaben von einem 'Server-Skript' aus.

Verwenden der Kommandozeile

Der einfachste Aufruf von QF-Test, um einen Test auszuführen, sieht so aus:

qftest -batch -run c:\mysuites\suiteA.qft
Beispiel 23.1:  Testausführung von der Kommandozeile

Das Argument -batch sorgt dafür, dass QF-Test ohne graphische Benutzeroberfläche gestartet wird. Das zweite Argument, -run, sagt QF-Test, dass ein Test ausgeführt werden soll. Den Abschluss der Kommandozeile bildet die auszuführende Testsuite.

Hinweis Das Argument -run ist optional, d. h. die Testausführung ist als Standard für den Batchmodus definiert.

Führt man die obige Anweisung aus, werden alle 'Testfall' und 'Testfallsatz' Knoten nacheinander ausgeführt, die in der Testsuite suiteA.qft auf der obersten Ebene (d. h. direkt unterhalb des 'Testsuite' Knotens) definiert sind. Nach Beendigung des Testlaufs findet man im aktuellen Verzeichnis, unter dem gleichen Namen wie die Testsuite, eine Protokolldatei, der man das Testergebnis entnehmen kann.

Durch Angabe von -nolog kann die Erstellung der Protokolldatei auch unterdrückt werden. Das macht aber wahrscheinlich nur dann Sinn, wenn man seinen Test um eigene Protokollausgaben bereichert hat, die etwas in eine Datei geschrieben werden. Ansonsten lieferte nur noch der Rückgabewert von QF-Test einen Hinweis auf den Ausgang des Testlaufs: 0 bedeutet, dass der Test erfolgreich absolviert wurde, ein positiver Wert hingegen ist die Folge von Warnungen, Fehlern oder gar Exceptions (siehe Abschnitt 42.3).

In der Regel möchte man also wohl ein Protokoll des Testlaufs erstellen und dieses an einer bestimmten Stelle im Dateisystem ablegen. Das geht über den Parameter -runlog:

qftest -batch -compact -runlog c:\mylogs\+b c:\mysuites\suiteA.qft
Beispiel 23.2:  Testausführung mit Protokolldatei

Nun wird eine Protokolldatei suiteA.qrz im angegebenen Verzeichnis c:\mylogs erstellt. Der Platzhalter +b sorgt dafür, dass sie den Namen von der Testsuite übernimmt. Durch die Angabe von -compact wird erreicht, dass nur die wichtigsten Knoten in die Protokolldatei übernommen werden, also nur solche, die für den Report und gegebenenfalls die Fehleranalyse benötigt werden. Bei sehr umfangreichen Tests kann dieser Parameter helfen, den Anspruch an Arbeitsspeicher in Grenzen zu halten, wobei die neuere Möglichkeit, Protokolldateien zu splitten, sogar noch mächtiger ist. Nähere Informationen dazu finden Sie in Abschnitt 7.1.

Hinweis Ob die Datei hier tatsächlich als komprimiertes Protokoll (das ist vom obigen "compact" zu unterscheiden) mit der Endung .qrz erstellt wird, hängt von den Einstellungen ab. Um ein bestimmtes Format zu erzwingen, kann die Endung explizit angegeben werden, also z. B. -runlog c:\mylogs\+b.qrl, wenn unkomprimiertes XML gewünscht wird.

Manchmal möchte man vielleicht nicht die komplette Testsuite, sondern nur bestimmte Testfälle ausführen. Über den Parameter -test lässt sich ein ganz bestimmter Knoten zur Ausführung festlegen:

qftest -batch -runlog c:\mylogs\+b -test "Mein Test" c:\mysuites\suiteA.qft
Beispiel 23.3:  Ausführung eines bestimmten Knotens

Die Angabe "Mein Test" bezieht sich dabei auf das Attribut 'QF-Test ID' des auszuführenden Knotens; bei 'Testfall' oder 'Testfallsatz' Knoten kann auch deren qualifizierter Name angegeben werden. Sollen mehrere Knoten ausgeführt werden, kann das Argument -test <ID> auch mehrfach angegeben werden. Neben der QF-Test ID eines Knotens versteht -test auch die Angabe eines numerischen Index. So würde etwa -test 0 den ersten Knoten unterhalb von 'Testsuite' ausführen.

Das Protokoll liefert eine eher technische Sicht auf den Ablauf eines Tests; es ist vor allem nützlich, um während eines Testlaufs aufgetretene Fehler zu analysieren (vgl. Abschnitt 7.1). Eine übersichtliche Darstellung über die ausgeführten Testfälle und eventuell aufgetretene Fehler bietet hingegen der Report. Er wird aus der Protokolldatei erstellt und liegt anschließend im XML- und/oder HTML-Format vor. Der Report kann also auch nachträglich aus einer (oder mehreren) Protokolldateien erstellt werden (vgl. Kapitel 22). Um gleich bei der Testausführung dafür zu sorgen, verwendet man -report:

qftest -batch -runlog c:\mylogs\+b -report c:\mylogs\rep_+b_+y+M+d+h+m c:\mysuites\suiteA.qft
Beispiel 23.4:  Testausführung mit Reportgenerierung

Hier werden die XML- und HTML-Reportdateien in einem Verzeichnis erstellt, dessen Name sowohl die Testsuite wie auch Datum und Uhrzeit enthält, etwa: c:\mylogs\rep_suiteA_0806042152. Ersetzt man das Argument -report durch -report.xml bzw. -report.html, so wird nur der XML- bzw. nur der HTML-Report erstellt.

Testfälle sind oft parametrisiert, das heißt, sie verwenden Variablen, deren Werte den Testablauf bestimmen. Ist beispielsweise im 'Testsuite' Knoten eine Variable myvar definiert, kann deren Vorgabewert zur Testausführung überschrieben werden:

qftest -batch -variable myvar="Value from command line" -runlog c:\mylogs\+b c:\mysuites\suiteA.qft
Beispiel 23.5:  Testausführung mit Variablen

Sollen mehrere Variablen gesetzt werden, kann -variable <name>=<wert> auch mehrfach angegeben werden.

Windows Befehlsskript

Die Möglichkeit, Tests über die Kommandozeile ausführen zu können, bildet die Grundlage zur einfachen Integration von QF-Test in bestehende Testmanagement-Systeme (siehe Anbindung an Testmanagementtools). Wer hingegen kein Testmanagement-System betreibt, mag es vielleicht praktisch finden, das Kommando zur Testausführung in ein Skript einzubetten. Ein einfaches Windows Befehlsskript (qfbatch.bat) könnte zum Beispiel wie folgt aussehen:

@echo off
setlocal
if "%1" == "" (
    echo Usage: qfbatch Testsuite
    goto end
) else (
    set suite=%~f1
)
set logdir=c:\mylogs
pushd c:\programs\qftest\qftest-7.1.3\bin

@echo on
.\qftest -batch -compact -runlog %logdir%\+b %suite%
@echo off

if %errorlevel% equ 0 (
  echo Test terminated successfully
  goto end
)
if %errorlevel% equ 1 (
  echo Test terminated with warnings
  goto end
)
if %errorlevel% equ 2 (
  echo Test terminated with errors
  goto end
)
if %errorlevel% equ 3 (
  echo Test terminated with exceptions
  goto end
)
if %errorlevel% leq -1 (
  echo Error %errorlevel%
  goto end
)

:end
popd
Beispiel 23.6:  Befehlsskript qfbatch.bat zur Ausführung einer Testsuite

Nun braucht man nur noch das Skript auszuführen, mit dem Dateinamen der auszuführenden Testsuite als Parameter. Der Rest geht von alleine: Die Testsuite wird ausgeführt, die Protokolldatei im Verzeichnis logdir abgelegt und abschließend gibt das Skript in Abhängigkeit vom QF-Test Rückgabewert eine Statusmeldung aus.

3.0+23.1.3
Groovy

Seit Version 3 ist die Sprache Groovy Bestandteil von QF-Test (siehe Kapitel 11). Hauptsächlich gedacht ist sie zum Schreiben von Server- und SUT-Skripten, aber Groovy kann ebenso wie Jython auch außerhalb von QF-Test verwendet werden. Diese Sprache ist sicher gut geeignet, um sich selbst ein kleines Management-System zur Testautomatisierung zu erstellen. Mit Groovy lässt sich übrigens auch der Einsatz von Ant vereinfachen, denn statt mit klobigen XML-Dateien, über die sich zudem etwa Bedingungen nur schwer umsetzen lassen, kann man dank AntBuilder mit übersichtlichem Groovy-Code arbeiten. Das folgende Beispiel kommt allerdings ohne Ant aus:

def suite = ''
if (args.size() == 0) {
    println 'Usage: groovy QfExec Testsuite'
    return
}
else {
    suite = args[0]
}

def qftestdir = 'c:\\programs\\qfs\\qftest\\qftest-7.1.3'
def qftest = qftestdir + '\\bin\\qftest.exe'
def command = [qftest,
              "-batch",
              "-compact",
              "-runlog", "c:\\mylogs\\+b",
              suite]
def printStream = { stream ->
    while (true) {
        try {
            stream.eachLine { println it }
        } catch (IOException) {
            break
        }
    }
}

println "Running command: $command"
def proc = command.execute()
new Thread().start() { printStream(proc.in) }
new Thread().start() { printStream(proc.err) }
proc.waitFor()

switch (proc.exitValue()) {
    case '0': println 'Test terminated successfully'; break
    case '1': println 'Test terminated with warnings'; break
    case '2': println 'Test terminated with errors'; break
    case '3': println 'Test terminated with exceptions'; break
    default: println "Error ${proc.exitValue()}"
}
Beispiel 23.7:  Groovy Skript QfExec.groovy zur Ausführung einer Testsuite

Sollte Groovy unabhängig von QF-Test auf Ihrem Rechner installiert sein, kann die Beispiel-Testsuite einfach mit groovy QfExec c:\mysuites\suiteA.qft ausgeführt werden. Andernfalls kann auch die Groovy jar-Datei aus der QF-Test Installation verwendet werden. Am besten nutzt man in diesem Fall zur Ausführung von Groovy wieder ein Befehlsskript:

@echo off
setlocal
if "%1" == "" (
    echo Usage: qfexec Testsuite
    goto end
)
set qftestdir=c:\programs\qftest\qftest-7.1.3
set scriptfile=QfExec.groovy
java -cp %qftestdir%/lib/groovy-all.jar groovy.ui.GroovyMain %scriptfile% %*
:end
Beispiel 23.8:  Befehlsskript qfexec.bat zur Ausführung von Groovy (hier QfExec.groovy)

Die Testsuite kann nun mit qfexec c:\mysuites\suiteA.qft ausgeführt werden.