0 follower

Definiera fixturer

Automatiserade tester behöver exekveras mÄnga gÄnger. För att garantera att testningsprocessen Àr repeterbar vill vi kunna köra testerna i ett kÀnt tillstÄnd, benÀmnt fixtur. Till exempel, för att testa att skapa poster i en bloggapplikation bör, varje gÄng vi kör testerna, tabellerna som lagrar relevanta data om postningar (t.ex. tabellen Post, tabellen Comment) ÄterstÀllas till nÄgot bestÀmt tillstÄnd. PHPUnit-dokumentationen har en bra beskrivning av fixturpreparering i allmÀnhet. I detta avsnitt kommer vi att beskriva hur man sÀtter upp databasfixturer.

Att preparera databasfixturer Àr kanske den mest tidsödande delarna inom testning av databasassisterade webbapplikationer. Yii introducerar applikationskomponenten CDbFixtureManager för att mildra problemet. Den utför i grunden följande ÄtgÀrder nÀr man kör en uppsÀttning tester:

  • Innan testerna körs Ă„terstĂ€ller den alla för testerna relevanta tabeller till ett kĂ€nt tillstĂ„nd.
  • Innan en enskild testmetod körs, Ă„terstĂ€ller den de specificerade tabellerna till ett kĂ€nt tillstĂ„nd.
  • Under exekveringen av en testmetod erbjuder den tillgĂ„ng till dataposterna som ingĂ„r i fixturen.

För att anvÀnda CDbFixtureManager behöver den konfigureras i applikationskonfigurationen pÄ följande sÀtt,

return array(
    'components'=>array(
        'fixture'=>array(
            'class'=>'system.test.CDbFixtureManager',
        ),
    ),
);

DÀrefter gör vi fixturdata tillgÀngligt under katalogen protected/tests/fixtures. Denna katalog kan anpassas till nÄgon annan katalog genom konfigurering av propertyn CDbFixtureManager::basePath i applikationskonfigurationen. Fixturdata Àr organiserat som en samling av PHP-filer benÀmnda fixturfiler. Varje fixturfil returnerar en array som representerar initialt existerande dataposter för en specifik tabell. Filnamnet Àr samma som tabellnamnet. Följande Àr ett exempel pÄ fixturdata för tabellen Post, lagrat i en fil med namnet Post.php:

<?php
return array(
    'sample1'=>array(
        'title'=>'test post 1',
        'content'=>'test post content 1',
        'createTime'=>1230952187,
        'authorId'=>1,
    ),
    'sample2'=>array(
        'title'=>'test post 2',
        'content'=>'test post content 2',
        'createTime'=>1230952287,
        'authorId'=>1,
    ),
);

I exemplet ovan returneras tvÄ rader av data . Varje rad reperesenteras av en associativ array vars nycklar Àr kolumnnamn och vars vÀrden Àr motsvarande kolumnvÀrden. Vidare Àr varje rad indexerad av en strÀng (t.ex. sample1, sample2), kallad rad-alias. NÀr vi senare skriver testskript kan vi bekvÀmt referera till en rad genom dess alias. Detta kommer att beskrivas i detalj i nÀsta avsnitt.

VÀrt att notera Àr att vi inte specificerar vÀrden för id-kolumnen i ovanstÄende fixtur. Detta beror pÄ att id-kolumnen Àr definierad som en automatiskt upprÀknande primÀrnyckel vars vÀrden kommer att fyllas i nÀr vi sÀtter in nya rader.

NÀr CDbFixtureManager refereras till för första gÄngen, gÄr den igenom varje fixturfil och ÄterstÀller med ledning av denna motsvarande tabell. En tabell ÄterstÀlls genom trunkering, vilket ÄterstÀller vÀrdesekvensen för den autoinkrementella primÀrnyckeln. DÀrefter sÀtts raderna med fixturdata in i tabellen.

Ibland vill vi inte ÄterstÀlla varje tabell som har en fixturfil innan vi kör en uppsÀttning tester, eftersom det kan ta lÄng tid att ÄterstÀlla alltför mÄnga fixturfiler. I et sÄdant fall kan vi skriva ett PHP-skript som utför initialiseringsarbetet pÄ ett anpassat sÀtt. Detta skript skall sparas i en fil med namnet init.php i samma katalog som innehÄller övriga fixturfiler. NÀr CDbFixtureManager upptÀcker att detta skript existerar kommer den att köra skriptet i stÀllet för att ÄtersÀlla varje tabell.

Det Àr ocksÄ möjligt att vi inte Àr nöjda med det underförstÄdda sÀttet att ÄterstÀlla en tabell, dvs att trunkera den samt sÀtta in fixturdata. I ett sÄdant fall kan vi skriva ett initialiseringsskript för en specifik fixturfil. Skriptet mÄste namnges som tabellnamnet följt av .init.php. Till exempel skulle initialiseringsskriptet för tabellen Post fÄ namnet Post.init.php. NÀr CDbFixtureManager ser detta skript kommer den att köra skriptet i stÀllet för att anvÀnda det vanliga sÀttet att ÄterstÀlla tabellen.

Tips: Med för mÄnga fixturfiler kan testningstiden förlÀngas dramatiskt. Av detta skÀl bör fixturfiler endast göras tillgÀngliga för de tabeller vars innehÄll kan komma att Àndras under testet. Tabeller som endast anvÀnds för att söka fram data Àndras inte och behöver dÀrför inte fixturfiler.

I följande tvÄ avsnitt kommer att beskrivas hur man anvÀnder fixturer hanterade av CDbFixtureManager i enhetstester och funktionella tester.

Found a typo, or you think this page needs improvement?
Edit it on GitHub !