Egységtesztek

Egy tesztfájl létrehozása
Előfeltételek a teszteléshez
Tesztelés
Egységteszt API

Az OTRS biztosít egy tesztelési alkalmazáscsomagot, amely egységtesztek fejlesztéséhez és futtatásához használható az összes rendszerrel kapcsolatos kódnál.

Egy tesztfájl létrehozása

A tesztfájlok .t fájlokban vannak tárolva a /scripts/test/*.t helyen. Például vessünk egy pillantást a scripts/test/Calendar.t fájlra a naptár osztálynál.

Minden tesztfájlnak ideális esetben példányosítania kell az egységteszt segítő objektumot az elején, így részesülhet néhány beépített metódusból, amelyet az biztosít:

# --
# Copyright (C) 2001-2020 OTRS AG, https://otrs.com/
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (GPL). If you
# did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt.
# --

use strict;
use warnings;
use utf8;

use vars (qw($Self));

$Kernel::OM->ObjectParamAdd(
    'Kernel::System::UnitTest::Helper' => {
        RestoreDatabase => 1,
    },
);
my $Helper = $Kernel::OM->Get('Kernel::System::UnitTest::Helper');
            

A RestoreDatabase paraméternek a segítő konstruktor számára történő átadásával az egységteszt közben végrehajtott bármely adatbázis-utasítás vissza lesz állítva a végén, ezáltal azt biztosítva, hogy ne történjen végleges változtatás.

Mint bármely egyéb tesztelési alkalmazáscsomag, az OTRS is biztosít állítás metódusokat, amelyek a feltételek teszteléséhez használhatók. Például it az látható, hogy hogyan hozunk létre egy teszt felhasználót, és hogyan teszteljük le, hogy valóban létrejött:

my $UserLogin = $Helper->TestUserCreate();
my $UserID = $UserObject->UserLookup( UserLogin => $UserLogin );

$Self->True(
    $UserID,
    "Test user $UserID created"
);
            

Nézze meg a lenti API szakaszt az állítás metódusok teljes listájáért.

Mindig jó gyakorlat véletlenszerű adatokat létrehozni az egységtesztekben, ami segíthet megkülönböztetni az előzőleg hozzáadott adatoktól. Használja a véletlen metódusokat az API-ból, hogy megkapja a karakterláncokat, és beágyazza azokat a paraméterekbe:

my $RandomID = $Helper->GetRandomID();

# teszt csoport létrehozása
my $GroupName = 'test-calendar-group-' . $RandomID;
my $GroupID   = $GroupObject->GroupAdd(
    Name    => $GroupName,
    ValidID => 1,
    UserID  => 1,
);

$Self->True(
    $GroupID,
    "Test group $GroupID created"
);
            

A jó fejlesztők az egységtesztjeiket könnyen karbantarthatóvá teszik. Fontolja meg az összes teszteset egy tömbbe történő elhelyezését, majd lépkedjen végig azokon valamilyen kóddal. Ez egyszerű módot fog biztosítani a teszt későbbi bővítéséhez:

#
# A CalendarCreate() tesztelése
#
my @Tests = (
    {
        Name    => 'CalendarCreate - No params',
        Config  => {},
        Success => 0,
    },
    {
        Name   => 'CalendarCreate - All required parameters',
        Config => {
            CalendarName => "Calendar-$RandomID",
            Color        => '#3A87AD',
            GroupID      => $GroupID,
            UserID       => $UserID,
        },
        Success => 1,
    },
    {
        Name   => 'CalendarCreate - Same name',
        Config => {
            CalendarName => "Calendar-$RandomID",
            Color        => '#3A87AD',
            GroupID      => $GroupID,
            UserID       => $UserID,
        },
        Success => 0,
    },
);

for my $Test (@Tests) {

    # a hívás elvégzése
    my %Calendar = $CalendarObject->CalendarCreate(
        %{ $Test->{Config} },
    );

    # adatok ellenőrzése
    if ( $Test->{Success} ) {
        for my $Key (qw(CalendarID GroupID CalendarName Color CreateTime CreateBy ChangeTime ChangeBy ValidID)) {
            $Self->True(
                $Calendar{$Key},
                "$Test->{Name} - $Key exists",
            );
        }

        KEY:
        for my $Key ( sort keys %{ $Test->{Config} } ) {
            next KEY if $Key eq 'UserID';

            $Self->IsDeeply(
                $Test->{Config}->{$Key},
                $Calendar{$Key},
                "$Test->{Name} - Data for $Key",
            );
        }
    }
    else {
        $Self->False(
            $Calendar{CalendarID},
            "$Test->{Name} - No success",
        );
    }
}
            

Előfeltételek a teszteléshez

Hogy képes legyen lefuttatni az egységteszteket, arra van szüksége, hogy az összes választható Perl-modul telepítve legyen, kivéve azokat, amelyek az Ön által használt adatbázis háttérprogramoktól eltérőkhöz valók. Futtassa a bin/otrs.CheckModules.pl parancsfájlt a modultelepítés ellenőrzéséhez.

Szüksége van egy teljes képzésű tartományneven (FQDN) futó OTRS webes előtétprogram egy példányára, amely az OTRS helyi Config.pm fájljában be van állítva. Ennek az OTRS példánynak ugyanazt az adatbázist kell használnia, amelyek az egységtesztekhez vannak beállítva.

Tesztelés

A tesztek futtatásához egyszerűen használja a bin/otrs.Console.pl Dev::UnitTest::Run --test Calendar parancsot a scripts/test/Calendar.t fájl használatához.

shell:/opt/otrs> bin/otrs.Console.pl Dev::UnitTest::Run --test Calendar
+-------------------------------------------------------------------+
/opt/otrs/scripts/test/Calendar.t:
+-------------------------------------------------------------------+
.................................................................................................
=====================================================================
yourhost ran tests in 2s for OTRS 6.0.x git
All 97 tests passed.
shell:/opt/otrs>
            

Akár több tesztet is lefuttathat egyszerre, csak adjon meg további --test argumentumokat a parancsnak:

shell:/opt/otrs> bin/otrs.Console.pl Dev::UnitTest::Run --test Calendar --test Appointment
+-------------------------------------------------------------------+
/opt/otrs/scripts/test/Calendar.t:
+-------------------------------------------------------------------+
.................................................................................................
+-------------------------------------------------------------------+
/opt/otrs/scripts/test/Calendar/Appointment.t:
+-------------------------------------------------------------------+
..................................................................................................................
=====================================================================
yourhost ran tests in 5s for OTRS 6.0.x git
All 212 tests passed.
shell:/opt/otrs>
            

Ha argumentumok nélkül hajtja végre a bin/otrs.Console.pl Dev::UnitTest::Run parancsot, akkor le fogja futtatni a rendszeren található összes tesztet. Ne feledje, hogy ez eltarthat egy ideig, amíg befejeződik.

Adja meg a --verbose argumentumot annak érdekében, hogy láthassa a sikeres tesztekkel kapcsolatos üzeneteket is. A teszt során előforduló bármilyen hiba megjelenítésre kerül függetlenül ettől a kapcsolótól, és biztosítva lesz, hogy azok ténylegesen felvételre kerülnek a tesztbe.

Egységteszt API

Az OTRS API-t biztosít az egységteszteléshez, amely az előző példában volt használva. Itt fel fogjuk sorolni a legfontosabb függvényeket, de nézze meg a Kernel::System::UnitTest internetes API hivatkozását is.

True()

Ez a függvény azt teszteli, hogy a megadott skalár érték igaz érték-e a Perlben.

$Self->True(
    1,
    'Az 1 skalár mindig igazként lesz kiértékelve'
);
                        

False()

Ez a függvény azt teszteli, hogy a megadott skalár érték hamis érték-e a Perlben.

$Self->False(
    0,
    'A 0 skalár mindig hamisként lesz kiértékelve'
);
                        

Is()

Ez a függvény azt teszteli, hogy a megadott skalár változók egyenlők-e.

$Self->Is(
    $A,
    $B,
    'Tesztnév',
);
                        

IsNot()

Ez a függvény azt teszteli, hogy a megadott skalár változók nem egyenlők-e.

$Self->IsNot(
    $A,
    $B,
    'Tesztnév'
);
                        

IsDeeply()

Ez a függvény összetett adatszerkezeteket hasonlít össze az egyenlőséghez. $A és $B hivatkozás kell legyen.

$Self->IsDeeply(
    $A,
    $B,
    'Tesztnév'
);
                        

IsNotDeeply()

Ez a függvény összetett adatszerkezeteket hasonlít össze a nem egyenlőséghez. $A és $B hivatkozás kell legyen.

$Self->IsNotDeeply(
    $A,
    $B,
    'Tesztnév'
);
                        

Emellett az egységteszt segítő objektum biztosít néhány hasznos metódust is a gyakori tesztelési feltételekhez. A teljes hivatkozásért nézze meg a Kernel::System::UnitTest::Helper internetes API hivatkozását.

GetRandomID()

Ez a függvény előállít egy véletlenszerű azonosítót, amely egyedi azonosítóként használható a tesztekben. Garantált, hogy egy teszten belül ez a függvény soha nem ad vissza kettőzött értéket.

Megjegyzés

Ne feledje, hogy ezek a számok nem valódi véletlen számok, és csak tesztadatok előállításához szabad használni.

my $RandomID = $Helper->GetRandomID();
# $RandomID = 'test6326004144100003';
                        

TestUserCreate()

Ez a függvény létrehoz egy teszt felhasználót, amely használható a tesztekben. Automatikusan érvénytelenre lesz állítva a destruktor közben. Visszaadja az új felhasználó bejelentkezési nevét, a jelszó pedig ugyanaz lesz.

my $TestUserLogin = $Helper->TestUserCreate(
    Groups   => ['admin', 'users'],          # elhagyható, csoportok listája, amelyhez a felhasználót hozzá kell adni (írás, olvasás jogokkal)
    Language => 'hu',                        # elhagyható, alapértelmezetten 'en', ha nincs megadva
);
                        

FixedTimeSet()

Ez a függvény lehetővé teszi a rendszeridő felülbírálását egészen addig, amíg az objektum él. Átadhat egy elhagyható időparamétert, amelyet használni kell. Ha nincs átadva, akkor az aktuális rendszeridő lesz használva.

Megjegyzés

A Kernel::System::Time és a Kernel::System::DateTime metódusainak összes meghívása a megadott időt fogja használni ezután.

$HelperObject->FixedTimeSet(366475757);         # időbélyeggel
$HelperObject->FixedTimeSet($DateTimeObject);   # az előzőleg létrehozott DateTime objektummal
$HelperObject->FixedTimeSet();                  # beállítás a jelenlegi dátumra és időre
                        

FixedTimeUnset()

Ez a függvény visszaállítja a rendes rendszeridő viselkedést.

FixedTimeAddSeconds()

Ez a függvény valamennyi másodpercet ad ahhoz a rögzített rendszeridőhöz, amelyet a FixedTimeSet() korábban beállított. Átadhat negatív értéket, hogy visszamenjen az időben.

ConfigSettingChange()

Ez a függvény átmenetileg rendszerszinten megváltoztat egy rendszerbeállítást egy másik értékre mind a ConfigObject aktuális példányában, mind a rendszerbeállításokban is a lemezen. Akkor lesz visszaállítva, amikor a Helper objektum megsemmisül.

Megjegyzés

Ne feledje, hogy ez jelenleg nem működik fürtözött környezetekben.

$Helper->ConfigSettingChange(
    Valid => 1,            # (elhagyható) beállítás engedélyezése vagy letiltása
    Key   => 'MySetting',  # beállítás neve
    Value => { ... } ,     # beállítás értéke
);
                        

CustomCodeActivate()

Ez a függvény átmenetileg egyéni kódot fog felvenni a rendszerbe. Például ezt használhatja egy másik osztályból származó szubrutin felüldefiniálásához. Ez a változtatás megmarad a teszt emlékeztetőjénél is. Az összes kód eltávolításra kerül, amikor a Helper objektum megsemmisül.

Megjegyzés

Ne feledje, hogy ez jelenleg nem működik fürtözött környezetekben.

$Helper->CustomCodeActivate(
    Code => q^
use Kernel::System::WebUserAgent;
package Kernel::System::WebUserAgent;
use strict;
use warnings;
{
    no warnings 'redefine';
    sub Request {
        my $JSONString = '{"Results":{},"ErrorMessage":"","Success":1}';
        return (
            Content => \$JSONString,
            Status  => '200 OK',
        );
    }
}
1;^,
    Identifier => 'News',   # (elhagyható) kódazonosító a fájlnévbe való felvételhez
);
                        

ProvideTestDatabase()

Ez a függvény egy átmeneti adatbázist fog biztosítani a teszthez. Először határozza meg a teszt adatbázis beállításait a Kernel/Config.pm fájlban, azaz:

$Self->{TestDatabase} = {
    DatabaseDSN  => 'DBI:mysql:database=otrs_test;host=127.0.0.1;',
    DatabaseUser => 'otrs_test',
    DatabasePw   => 'otrs_test',
};
                        

A metódushívás felül fogja bírálni a globális adatbázis-beállítást a teszt időtartama alatt, azaz az átmeneti adatbázis fogja fogadni az összes olyan hívást, amelyet a DBObject rendszer küldött át.

Az összes adatbázis-tartalom automatikusan eldobásra kerül, amikor a Helper objektum megsemmisül.

Ez a metódus undef értéket ad vissza abban az esetben, ha a teszt adatbázis nincs beállítva. Ha be van állítva, de a mellékelt XML nem olvasható vagy nem hajtható végre, akkor a metódus die() függvénye lesz meghívva a teszt hibával történő megszakításához.

$Helper->ProvideTestDatabase(
    DatabaseXMLString => $XML,      # (elhagyható) OTRS adatbázis XML-séma a végrehajtáshoz
                                    # vagy
    DatabaseXMLFiles => [           # (elhagyható) betöltendő és végrehajtandó XML-fájlok listája
        '/opt/otrs/scripts/database/otrs-schema.xml',
        '/opt/otrs/scripts/database/otrs-initial_insert.xml',
    ],
);