Tjenesten SFUnitTests.UnitTest

Tjenesten UnitTest giver en struktur til at automatisere enhedstests i Basic-sproget, inklusive muligheden for at:

note

Både enhedstests og koden, der skal testes, skal være skrevet i Basic. Koden, som testes, kan kalde funktioner skrevet i andre sprog.


warning

UnitTest-tjenesten er ikke tilgængelig for Python-scripts.


Definitioner

Testcase

En testcase er den individuelle testenhed. Den afprøver et specifikt respons til et bestemt set af input.

I UnitTest-tjenesten bliver en testcase repræsenteret med en enkelt Basic-Sub, hvis navn begynder med et fælles præfiks (standardpræfikset er "Test_").

Testcasen fejler hvis en af AssertX-metoderne returnerer False.

Testsamling

En testsamling er en samling af testcases, som er beregnet på at udføres sammen.

Alle testcases i en testsamling er gemt i et enkelt Basic-modul.

En testsamling kan implementere metoderne SetUp (opsæt) og TearDown (nedriv) til at forberede testcasene i dens modul.

Komponenttest

En fuld enhedstest består af et sæt af testcases i det samme Basic-bibliotek

Kald af tjeneste

Før du bruger tjenesten UnitTest skal ScriptForge-biblioteket være indlæst eller importeret:

note

• Basic-makroer kræver, at biblioteket ScriptForge indlæses med følgende udtryk:
GlobalScope.BasicLibraries.loadLibrary("ScriptForge")

• Python-scripts kræver import af scriptforge-modulet:
from scriptforge import CreateScriptService


Enkel tilstand

Kald tjenesten i simpel tilstand for at kalde AssertX-funktioner, uden at du behøver at bygge hele hierarkiet af testsamlinger og testcases.

I simpel tilstand kaldes tjenesten inde fra testcasen, som vist i eksemplet herunder:


    Sub SimpleTest
        On Local Error GoTo CatchError
        Dim myTest As Variant
        myTest = CreateScriptService("UnitTest")
        ' Nogle få dummy-tests
        myTest.AssertEqual(1 + 1, 2)
        myTest.AssertEqual(1 - 1, 0)
        MsgBox("Alle tests bestået")
        Exit Sub
    CatchError:
        myTest.ReportError("An test fejlede")
    End Sub
  

I dette eksempel sker det, at hvis nogen af AssertEqual-kaldende fejler, vil fortolkeren gå til CatchError-etiketten og rapportere fejlen ved at kalde metoden ReportError.

Fuld tilstand

Når tjenesten kaldes i fuld tilstand, er oprettelsen af tjenesten ekstern i forhold til testkoden, og alle tests er organiserede i testcases og testsamlinger i et samlet bibliotek.

Det følgende eksempel opretter en UnitTest-instans, hvis tests er placeret i det aktuelle dokument (ThisComponent) i biblioteket "Tests".


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

Et minimalistisk eksempel i fuld tilstand

Antag, at en ODS-fil har et modul kaldet "MathUtils" i dets "Standard"-bibliotek, med den følgende kode:


    ' Kode i modulet Standard.MathUtils
    Function Sum(a, b) As Double
        Sum = a + b
    End Function
    
    Function Multiply(a, b) As Double
        Multiply = a * b
    End Function
  

For at oprette en fuld testsamling, tænk på et nyt bibliotek med navnet "Test" oprettet i filen med et enkelt modul "AllTests", som indeholder koden herunder:


    ' Kode i modulet 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)
        ' Forberedelseskode, som blev udfør forud for den første testcase
        Dim exc As Variant
        exc = CreateScriptService("Exception")
        exc.Console(Modal := False)
    End Sub
    
    Sub TearDown(test)
        ' Valgfri oprydningskode, som kaldes efter den sidste testcase
    End Sub
    
    Sub Test_Sum(test)
        On Local Error GoTo CatchError
        test.AssertEqual(Sum(1, 1), 2, "Sum af to positive heltal")
        test.AssertEqual(Sum(-10, 20), 10, "Sum af negative og positive heltal")
        test.AssertEqual(Sum(1.5, 1), 2.5, "Sum af decimaltal og heltal")
        Exit Sub
    CatchError:
        test.ReportError("Metoden Sum virker ikke")
    End Sub
    
    Sub Test_Multiply(test)
        On Local Error GoTo CatchError
        test.AssertEqual(Multiply(2, 2), 4, "Multiplikation af to positive heltal")
        test.AssertEqual(Multiply(-4, 2), -8, "Multiplikation af negative og positive heltal")
        test.AssertEqual(Multiply(1.5, 3), 4.5, "Multiplikation af decimaltal og heltal")
        Exit Sub
    CatchError:
        test.ReportError("Metoden Multiply virker ikke")
    End Sub
  

Testsamlingen ovenfor består af to testcases Test_Sum og Test_Multiply. For at udføre alle tests, udfør Main-metoden fra "AllTests"-modulet.

Metoden Console fra Exception-tjenesten bliver brugt som standardoutput til at udskrive testresultater. Efter afvikling af eksemplet ovenfor vil følgende output blive vist i konsollen:


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

Hvis nogen af AssertEqual-metoderne fejler under disse tests, bliver en fejlmeddelelse tilføjet til konsollen.

Egenskaber

Navn

Skrivebeskyttet

Type

Beskrivelse

LongMessage

Nej

Boolean

Når sat til True (standard), viser konsollen standardbeskeden i forlængelse af beskeden fra testeren. Når False, bruges kun beskeden fra testeren.

ReturnCode

Ja

Integer

Værdi returneret af RunTest efter at enhedstesten er afsluttet. Her følger en liste over mulige værdier:

0 – Test afsluttet uden fejl, eller test ikke startet
1 – En påstand (assertion) i en testcase returnerede False
2 – En SkipTest blev udført af Setup-metoden eller af en af testcasene
3 – Unormal afslutning af test

Verbose

Nej

Boolean

Når sat til True, bliver alle påstande (assertions) rapporteret i konsollen (med eller uden fejl). Når False (standard), bliver kun påstande som fejler rapporterede.

WhenAssertionFails

Nej

Integer

Definerer, hvad der gøres, når en påstand mislykkes. Dernæst er en liste over mulige værdier:

0 – Ignorér fejlen og fortsæt afviklingen af testen
1 – TearDown-metoden i modulet udføres i den aktuelle testsamlingen, og den næste testsamling startes (standardværdi i fuld tilstand).
2 – Stop med det samme (standardværdi i simpel tilstand)


Liste over metoder i tjenesten 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


Argumenter til AssertX-metoder

Alle påstande (assertions) tester et eller to udtryk, som i resten af denne hjælpeside kaldes A og B. De er altid det første eller de to første argumenter i AssertX-metoden.

Alle AssertX-metoder accepterer et message-argument (besked), som angiver en selvvalgt besked om påstanden, der skal rapporteres i konsollen. Som standard bruges en tom streng. Beskeden er altid argumentet i sidste position af AssertX-metoden.

Nogle AssertX-metoder accepterer også yderligere argumenter, som beskrevet af deres syntakser herunder.

AssertAlmostEqual

Returnerer True når A og B er numeriske værdier og betragtes som tæt på hinanden, ud fra en given relativ tolerance.

Syntaks:

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

Denne påstand returner True, hvis to betingelser er opfyldt:

AssertEqual

Returnerer True når A og B betragtes som lig med hinanden.

Syntaks:

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

Når A og B er enkeltværdier (skalarer), bliver True returneret hvis:

Når A og B er arrays, returneres True hvis:

AssertFalse

Returnerer True når typen af A er Boolean og værdien er False.

Syntaks:

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

AssertGreater

Returnerer True når A er større end B.

Syntaks:

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

Sammenligningen mellem A og B forudsætter følgende:

AssertGreaterEqual

Returnerer True når A er større end eller lig med B.

Syntaks:

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

Sammenligningen mellem A og B forudsætter følgende:

AssertIn

Returnerer True når A kan findes i B.

Syntaks:

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

Denne påstand forudsætter følgende:

AssertIsInstance

Returnerer True når A er en instans af en angivet objekttype, specificeret som en streng med typenavnet.

Syntaks:

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

Udtryk A kan være et af følgende:

AssertIsNothing

Returnerer True, når A er et objekt, som har værdien Nothing.

Syntaks:

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

AssertIsNull

Returnerer True når A har værdien Null.

Syntaks:

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

AssertLess

Returnerer True når A er mindre end B.

Syntaks:

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

Sammenligningen mellem A og B forudsætter følgende:

AssertLessEqual

Returnerer True når A er mindre end eller lig med B.

Syntaks:

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

Sammenligningen mellem A og B forudsætter følgende:

AssertLike

Returnerer True hvis strengen A matcher et givet mønster med jokertegn.

Syntaks:

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

Følgende jokertegn accepteres:

AssertNotAlmostEqual

Returnerer True, når A og B er numeriske værdier og ikke betragtes som tæt på hinanden, givet en relativ tolerance.

Syntaks:

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

Denne påstand returnerer True, hvis nedenstående to betingelser er opfyldt:

AssertNotEqual

Returnerer True når A og B ikke betragtes som lig med hinanden.

Syntaks:

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

Denne metode kan bruges på både enkeltværdier (skalarer) og arrays. Læs instruktionen til AssertEqual for mere information om, hvad "lig med" betyder i denne påstand.

AssertNotIn

Returnerer True, når A (en streng) ikke findes i B.

Syntaks:

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

Læs instruktionen til AssertIn for mere information om antagelserne for denne metode.

AssertNotInstance

Returnerer True, når A ikke er en instans af en angivet objekttype.

Syntaks:

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

Læs instruktionerne til AssertIsInstance for mere information of antagelserne for denne metode.

AssertNotLike

Returnerer True, hvis strengen A ikke matcher et givet mønster med jokertegn.

Syntaks:

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

Læs instruktionerne for AssertLike for mere information om antagelserne for denne metode.

AssertNotNothing

Returnerer True, undtagen når A er et objekt som har værdien Nothing.

Syntaks:

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

AssertNotNull

Returnerer True, undtagen når A har værdien Null.

Syntaks:

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

AssertNotRegex

Returnerer True, når A ikke er en streng eller ikke matcher det angivne regulære udtryk.

Syntaks:

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

Sammenligningen skelner mellem store og små bogstaver.

AssertRegex

Returnerer True når strengen A matcher det angivne regulære udtryk.

Syntaks:

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

Sammenligningen skelner mellem store og små bogstaver.

AssertTrue

Returnerer True, når udtrykket A er en Boolean (boolsk udtryk), og udtrykkets værdi er True.

Syntaks:

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

Fail

Tvinger en test til at mislykkes.

Syntaks:

svc.Fail(message: str = "")

Der kan leveres en besked, der skal rapporteres i konsollen.

Log

Skriver den angivne message (besked) i konsollen.

Syntaks:

svc.Log(message: str = "")

Der kan leveres en besked, der skal rapporteres i konsollen.

ReportError

Viser et beskedfelt med en besked og de aktuelle egenskabsværdier for Exception-tjenesten.

Denne metode bruges ofte i undtagelseshåndterings-sektionen af den Sub, som indeholder den testcase der er nået, når en påstand fejler eller når Fail-metoden bliver kaldt.

Syntaks:

svc.ReportError(message: str = "")

Afhængigt af værdien af egenskaben WhenAssertionFails kan testafviklingen fortsætte eller blive afbrudt.

Når du skriver testcases er det anbefalet at inkludre et kald til metoden ReportError i undtagelseshåndterings-sektionen af den tilhørende Sub.

Hvis egenskaben LongMessage er lig med True, så følges den angivne message (besked) af standard-fejlmeldingsbeskrivelsen. Eller vises kun message.

RunTest

Udfører hele testpakken implementeret i det angivne modul. Hver testcase køres uafhængigt af hinanden.

Kørsel af en testsamling består af:

  1. Afvikling af den valgfrie Setup-metode, hvis den findes i modulet.

  2. Afvikling én gang af hver testcase, uden nogen bestemt rækkefølge.

  3. Afvikling af den valgfrie TearDown-metode, hvis den findes i modulet.

Syntaks:

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

Argumentet testcasepattern (testcase_mønster) angiver et mønster med "?" og "*" jokertegn til at udvælge, hvilke testcases der skal udføres. Sammenligningen skelner ikke mellem store og små bogstaver.

Hvis argumentet message (besked) er angivet, skrives det på konsollen når testet starter.

SkipTest

Afbryder den igangværende testsamling uden at kalde TearDown-metoden.

At skippe en test giver normalt mest mening under Setup-metoden, hvis ikke alle betingelser for at køre testen er opfyldt.

Det er op til Setup-metoden at afslutte Sub kort efter kaldet af SkipTest.

Hvis SkipTest bliver inde fra en testcase, så bliver afviklingen af testsamlingen afbrudt, og de tilbageværende testcases bliver ikke kørt. Husk at testcasene i en testsamling udføres i vilkårlig rækkefølge.

Syntaks:

svc.SkipTest(message: str = "")

Hvis argumentet message (besked) er angivet, bliver det skrevet til konsollen.

Støt os venligst!