Dienst SFUnitTests.UnitTest

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

note

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.


warning

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:

note

• 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 festlegt, 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:

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:

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

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:

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:

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:

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:

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:

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:

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:

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:

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 legt ein Muster fest, 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.

Bitte unterstützen Sie uns!