Inhalte
Index 🔎︎

# Dienst SFUnitTests.UnitTest

Der Dienst UnitTest bietet ein Framework für die Automatisierung von Komponententests mithilfe der Basic-Sprache, einschließlich der Möglichkeit:

- Testfälle in Testsuiten und Komponententests zusammenzufassen.

- Setup- und Shutdown-Code zwischen Testfällen zu teilen.

- Testergebnisse auf der Konsole zu melden.

Sowohl die Komponententests als auch der zu testende Code müssen in Basic geschrieben werden. Der getestete Code kann Funktionen aufrufen, die in anderen Sprachen geschrieben sind.

Der Dienst UnitTest ist für Python-Skripte nicht verfügbar.

## Definitionen

### Testfall

Ein Testfall ist die einzelne Testeinheit. Es prüft auf eine bestimmte Antwort auf einen bestimmten Satz von Eingaben.

Im Dienst UnitTest wird ein Testfall durch ein einzelnes grundlegendes Sub dargestellt, dessen Name mit einem gemeinsamen Präfix beginnt (der Standardwert ist "Test_").

Der Testfall schlägt fehl, wenn eine der Methoden AssertX False zurückgibt.

### Testsuite

Eine Testsuite ist eine Sammlung von Testfällen, die gemeinsam ausgeführt werden sollen.

Alle Testfälle einer Testsuite werden in einem einzigen Basic-Modul gespeichert.

Eine Testsuite kann die Methoden SetUp und TearDown implementieren, um Testfälle in ihrem Modul vorzubereiten.

### Komponententest

Ein vollständiger Komponententest besteht aus einer Reihe von Testsuiten in derselben Basic-Bibliothek.

## Dienstaufruf

Vor der Verwendung des Dienstes UnitTest muss die Bibliothek ScriptForge geladen oder importiert werden:

• Grundlegende Makros erfordern das Laden der Bibliothek ScriptForge mit der folgenden Anweisung:
GlobalScope.BasicLibraries.loadLibrary("ScriptForge")
• Python-Skripte erfordern einen Import aus dem Modul scriptforge:
from scriptforge import CreateScriptService

### Einfacher Modus

Rufen Sie den Dienst im einfachen Modus auf, um Funktionen AssertX aufzurufen, ohne die vollständige Hierarchie von Testsuiten und Testfällen aufbauen zu müssen.

Im einfachen Modus wird der Dienst innerhalb des Testfalls aufgerufen, wie im folgenden Beispiel gezeigt:

        Sub SimpleTest
            On Local Error GoTo CatchError
            Dim myTest As Variant
            myTest = CreateScriptService("UnitTest")
            ' Ein paar Dummy-Tests
            myTest.AssertEqual(1 + 1, 2)
            myTest.AssertEqual(1 - 1, 0)
            MsgBox("Alle Tests bestanden")
            Exit Sub
        CatchError:
            myTest.ReportError("Ein Test ist fehlgeschlagen")
        End Sub

Wenn in diesem Beispiel einer der Aufrufe AssertEqual fehlschlägt, geht der Interpreter zum Label CatchError und meldet den Fehler, indem er die Methode ReportError aufruft.

### Vollständiger Modus

Beim Aufruf im vollständigen Modus erfolgt die Diensterstellung außerhalb des Testcodes und alle Tests sind in Testfällen und Testsuiten innerhalb einer einzigen Bibliothek organisiert.

Das folgende Beispiel erstellt eine Instanz UnitTest, deren Tests sich innerhalb des aktuellen Dokuments (ThisComponent) in der Bibliothek "Tests" befinden.

        GlobalScope.BasicLibraries.loadLibrary("ScriptForge")
        Dim myUnitTest As Variant
        myUnitTest = CreateScriptService("UnitTest", ThisComponent, "Tests")

### Ein minimalistisches Beispiel im vollständigen Modus

Beachten Sie, dass eine ODS-Datei ein Modul namens "MathUtils" in ihrer Bibliothe "Standard" mit dem folgenden Code enthält:

        ' Code im Modul Standard.MathUtils
        Function Sum(a, b) As Double
            Sum = a + b
        End Function

        Function Multiply(a, b) As Double
            Multiply = a * b
        End Function

Um eine vollständige Testsuite zu erstellen, bedenken Sie, dass eine neue Bibliothek namens "Tests" in der Datei mit einem einzelnen Modul "AllTests" erstellt wird, das den folgenden Code enthält:

        ' Code im Modul Tests.AllTests
        Sub Main()
            GlobalScope.BasicLibraries.loadLibrary("ScriptForge")
            Dim test As Variant
            test = CreateScriptService("UnitTest", ThisComponent, "Tests")
            test.RunTest("AllTests")
            test.Dispose()
        End Sub

        Sub Setup(test)
            ' Vorbereitungscode wurde vor dem ersten Testfall ausgeführt
            Dim exc As Variant
            exc = CreateScriptService("Exception")
            exc.Console(Modal := False)
        End Sub

        Sub TearDown(test)
            ' Optionaler Bereinigungscode, der nach dem letzten Testfall aufgerufen wird
        End Sub

        Sub Test_Sum(test)
            On Local Error GoTo CatchError
            test.AssertEqual(Sum(1, 1), 2, "Summe zweier positiver ganzer Zahlen")
            test.AssertEqual(Sum(-10, 20), 10, "Summe negativer und positiver ganzer Zahlen")
            test.AssertEqual(Sum(1.5, 1), 2.5, "Summe von Fließkomma- und ganzzahligen Werten")
            Exit Sub
        CatchError:
            test.ReportError("Methode Summe ist fehlgeschlagen")
        End Sub

        Sub Test_Multiply(test)
            On Local Error GoTo CatchError
            test.AssertEqual(Multiply(2, 2), 4, "Produkt zweier positiver ganzer Zahlen")
            test.AssertEqual(Multiply(-4, 2), -8, "Produkt negativer und positiver ganzer Zahlen")
            test.AssertEqual(Multiply(1.5, 3), 4.5, "Produkt von Fließkomma- und ganzzahligen Werten")
            Exit Sub
        CatchError:
            test.ReportError("Methode Produkt ist fehlgeschlagen")
        End Sub

Die obige Testsuite besteht aus zwei Testfällen Test_Sum und Test_Multiply. Um alle Tests auszuführen, führen Sie einfach die Methode Main aus dem Module "AllTests" aus.

Die Console vom Service Exception wird als Standardausgabe zum Ausgeben von Testergebnissen verwendet. Nachdem Sie das obige Beispiel ausgeführt haben, wird die folgende Ausgabe in der Konsole angezeigt:

        ' RUNTEST ENTER testsuite='Tests.AllTests', pattern='Test_*'
        '   SETUP Tests.AllTests.Setup() ENTER
        '   SETUP Tests.AllTests.Setup() EXIT
        '   TESTCASE Tests.AllTests.Test_Multiply() ENTER
        '   TESTCASE Tests.AllTests.Test_Multiply() EXIT (0,017 sec)
        '   TESTCASE Tests.AllTests.Test_Sum() ENTER
        '   TESTCASE Tests.AllTests.Test_Sum() EXIT (0,016 sec)
        '   TEARDOWN Tests.AllTests.TearDown() ENTER
        '   TEARDOWN Tests.AllTests.TearDown() EXIT
        ' RUNTEST EXIT testsuite='Tests.AllTests' (0,223 sec)

Wenn eine der Methoden AssertEqual während dieser Tests fehlschlägt, wird der Konsole eine Fehlermeldung hinzugefügt.

## Eigenschaften

Name | Schreibgeschützt | Typ | Beschreibung
--- | --- | --- | ---
LongMessage | Nein | Boolean | Wenn auf True (Standard) gesetzt, zeigt die Konsole die Standardnachricht, die an die vom Tester bereitgestellte Nachricht angehängt ist. Bei False wird nur die vom Tester definierte Nachricht verwendet.
ReturnCode | Ja | Integer | Wert, der von RunTest zurückgegeben wird, nachdem der Komponententest abgeschlossen ist. Als nächstes folgt eine Liste möglicher Werte: 0 – Test ohne Fehler beendet oder Test nicht gestartet 1 – Eine Aussage innerhalb eines Testfalls hat False zurückgegeben 2 – Ein SkipTest wurde von der Methode Setup oder durch einen der Testfälle ausgegeben. 3 - Abnormales Ende des Tests
Verbose | Nein | Boolean | Wenn auf True gesetzt, werden alle Aussagen in der Konsole gemeldet (fehlschlagend oder nicht). Bei False (Standard) werden nur fehlgeschlagene Aussagen gemeldet.
WhenAssertionFails | Nein | Integer | Definiert, was getan wird, wenn eine Aussage fehlschlägt. Als nächstes folgt eine Liste möglicher Werte: 0 - Fehler ignorieren und Test weiter ausführen 1 - Die Methode TearDown im Modul in der aktuellen Testsuite ausführen und die nächste Suite starten (Standard im vollständigen Modus). 2 - Sofort stoppen (Standard im einfachen Modus)

Liste der Methoden im Dienst "UnitTest"
AssertAlmostEqual AssertEqual AssertFalse AssertGreater AssertGreaterEqual AssertIn AssertIsInstance AssertIsNothing AssertLike | AssertNotRegex AssertIsNull AssertLess AssertLessEqual AssertNotAlmostEqual AssertNotEqual AssertNotIn AssertNotInstance AssertNotLike | AssertNotNothing AssertNotNull AssertRegex AssertTrue Fail Log ReportError RunTest SkipTest

## Argumente der Methoden "AssertX"

Alle Aussagen testen einen oder zwei Ausdrücke, die im Rest dieser Hilfeseite als A und B bezeichnet werden. Sie sind immer die ersten ein oder zwei Argumente in der Methode AssertX.

Alle Methoden AssertX akzeptieren ein Argument message, das eine benutzerdefinierte Nachricht angibt, die in der Konsole bezüglich der Behauptung gemeldet werden soll. Standardmäßig wird eine leerere Zeichenfolge verwendet. Dieses Argument steht immer an der letzten Stelle der Aussage.

Einige Methoden AssertX akzeptieren auch zusätzliche Argumente, wie unten durch ihre Syntax beschrieben.

## AssertAlmostEqual

Gibt True zurück, wenn A und B numerische Werte sind und bei gegebener relativer Toleranz als nahe beieinander betrachtet werden.

### Syntax:

svc.AssertAlmostEqual(a: any, b: any, tolerance: double = 1E-09, message: str = ""): bool

Diese Aussage gibt True zurück, wenn die beiden folgenden Bedingungen erfüllt sind:

- A und B können in den Typ Double konvertiert werden.

- Die absolute Differenz zwischen A und B dividiert durch den größten absoluten Wert von A oder B ist kleiner als der in tolerance angegebene Wert.

## AssertEqual

Gibt True zurück, wenn A und B als gleich angesehen werden.

### Syntax:

svc.AssertEqual(a: any, b: any, message: str = ""): bool

Wenn A und B Skalare sind, wird True zurückgegeben, wenn:

- Beide Ausdrücke haben denselben VarType oder sind beide numerisch.

- Boolesche und numerische Werte werden mit dem Operator = verglichen.

- Zeichenflogen werden mit der eingebauten Funktion StrComp verglichen. Beim Vergleich wird zwischen Groß- und Kleinschreibung unterschieden.

- Datum und Uhrzeit werden sekundengenau verglichen.

- Null, Empty und Nothing sind nicht gleich, aber AssertEqual(Nothing, Nothing) gibt True zurück.

- UNO-Objekte werden mit der eingebauten Methode EqualUnoObjects verglichen.

- Beachten Sie, dass Basic-Objekte niemals gleich sind.

Wenn A und B Matrizen sind, wird True zurückgegeben, wenn:

- Beide Matrizen die gleiche Anzahl an Dimensionen (bis zu 2 Dimensionen) haben und ihre unteren und oberen Grenzen für alle Dimensionen identisch sind.

- Alle Elemente in beiden Matrizen jeweils gleich sind.

- Zwei leere Matrizen werden als gleich angesehen.

## AssertFalse

Gibt True zurück, wenn der Typ von A Boolean und sein Wert False ist.

### Syntax:

svc.AssertFalse(a: any, message: str = ""): bool

## AssertGreater

Gibt True zurück, wenn A größer als B ist.

### Syntax:

svc.AssertGreater(a: any, b: any, message: str = ""): bool

Der Vergleich zwischen A und B setzt Folgendes voraus:

- Zulässige Datentypen sind String, Date oder numerisch.

- Beide Ausdrücke müssen denselben VarType haben oder beide müssen numerisch sein.

- Bei Zeichenfolgenvergleichen wird zwischen Groß- und Kleinschreibung unterschieden.

## AssertGreaterEqual

Gibt True zurück, wenn A größer oder gleich B ist.

### Syntax:

svc.AssertGreaterEqual(a: any, b: any, message: str = ""): bool

Der Vergleich zwischen A und B setzt Folgendes voraus:

- Zulässige Datentypen sind String, Date oder numerisch.

- Beide Ausdrücke müssen denselben VarType haben oder beide müssen numerisch sein.

- Bei Zeichenfolgenvergleichen wird zwischen Groß- und Kleinschreibung unterschieden.

## AssertIn

Gibt True zurück, wenn A in B gefunden wird.

### Syntax:

svc.AssertIn(a: any, b: any, message: str = ""): bool

Diese Aussage setzt Folgendes voraus:

- Ausdruck B kann eine 1D-Matrix, ein Objekt Dictionary aus ScriptForge oder eine Zeichenfolge sein.

- Wenn Ausdruck B eine 1D-Matrix ist, kann Ausdruck A ein Datum oder ein numerischer Wert sein.

- Wenn Ausdruck B ein Objekt Dictionary aus ScriptForge ist, wird die Zeichenfolge A unter den Schlüsseln in B gesucht.

- Bei Zeichenfolgenvergleichen wird zwischen Groß- und Kleinschreibung unterschieden.

## AssertIsInstance

Gibt True zurück, wenn A eine Instanz eines angegebenen Objekttyps ist, der als Zeichenfolge angegeben ist, die den Typnamen enthält.

### Syntax:

svc.AssertIsInstance(a: any, objecttype: str, message: str = ""): bool

Ausdruck A kann einer der folgenden sein:

- Ein Objekt "ScriptForge". In diesem Fall ist das Argument objecttype eine Zeichenfolge wie "DICTIONARY", "calc", "Dialog" und so weiter.

- Ein UNO-Objekt. In diesem Fall muss das Argument objecttype eine Zeichenfolge sein, die mit dem Wert identisch ist, der von der Methode SF_Session.UnoObjectType() zurückgegeben wird.

- Eine Matrix. In diesem Fall wird erwartet, dass das Argument objecttype "array" ist.

- Jede andere Variable (weder ein Object noch eine Matrix). In diesem Fall ist objecttype eine Zeichenfolge, die mit dem Wert übereinstimmt, der von der eingebauten Funktion TypeName zurückgegeben wird.

## AssertIsNothing

Gibt True zurück, wenn A ein Objekt ist, das den Wert Nothing hat.

### Syntax:

svc.AssertIsNothing(a: any, message: str = ""): bool

## AssertIsNull

Gibt True zurück, wenn A den Wert Null hat.

### Syntax:

svc.AssertIsNull(a: any, message: str = ""): bool

## AssertLess

Gibt True zurück, wenn A kleiner als B ist.

### Syntax:

svc.AssertLess(a: any, b: any, message: str = ""): bool

Der Vergleich zwischen A und B setzt Folgendes voraus:

- Zulässige Datentypen sind String, Date oder numerisch.

- Beide Ausdrücke müssen denselben VarType haben oder beide müssen numerisch sein.

- Bei Zeichenfolgenvergleichen wird zwischen Groß- und Kleinschreibung unterschieden.

## AssertLessEqual

Gibt True zurück, wenn A kleiner oder gleich B ist.

### Syntax:

svc.AssertLessEqual(a: any, b: any, message: str = ""): bool

Der Vergleich zwischen A und B setzt Folgendes voraus:

- Zulässige Datentypen sind String, Date oder numerisch.

- Beide Ausdrücke müssen denselben VarType haben oder beide müssen numerisch sein.

- Bei Zeichenfolgenvergleichen wird zwischen Groß- und Kleinschreibung unterschieden.

## AssertLike

Gibt True zurück, wenn Zeichenfolge A mit einem gegebenen Muster übereinstimmt, das Platzhalter enthält.

### Syntax:

svc.AssertLike(a: any, pattern: str = "", message: str = ""): bool

Folgende Platzhalter werden akzeptiert:

- ? – Steht für ein beliebiges einzelnes Zeichen.

- * – Steht für kein, ein oder mehrere Zeichen.

## AssertNotAlmostEqual

Gibt True zurück, wenn A und B numerische Werte sind und nicht als nahe beieinander liegend betrachtet werden, bei einer gegebenen relative Toleranz.

### Syntax:

svc.AssertNotAlmostEqual(a: any, b: any, tolerance: double = 1E-09, message: str = ""): bool

Diese Aussage gibt True zurück, wenn die beiden folgenden Bedingungen erfüllt sind:

- A und B können in den Typ Double konvertiert werden.

- Die absolute Differenz zwischen A und B geteilt durch den größten absoluten Wert von A oder B ist größer als der in tolerance angegebene Wert.

## AssertNotEqual

Gibt True zurück, wenn A und B nicht als gleich betrachtet werden.

### Syntax:

svc.AssertNotEqual(a: any, b: any, message: str = ""): bool

Diese Methode funktioniert sowohl für Skalare als auch für Matrizen. Lesen Sie die Anweisungen in AssertEqual für weitere Informationen darüber, was Gleichheit in diesem Zusammenhang bedeutet Behauptung.

## AssertNotIn

Gibt True zurück, wenn A (eine Matrix) nicht in B gefunden wird.

### Syntax:

svc.AssertNotIn(a: any, b: any, message: str = ""): bool

Lesen Sie die Anweisungen in AssertIn, um weitere Informationen zu den Annahmen dieser Methode zu erhalten.

## AssertNotInstance

Gibt True zurück, wenn A keine Instanz eines angegebenen Objekttyps ist.

### Syntax:

svc.AssertNotInstance(a: any, objecttype: str, message: str = ""): bool

Lesen Sie die Anweisungen in AssertIsInstance, um weitere Informationen zu den Annahmen dieser Methode zu erhalten.

## AssertNotLike

Gibt True zurück, wenn Zeichenfolge A nicht mit einem gegebenen Muster übereinstimmt, das Platzhalter enthält.

### Syntax:

svc.AssertNotLike(a: any, pattern: str = "", message: str = ""): bool

Lesen Sie die Anweisungen in AssertLike, um weitere Informationen zu den Annahmen dieser Methode zu erhalten.

## AssertNotNothing

Gibt True zurück, außer wenn A ein Objekt ist, das den Wert Nothing hat.

### Syntax:

svc.AssertNotNothing(a: any, message: str = ""): bool

## AssertNotNull

Gibt True zurück, außer wenn A den Wert Null hat.

### Syntax:

svc.AssertNotNull(a: any, message: str = ""): bool

## AssertNotRegex

Gibt True zurück, wenn A keine Zeichenfolge ist oder nicht mit dem gegebenen regulären Ausdruck übereinstimmt.

### Syntax:

svc.AssertNotRegex(a: any, regex: str = "", message: str = ""): bool

Beim Vergleich wird zwischen Groß- und Kleinschreibung unterschieden.

## AssertRegex

Gibt True zurück, wenn Zeichenfolge A mit dem gegebenen regulären Ausdruck übereinstimmt.

### Syntax:

svc.AssertRegex(a: any, regex: str = "", message: str = ""): bool

Beim Vergleich wird zwischen Groß- und Kleinschreibung unterschieden.

## AssertTrue

Gibt True zurück, wenn Ausdruck A Boolean und sein Wert True ist.

### Syntax:

svc.AssertTrue(a: any, message: str = ""): bool

## Fail

Erzwingt das Fehlschlagen eines Testfalls.

### Syntax:

svc.Fail(message: str = "")

Eine Nachricht kann bereitgestellt werden, um in der Konsole gemeldet zu werden.

## Log

Schreibt die angegebene Nachricht in die Konsole.

### Syntax:

svc.Log(message: str = "")

Eine Nachricht kann bereitgestellt werden, um in der Konsole gemeldet zu werden.

## ReportError

Zeigt ein Meldungsfeld mit einer Meldung und den aktuellen Eigenschaftswerten des Dienstes Exception an.

Diese Methode wird häufig im Ausnahmebehandlungsabschnitt von Sub verwendet, der den Testfall enthält, der erreicht wird, wenn eine Aussage fehlschlägt oder wenn die Methode Fail aufgerufen wird.

### Syntax:

svc.ReportError(message: str = "")

Abhängig vom Wert der Eigenschaft WhenAssertionFails kann die Testausführung fortgesetzt oder unterbrochen werden.

Beim Schreiben von Testfällen wird empfohlen, einen Aufruf der Methode ReportError in den Ausnahmebehandlungsabschnitt von Sub aufzunehmen.

Wenn die Eigenschaft LongMessage gleich True ist, folgt der Angabe von message die Beschreibung der Standardfehlermeldung. Ansonsten wird nur message angezeigt.

## RunTest

Führt die vollständige Testsuite aus, die im angegebenen Modul implementiert ist. Jeder Testfall wird unabhängig voneinander ausgeführt.

Das Ausführen einer Testsuite besteht aus:

1. Ausführen der optionalen Methode Setup, die im Modul vorhanden ist.

2. Einmaliges Ausführen jedes Testfalls, in keiner bestimmten Reihenfolge.

3. Ausführen der optionalen Methode TearDown, die im Modul vorhanden ist.

### Syntax:

svc.RunTest(testsuite: str, testcasepattern: str = "", message: str = ""): int

Das Argument testcasepattern gibt ein Muster an, zusammengesetzt aus den Platzhaltern "?" und "*", um auszuwählen, welche Testfälle ausgeführt werden. Beim Vergleich wird die Groß-/Kleinschreibung nicht beachtet.

Wenn eine message bereitgestellt wird, wird sie beim Start des Tests in die Konsole geschrieben.

## SkipTest

Unterbricht die laufende Testsuite, ohne die Methode TearDown aufzurufen.

Das Überspringen eines Tests ist normalerweise während der Methode Setup sinnvoll, wenn nicht alle Bedingungen zum Ausführen des Tests erfüllt sind.

Es liegt an der Methode Setup, das Sub kurz nach dem Aufruf von SkipTest zu verlassen.

Wenn SkipTest innerhalb eines Testfalls aufgerufen wird, wird die Ausführung der Testsuite unterbrochen und die verbleibenden Testfälle werden nicht ausgeführt. Beachten Sie, dass die Reihenfolge, in der Testfälle ausgeführt werden, innerhalb einer Testsuite beliebig ist.

### Syntax:

svc.SkipTest(message: str = "")

Wenn eine message bereitgestellt wird, wird sie in die Konsole geschrieben.

Verwandte Themen

Dienst ScriptForge.Exception