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 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:

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 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.

Bitte unterstĂŒtzen Sie uns!