Vsebina

# Storitev SFDocuments.UnitTest

Storitev UnitTest ponuja ogrodje za samodejne preizkuse enot z rabo jezika Basic, vključno z naslednjimi možnostmi:

- Iz testnih primerov tvorite nabore testov in teste modulov.

- Delite kodo zagona in izklopa med testnimi primeri.

- Poročajte o rezultatih preizkusov z uporabo Console,

Tako testni primeri kot koda, ki jo preizkušate, mora biti zapisana v programskem jeziku Basic. Koda, ki jo preizkušate, lahko kliče funkcije, zapisane v drugih jezikih.

Storitev UnitTest ni na voljo za skripte v Pythonu.

## Definicije

### Testni primer

Testni primer (angl. test case) je posamezna enota preizkusa. Preveri določen odziv na dani vnos.

V storitvi UnitTest predstavlja testni primer posamezna procedura Sub v Basicu, katere ime se začne s skupno predpono (privzeto je to »Test_«).

Če testni primer spodleti, ena od metod AssertX vrne False.

### Nabor testov

Nabor testov (angl. test suite) je zbirka testnih primerov, ki jih je potrebno izvesti skupaj.

Vsi testni primeri nabora testov so shranjeni v enem samem modulu Basic.

Nabor testov lahko implementira metodi SetUp in TearDown za pripravo testnih primerov v svojem modulu.

### Test modula

Preizkus celotnega modula sestavlja več naborov testov v isti knjižnici Basic.

## Priklic storitve

Pred uporabo storitve UnitTest je potrebno naložiti ali uvoziti knjižnico ScriptForge:

• Za makre Basic mora biti naložena knjižnica ScriptForge z naslednjim ukazom:
GlobalScope.BasicLibraries.loadLibrary("ScriptForge")
• Za skripte Python mora biti opravljen uvoz iz modula scriptforge:
from scriptforge import CreateScriptService

### Enostavni način

Storitev prikličite v enostavnem načinu, da kliče funkcije AssertX brez potrebe po izgradnji polne hierarhije naborov testov in testnih primerov.

V enostavnem načinu se storitev kliče v samem testnem primeru, kar prikazuje spodnji primer:

        Sub SimpleTest
            On Local Error GoTo CatchError
            Dim myTest As Variant
            myTest = CreateScriptService("UnitTest")
            ' Nekaj praznih testov
            myTest.AssertEqual(1 + 1, 2)
            myTest.AssertEqual(1 - 1, 0)
            MsgBox("Vsi testi so uspeli")
            Exit Sub
        CatchError:
            myTest.ReportError("Preizkus je spodletel")
        End Sub

Če v tem primeru kateri od klicev AssertEqual spodleti, se tolmač pomakne k oznaki CatchError in poroča o napaki s klicem metode ReportError.

### Polni način

Če je priklicana v polnem načinu, se storitev tvori izven kode testa in vsi testi so organizirani v nabore testov in teste modulov v eni sami knjižnici.

Naslednji primer ustvari instanco UnitTest, katere testi se nahajajo v trenutnem dokumentu (ThisComponent) v knjižnici »Tests«.

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

### Minimalističen primer v polnem načinu

Upoštevajte, da ima datoteka ODS v svoji knjižnici »Standard« modul »MathUtils« z naslednjo kodo:

        ' Koda v modulu Standard.MathUtils
        Function Sum(a, b) As Double
            Sum = a + b
        End Function

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

Za izdelavo polnega nabora testov vzemimo, da ustvarimo novo knjižnico »Tests« v datoteki z enim samim modulom »AllTests«, ki vsebuje spodnjo kodo:

        ' Koda v modulu 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)
            ' Pripravljalna koda, izvedena pred prvim testnim primerom
            Dim exc As Variant
            exc = CreateScriptService("Exception")
            exc.Console(Modal := False)
        End Sub

        Sub TearDown(test)
            ' Neobvezna koda čiščenja, klicana po zadnjem testnem primeru
        End Sub

        Sub Test_Sum(test)
            On Local Error GoTo CatchError
            test.AssertEqual(Sum(1, 1), 2, "Vsota dveh pozitivnih celih števil")
            test.AssertEqual(Sum(-10, 20), 10, "Vsota negativnega in pozitivnega celega števila")
            test.AssertEqual(Sum(1.5, 1), 2.5, "Vsota vrednosti števila s plavajočo vejico in celega števila")
            Exit Sub
        CatchError:
            test.ReportError("Metoda Sum je okvarjena")
        End Sub

        Sub Test_Multiply(test)
            On Local Error GoTo CatchError
            test.AssertEqual(Multiply(2, 2), 4, "Zmnožek dveh pozitivnih celih števil")
            test.AssertEqual(Multiply(-4, 2), -8, "Zmnožek negativnega in pozitivnega celega števila")
            test.AssertEqual(Multiply(1.5, 3), 4.5, "Zmnožek vrednosti števila s plavajočo vejico in celega števila")
            Exit Sub
        CatchError:
            test.ReportError("Metoda Multiply je okvarjena")
        End Sub

Zgornji test modula sestavljata nabora testov Test_Sum in Test_Multiply. Za izvajanje vseh testov enostavno zaženite metodo Main iz modula »AllTests«.

Console iz storitve Exception se uporablja kot privzeti izhod za izpis rezultatov testov. Po izvajanju zgornjega primera se bo v konzoli prikazal naslednji izpis:

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

Če katera od metod AssertEqual spodleti med temi preizkusi, se v konzolo doda ustrezno sporočilo.

## Lastnosti

Ime | Samo za branje | Vrsta | Opis
--- | --- | --- | ---
LongMessage | Ne | Boolean | Če je nastavljeno na True (privzeto), konzola prikaže standardno sporočilo, dodano sporočilu, ki ga zagotovi preizkuševalec. Če je False, bo uporabljeno le sporočilo, ki ga je določil preizkuševalec.
ReturnCode | Da | Integer | Vrednost, ki jo vrne RunTest po zaključku nabora testov. Sledi seznam možnih vrednosti: 0 – Test se je končal brez napak ali se sploh ni začel. 1 – Validacijska točka v testnem primeru je vrnila False. 2 – Metoda Setup ali eden od testnih primerov je podal SkipTest. 3 – Nenormalen konec testa.
Verbose | Ne | Boolean | Če je nastavljeno na True, v konzoli poroča o vseh validacijskih točkah (spodletelih in uspelih). Če je False (privzeto), poroča le o validacijskih točkah, kjer je test spodletel.
WhenAssertionFails | Ne | Integer | Določa, kaj se zgodi, ko validacijska točka spodleti. Sledi seznam možnih vrednosti: 0 – Prezri neuspeh in nadaljuj z izvajanjem testa. 1 – Metoda TearDown v modulu je izvedena v trenutni zbirki testov in naslednja zbirka je zagnana (privzeto v polnem načinu). 2 – Nemudoma ustavi (privzeto v enostavnem načinu).

Seznam metod v storitvi 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

## Argumenti metod AssertX

Vse validacijske točke preizkušajo enega ali dva izraza, na katera se v preostanku strani pomoči sklicujemo kot na A in B. To je vedno prvi oz. prva argumenta metode AssertX.

Vse metode AssertX sprejmejo argument message, ki določa sporočilo po meri, ki bo poslano v konzolo glede validacijske točke. Privzeto se uporabi prazen niz. Ta argument je vedno na zadnjem položaju validacijske točke.

Nekatere metode AssertX sprejmejo tudi dodatne argumente, kot to opisuje spodnja skladnja.

## AssertAlmostEqual

Vrne True, če sta A in B številski vrednosti in štejeta za bližnji pri dani relativni toleranci.

### Skladnja:

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

Ta validacijska točka vrne True, če sta izpolnjena sledeča pogoja:

- A in B je mogoče pretvoriti v vrsto Double.

- Absolutna razlika med A in B, deljena z največjo absolutno vrednostjo A ali B, je nižja od vrednosti, določene z vrednostjo tolerance.

## AssertEqual

Vrne True, ko A in B veljata za enaka.

### Skladnja:

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

Če sta A in B skalarja, vrne True, če:

- Oba izraza morata imeti isti VarType ali pa morata biti oba številska.

- Logične in številske vrednosti se primerjajo z operatorjem =.

- Nizi se primerjajo z vgrajeno funkcijo StrComp. Primerjava razlikuje med malimi in velikimi črkami.

- Datumi in časi se primerjajo do sekunde natančno.

- Null, Empty in Nothing niso enakovredni, toda AssertEqual(Nothing, Nothing) vrne True.

- Predmeti UNO se primerjajo z vgrajeno metodo EqualUnoObjects.

- Upoštevajte, da predmeti Basic nikoli niso enaki.

Če sta A in B polji, vrne True, če:

- Obe polji imata enako število dimenzij (do dve) in njuni spodnji in zgornji meji sta identični za vse dimenzije.

- Vsi elementi v obeh poljih so enaki, eden za drugim.

- Dve prazni polji veljata za enakovredni.

## AssertFalse

Vrne True, če je A vrste Boolean in je njena vrednost False.

### Skladnja:

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

## AssertGreater

Vrne True, če je A večji od B.

### Skladnja:

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

Primerjava med A in B predvideva naslednje:

- Ustrezne vrste podatkov so String (niz), Date (datum) ali številske (več vrst).

- Oba izraza morata imeti isti VarType ali pa morata biti oba številska.

- Primerjava nizov razlikuje med velikimi in malimi črkami.

## AssertGreaterEqual

Vrne True, če je A večji ali enak B.

### Skladnja:

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

Primerjava med A in B predvideva naslednje:

- Ustrezne vrste podatkov so String (niz), Date (datum) ali številske (več vrst).

- Oba izraza morata imeti isti VarType ali pa morata biti oba številska.

- Primerjava nizov razlikuje med velikimi in malimi črkami.

## AssertIn

Vrne True, če najde A v B.

### Skladnja:

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

Ta validacijska točka predvideva naslednje:

- Izraz B je lahko 1-dimenzionalno polje, predmet Dictionary ScriptForge ali niz.

- Če je izraz B 1-dimenzionalno polje, je izraz A lahko datum ali številska vrednost.

- Če je izraz B predmet slovarja Dictionary ScriptForge, se niz A išče med ključi v B.

- Primerjava nizov razlikuje med velikimi in malimi črkami.

## AssertIsInstance

Vrne True, če je A instanca navedene vrste predmeta, določena kot niz, ki vsebuje ime vrste.

### Skladnja:

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

Izraz A je lahko nekaj od naslednjega:

- Predmet ScriptForge. V tem primeru je argument objecttype niz, kakršni so »DICTIONARY«, »calc«, »Dialog« itn.

- Predmet UNO. V tem primeru mora biti argument objecttype niz, identičen vrednosti, ki jo vrne metoda SF_Session.UnoObjectType().

- Polje. V tem primeru je pričakovano, da je argument objecttype »array«.

- Vsaka druga spremenljivka (niti Object niti Array). V tem primeru je objecttype niz, ki se ujema z vrednostjo, ki jo vrne vgrajena funkcija TypeName.

## AssertIsNothing

Vrne True, če je A predmet, ki ima vrednost Nothing.

### Skladnja:

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

## AssertIsNull

Vrne True, če ima A vrednost Null.

### Skladnja:

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

## AssertLess

Vrne True, če je A manjši od B.

### Skladnja:

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

Primerjava med A in B predvideva naslednje:

- Ustrezne vrste podatkov so String (niz), Date (datum) ali številske (več vrst).

- Oba izraza morata imeti isti VarType ali pa morata biti oba številska.

- Primerjava nizov razlikuje med velikimi in malimi črkami.

## AssertLessEqual

Vrne True, če je A manjši ali enak B.

### Skladnja:

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

Primerjava med A in B predvideva naslednje:

- Ustrezne vrste podatkov so String (niz), Date (datum) ali številske (več vrst).

- Oba izraza morata imeti isti VarType ali pa morata biti oba številska.

- Primerjava nizov razlikuje med velikimi in malimi črkami.

## AssertLike

Vrne True, če se niz A ujema z danim vzorcem, ki vsebuje nadomestne znake.

### Skladnja:

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

Podprti so naslednji nadomestni znaki:

- ? – predstavlja poljuben posamičen znak.

- * – predstavlja nič, enega ali več poljubnih znakov.

## AssertNotAlmostEqual

Vrne True, če sta A in B številski vrednosti in ne štejeta za bližnji pri dani relativni toleranci.

### Skladnja:

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

Ta validacijska točka vrne True, če sta izpolnjena sledeča pogoja:

- A in B je mogoče pretvoriti v vrsto Double.

- Absolutna razlika med A in B, deljena z največjo absolutno vrednostjo A ali B, je večja od vrednosti, določene z vrednostjo tolerance.

## AssertNotEqual

Vrne True, ko A in B ne veljata za enaka.

### Skladnja:

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

Ta metoda deluje tako s skalarji kot polji. Preberite navodila za AssertEqual, kjer najdete podrobnosti o pomenu ekvivalence za to validacijsko točko.

## AssertNotIn

Vrne True, če A (niz) ne najde v B.

### Skladnja:

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

Preberite navodila za AssertIn, kjer najdete podrobnosti o predpostavkah te metode.

## AssertNotInstance

Vrne True, če A ni instanca navedene vrste predmeta.

### Skladnja:

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

Preberite navodila za AssertIsInstance, kjer najdete podrobnosti o predpostavkah te metode.

## AssertNotLike

Vrne True, če se niz A ne ujema z danim vzorcem, ki vsebuje nadomestne znake.

### Skladnja:

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

Preberite navodila za AssertLike, kjer najdete podrobnosti o predpostavkah te metode.

## AssertNotNothing

Vrne True, razen če je A predmet, ki ima vrednost Nothing.

### Skladnja:

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

## AssertNotNull

Vrne True, razen če ima A vrednost Null.

### Skladnja:

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

## AssertNotRegex

Vrne True, če A ni niz oz. se ne ujema z danim regularnim izrazom.

### Skladnja:

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

Primerjava razlikuje med velikimi in malimi črkami.

## AssertRegex

Vrne True, če se niz A ujema z danim regularnim izrazom.

### Skladnja:

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

Primerjava razlikuje med velikimi in malimi črkami.

## AssertTrue

Vrne True, če je izraz A vrste Boolean in je njegova vrednost True.

### Skladnja:

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

## Fail

Vsili, da testni primer spodleti.

### Skladnja:

svc.Fail(message: str = "")

Podano je lahko sporočilo, ki bo posredovano v konzolo.

## Log

Zapiše navedeni message v konzolo.

### Skladnja:

svc.Log(message: str = "")

Podano je lahko sporočilo, ki bo posredovano v konzolo.

## ReportError

Prikaže okno s sporočilom in trenutnimi vrednostmi lastnosti storitve Exception.

Ta metoda se pogosto uporablja v kodi ravnanja z izjemami v podprogramu Sub, ki vsebuje testni primer, ki jo doseže, ko validacijska točka spodleti ali ko je klicana metoda Fail.

### Skladnja:

svc.ReportError(message: str = "")

Izvajanje testa se lahko glede na vrednost lastnosti WhenAssertionFails nadaljuje ali prekine.

Pri pisanju testnih primerov priporočamo, da vključite klic metode ReportError pri obravnavi izjem v podprogramu Sub.

Če je lastnost LongMessage enaka True, navedenemu sporočilu message sledi standardni opis sporočila o napaki. Sicer se prikaže le message.

## RunTest

Izvede celoten nabor testov, implementiran v danem modulu. Vsak testni primer se izvede neodvisno od drugega.

Izvajanje testa modula sestavlja:

1. Izvajanje neobvezne metode Setup, prisotne v modulu.

2. Enkratno izvajanje vsakega testnega primera, v poljubnem zaporedju.

3. Izvajanje neobvezne metode TearDown, prisotne v modulu.

### Skladnja:

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

Argument testcasepattern je vzorec, sestavljen iz nadomestnih znakov »?« in »*«, ki določa izbor testov, ki bodo izvedeni. Primerjava ne razlikuje med velikimi in malimi črkami.

Če je podan message, se zapiše v konzolo, ko se začne preizkus.

## SkipTest

Prekine izvajanje nabora testov brez klica metode TearDown.

Preskok testa je običajno smiseln med izvajanjem metode Setup, če vsi pogoji za izvajanje testa niso izpolnjeni.

Naloga metode Setup je, da zapusti podprogram Sub takoj po klicu SkipTest.

Če je SkipTest klicana iz samega testnega primera, se izvajanje nabora testov prekine in preostali testni primeri se ne izvedejo. Upoštevati je potrebno, da je zaporedje izvajanja testnih primerov v naboru testov poljubno.

### Skladnja:

svc.SkipTest(message: str = "")

Če je podan message, se zapiše v konzolo.

Podobne teme

Storitev ScriptForge.Exception