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:

note

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.


warning

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 een van de AssertX-methoden 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 methoden 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:

note

• 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 een 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 waarden 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 waarden 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 een van de AssertEqual-methoden 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 waarden:

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

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

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

Alle AssertX-methoden 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-methoden accepteren ook aanvullende argumenten, zoals hieronder beschreven door hun syntaxis.

AssertAlmostEqual

Retourneert True indien A en B numerieke waarden 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:

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 waarden zijn, wordt True geretourneerd als:

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

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:

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:

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:

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 een van de volgende zijn:

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:

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:

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:

AssertNotAlmostEqual

Retourneert True indien A en B numerieke waarden 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:

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

Help ons, alstublieft!