Inhoud

# service SFUnitTests.UnitTest

De service UnitTest biedt een raamwerk voor het automatiseren van unit-tests met behulp van de Basic-taal, inclusief de mogelijkheid om:

- Testgevallen in testsuites en unittests samenvoegen.

- Setup- en afsluitcode delen tussen testcases.

- Testresultaten rapporteren met behulp van de Console.

Zowel de unit tests als de te testen code moeten in Basic zijn geschreven. De code die wordt getest, kan functies aanroepen die in andere talen zijn geschreven.

De service UnitTest is niet beschikbaar voor Python-scripts.

## Definities

### Testgeval

Een testgeval is de individuele testeenheid. Het controleert op een specifiek antwoord op een bepaalde set invoer.

In de service UnitTest wordt een testgeval vertegenwoordigd door een enkele Basic Sub waarvan de naam begint met een algemeen voorvoegsel (de standaardinstelling is "Test_").

Het testgeval mislukt als één van de AssertX-methodes False retourneert.

### Testpakket

Een testpakket is een verzameling testgevallen die samen moeten worden uitgevoerd.

Alle testgevallen van een testpakket worden opgeslagen in één Basic-module.

Een testpakket kan de methodes SetUp en TearDown implementeren om zich voor te bereiden op testgevallen in zijn module.

### Eenheidstest

Een volledige eenheidstest bestaat uit een set testpakketten in dezelfde Basic-bibliotheek.

## Service-aanroep

Voordat u de service UnitTest gebruikt, moet de ScriptForge-bibliotheek worden geladen of geïmporteerd:

• Basic macro's kunnen de bibliotheek ScriptForge laden met de instructie:
GlobalScope.BasicLibraries.loadLibrary("ScriptForge")
• Python scripts kunnen de module scriptforge importeren met:
from scriptforge import CreateScriptService

### Eenvoudige modus

Roep de service aan in de eenvoudige modus om AssertX-functies aan te roepen zonder de volledige hiërarchie van testpakketten en testgevallen te hoeven bouwen.

In de eenvoudige modus wordt de service aangeroepen in de testgeval, zoals weergegeven in het onderstaande voorbeeld:

        Sub SimpleTest
            On Local Error GoTo CatchError
            Dim myTest As Variant
            myTest = CreateScriptService("UnitTest")
            ' Een paar dummy-tests
            myTest.AssertEqual(1 + 1, 2)
            myTest.AssertEqual(1 - 1, 0)
            MsgBox("Alle testen geslaagd")
            Exit Sub
        CatchError:
            myTest.ReportError("Een test is mislukt")
        End Sub

Als in dit voorbeeld één van de AssertEqual-aanroepen mislukt, gaat de interpreter naar het label CatchError en rapporteert de fout door de methode ReportError aan te roepen .

### Volledige modus

Wanneer aangeroepen in volledige modus, is het maken van de service buiten de testcode en worden alle tests georganiseerd in testgevallen en testpakketten in een enkele bibliotheek.

In het volgende voorbeeld wordt een UnitTest-instantie gemaakt waarvan de tests zich in het huidige document (ThisComponent) in de bibliotheek "Tests" bevinden.

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

### Een minimalistisch voorbeeld in volledige modus

Bedenk dat een ODS-bestand een module heeft met de naam "MathUtils" in zijn "Standard"-bibliotheek met de volgende code:

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

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

Om een volledig testpakket te maken, moet u er rekening mee houden dat er een nieuwe bibliotheek met de naam "Tests" in het bestand wordt gemaakt met een enkele module "AllTests" die de onderstaande code bevat:

        ' Code in module 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)
            ' Voorbereidingscode liep voorafgaand aan de eerste testcase
            Dim exc As Variant
            exc = CreateScriptService("Exception")
            exc.Console(Modal := False)
        End Sub

        Sub TearDown(test)
            ' Optionele opschooncode aangeroepen na de laatste testcase
        End Sub

        Sub Test_Sum(test)
            On Local Error GoTo CatchError
            test.AssertEqual(Sum(1, 1), 2, "Tel twee positieve gehele getallen op")
            test.AssertEqual(Sum(-10, 20), 10, "Som van negatieve en positieve gehele getallen")
            test.AssertEqual(Sum(1.5, 1), 2.5, "Som van zwevende waardes en gehele getallen")
            Exit Sub
        CatchError:
            test.ReportError("Sommethode is mislukt")
        End Sub

        Sub Test_Multiply(test)
            On Local Error GoTo CatchError
            test.AssertEqual(Multiply(2, 2), 4, "Vermenigvuldig twee positieve gehele getallen")
            test.AssertEqual(Multiply(-4, 2), -8, "Vermenigvuldig negatieve en positieve gehele getallen")
            test.AssertEqual(Multiply(1.5, 3), 4.5, "Vermenigvuldigen van zwevende waardes en gehele getallen")
            Exit Sub
        CatchError:
            test.ReportError("Vermenigvuldigingsmethode is mislukt")
        End Sub

Bovenstaand testpakket bestaat uit twee testgevallen Test_Sum en Test_Multiply. Om alle tests uit te voeren, voert u gewoon de methode Main uit vanuit de module "AllTests".

De Console van de service Exception is gebruikt als de standaarduitvoer om testresultaten af te drukken. Na het uitvoeren van het bovenstaande voorbeeld, wordt de volgende uitvoer weergegeven in de console:

        ' 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)

Als één van de AssertEqual-methodes faalt tijdens deze tests, wordt een foutbericht toegevoegd aan de console.

## Eigenschappen

Naam | Alleen lezen | Type | Beschrijving
--- | --- | --- | ---
LongMessage | Nee | Boolean | Indien ingesteld op True (standaard) toont de console het standaardbericht dat is toegevoegd aan het bericht dat door de tester is verstrekt. Indien False, wordt alleen het bericht gebruikt dat door de tester is gedefinieerd.
ReturnCode | Ja | Integer | Waarde die wordt geretourneerd door RunTest nadat de eenheidstest is voltooid. Hierna volgt een lijst met mogelijke waardes: 0 - Test voltooid zonder fouten of test niet gestart 1 - Een bewering binnen een testcase geretourneerd False 2 - Een SkipTest is uitgegeven door de Setup-methode of door één van de testgevallen. 3 - Abnormaal einde van de test
Verbose | Nee | Boolean | Indien ingesteld op True, worden alle beweringen gerapporteerd in de console (al dan niet mislukt). Indien False (standaard), worden alleen falende beweringen gerapporteerd.
WhenAssertionFails | Nee | Integer | Definieert wat er wordt gedaan als een bewering mislukt. Hierna volgt een lijst met mogelijke waardes: 0 - Negeer de fout en ga door met het uitvoeren van de test 1 - De TearDown-methode in de module wordt uitgevoerd in de huidige testsuite en de volgende suite wordt gestart (standaard in volledige modus). 2 - Stop onmiddellijk (standaard in eenvoudige modus)

Lijst met methodes in de service 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

## Argumenten van de AssertX-methodes

Alle beweringen testen één of twee expressies, waarnaar in de rest van deze helppagina wordt verwezen als A en B. Het zijn altijd de eerste één of twee argumenten in de AssertX-methode.

Alle AssertX-methodes accepteren een message-argument dat een aangepast bericht specificeert dat in de console moet worden gerapporteerd met betrekking tot de bewering. Standaard wordt een lege tekenreeks gebruikt. Dit argument bevindt zich altijd in de laatste positie van de bewering.

Sommige AssertX-methodes accepteren ook aanvullende argumenten, zoals hieronder beschreven door hun syntaxis.

## AssertAlmostEqual

Retourneert True indien A en B numerieke waardes zijn en worden geacht dicht bij elkaar te liggen, gegeven een relatieve tolerantie.

### Syntaxis:

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

Deze bewering retourneert True als aan de twee onderstaande voorwaarden is voldaan:

- A en B kunnen worden geconverteerd naar het type Double.

- Het absolute verschil tussen A en B gedeeld door de grootste absolute waarde van A of B is lager dan de waarde gespecificeerd in tolerance.

## AssertEqual

Retourneert True indien A en B als gelijk worden beschouwd.

### Syntaxis:

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

Als A en B scalaire waardes zijn, wordt True geretourneerd als:

- Beide expressies hebben hetzelfde VarType of zijn beide numeriek.

- Booleaanse en numerieke waardes worden vergeleken met de = operator.

- Tekenreeksen worden vergeleken met de ingebouwde functie StrComp. De vergelijking is hoofdlettergevoelig.

- Datums en tijden worden tot op de seconde vergeleken.

- Null, Empty en Nothing zijn niet gelijk, maar AssertEqual(Nothing, Nothing) retourneert True.

- UNO-objecten worden vergeleken met de ingebouwde EqualUnoObjects-methode.

- Merk op dat basisobjecten nooit gelijk zijn.

Als A en B matrixen zijn, wordt True geretourneerd als:

- Beide matrixen hebben hetzelfde aantal dimensies (maximaal 2 dimensies) en hun onder- en bovengrenzen zijn identiek voor alle dimensies.

- Alle items in beide matrixen zijn één voor één gelijk.

- Twee lege matrixen worden als gelijk beschouwd.

## AssertFalse

Retourneert True wanneer het type A Boolean is en de waarde False is.

### Syntaxis:

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

## AssertGreater

Retourneert True indien A groter is dan B.

### Syntaxis:

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

De vergelijking tussen A en B gaat uit van het volgende:

- Geschikte gegevenstypes zijn Tekenreeks, Datum of numeriek.

- Beide expressies moeten hetzelfde VarType hebben of beide moeten numeriek zijn.

- Tekenreeksvergelijkingen zijn hoofdlettergevoelig.

## AssertGreaterEqual

Retourneert True indien A groter is dan of gelijk is aan B.

### Syntaxis:

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

De vergelijking tussen A en B gaat uit van het volgende:

- Geschikte gegevenstypes zijn Tekenreeks, Datum of numeriek.

- Beide expressies moeten hetzelfde VarType hebben of beide moeten numeriek zijn.

- Tekenreeksvergelijkingen zijn hoofdlettergevoelig.

## AssertIn

Retourneert True indien A wordt gevonden in B.

### Syntaxis:

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

Deze bewering gaat uit van het volgende:

- Expressie B kan een 1D-matirix, een ScriptForge Dictionary-object of een tekenreeks zijn.

- Als uitdrukking B een 1D-matrix is, kan uitdrukking A een datum of een numerieke waarde zijn.

- Als uitdrukking B een ScriptForge Dictionary-object is, wordt er gezocht naar tekenreeks A tussen de sleutels in B.

- Tekenreeksvergelijkingen zijn hoofdlettergevoelig.

## AssertIsInstance

Retourneert True indien A een instantie is van een opgegeven objecttype, opgegeven als een tekenreeks die de typenaam bevat.

### Syntaxis:

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

Expressie A kan één van de volgende zijn:

- Een ScriptForge-object. In dit geval is het argument objecttype een tekenreeks zoals "DICTIONARY", "calc", "Dialog", enz.

- Een UNO-object. In dit geval moet het argument objecttype een tekenreeks zijn die identiek is aan de waarde die wordt geretourneerd door de methode SF_Session.UnoObjectType().

- Een matrix. In dit geval wordt verwacht dat het argument objecttype "matrix" is.

- Elke andere variabele (noch een Object noch een Matrix). In dit geval is objecttype een tekenreeks die overeenkomt met de waarde die wordt geretourneerd door de ingebouwde functie TypeName.

## AssertIsNothing

Retourneert True indien A een object is met de waarde Nothing.

### Syntaxis:

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

## AssertIsNull

Retourneert True indien A de waarde Null heeft.

### Syntaxis:

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

## AssertLess

Retourneert True indien A kleiner is dan B.

### Syntaxis:

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

De vergelijking tussen A en B gaat uit van het volgende:

- Geschikte gegevenstypes zijn Tekenreeks, Datum of numeriek.

- Beide expressies moeten hetzelfde VarType hebben of beide moeten numeriek zijn.

- Tekenreeksvergelijkingen zijn hoofdlettergevoelig.

## AssertLessEqual

Retourneert True indien A kleiner is dan of gelijk is aan B.

### Syntaxis:

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

De vergelijking tussen A en B gaat uit van het volgende:

- Geschikte gegevenstypes zijn Tekenreeks, Datum of numeriek.

- Beide expressies moeten hetzelfde VarType hebben of beide moeten numeriek zijn.

- Tekenreeksvergelijkingen zijn hoofdlettergevoelig.

## AssertLike

Retourneert True als tekenreeks A overeenkomt met een bepaald patroon dat jokertekens bevat.

### Syntaxis:

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

De volgende jokertekens worden geaccepteerd:

- ? - Vertegenwoordigt een enkel teken.

- * - Staat voor nul, één of meerdere tekens.

## AssertNotAlmostEqual

Retourneert True indien A en B numerieke waardes zijn en niet als dicht bij elkaar worden beschouwd, gegeven een relatieve tolerantie.

### Syntaxis:

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

Deze bewering retourneert True als aan de twee onderstaande voorwaarden is voldaan:

- A en B kunnen worden geconverteerd naar het type Double.

- Het absolute verschil tussen A en B gedeeld door de grootste absolute waarde van A of B is groter dan de waarde gespecificeerd in tolerance.

## AssertNotEqual

Retourneert True indien A en B niet als gelijk worden beschouwd.

### Syntaxis:

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

Deze methode werkt zowel voor scalairen als voor matrixen. Lees de instructies in AssertEqual voor meer informatie over wat gelijkheid in deze bewering betekent.

## AssertNotIn

Retourneert True indien A (een tekenreeks) niet wordt gevonden in B.

### Syntaxis:

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

Lees de instructies in AssertIn voor meer informatie over de aannames van deze methode .

## AssertNotInstance

Retourneert True indien A geen instantie is van een opgegeven objecttype.

### Syntaxis:

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

Lees de instructies in AssertIsInstance voor meer informatie over de aannames van deze methode .

## AssertNotLike

Retourneert True als tekenreeks A niet overeenkomt met een bepaald patroon dat jokertekens bevat.

### Syntaxis:

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

Lees de instructies in AssertLike voor meer informatie over de aannames van deze methode .

## AssertNotNothing

Retourneert True behalve indien A een object is met de waarde Nothing.

### Syntaxis:

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

## AssertNotNull

Retourneert True behalve wanneer A de waarde Null heeft.

### Syntaxis:

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

## AssertNotRegex

Retourneert True indien A geen tekenreeks is of niet overeenkomt met de opgegeven reguliere expressie.

### Syntaxis:

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

De vergelijking is hoofdlettergevoelig.

## AssertRegex

Retourneert True indien tekenreeks A overeenkomt met de opgegeven reguliere expressie.

### Syntaxis:

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

De vergelijking is hoofdlettergevoelig.

## AssertTrue

Retourneert True indien uitdrukking A een Boolean is en de waarde True is.

### Syntaxis:

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

## Fail

Dwingt een testgeval te mislukken.

### Syntaxis:

svc.Fail(message: str = "")

Er kan een bericht worden opgegeven om in de console te worden gerapporteerd.

## Log

Schrijft het opgegeven bericht in de console.

### Syntaxis:

svc.Log(message: str = "")

Er kan een bericht worden opgegeven om in de console te worden gerapporteerd.

## ReportError

Geeft een berichtvenster weer met een bericht en de huidige eigenschapswaardes van de service Exception.

Deze methode wordt vaak gebruikt in de sectie voor het afhandelen van uitzonderingen van de Sub die dit testgeval bevat, die wordt bereikt wanneer een bewering mislukt of wanneer de methode Fail wordt aangeroepen.

### Syntaxis:

svc.ReportError(message: str = "")

Afhankelijk van de waarde van de eigenschap WhenAssertionFails, kan de testuitvoering doorgaan of worden onderbroken.

Bij het schrijven van testgevallen wordt aanbevolen om een aanroep van de methode ReportError op te nemen in de sectie voor het afhandelen van uitzonderingen van de Sub.

Als de eigenschap LongMessage gelijk is aan True, wordt het opgegeven bericht gevolgd door de standaardbeschrijving van het foutbericht. Anders wordt alleen het bericht weergegeven.

## RunTest

Voert het volledige testpakket uit die in de opgegeven module is geïmplementeerd. Elk testgeval wordt onafhankelijk van elkaar uitgevoerd.

Het runnen van een testpakket bestaat uit:

1. De optionele Setup-methode uitvoeren die aanwezig is in de module.

2. Elk testgeval één keer uitvoeren, in willekeurige volgorde.

3. De optionele TearDown-methode uitvoeren die aanwezig is in de module.

### Syntaxis:

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

Het argument testcasepattern specificeert een patroon dat bestaat uit "?" en "*" jokertekens om te selecteren welke testgevallen worden uitgevoerd. De vergelijking is niet hoofdlettergevoelig.

Als er een bericht wordt gegeven, wordt dit naar de console geschreven wanneer de test start.

## SkipTest

Onderbreekt het lopende testpakket zonder de methode TearDown aan te roepen.

Het overslaan van een test is meestal zinvol tijdens de Setup-methode wanneer niet aan alle voorwaarden voor het uitvoeren van de test wordt voldaan.

Het is aan de Setup-methode om de Sub kort na de SkipTest-aanroep af te sluiten.

Als SkipTest wordt aangeroepen vanuit een testgeval, wordt de uitvoering van het testpakket onderbroken en worden de overige testgevallen niet uitgevoerd. Houd er rekening mee dat de volgorde waarin testgevallen worden uitgevoerd willekeurig is binnen een testpakket.

### Syntaxis:

svc.SkipTest(message: str = "")

Als er een bericht wordt gegeven, wordt dit naar de console geschreven.

Verwante onderwerpen

service ScriptForge.Exception

Help ons, alstublieft!