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:
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:
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 !
Signup or Login in order to comment.