Testning är en nödvändig process vid mjukvaruutveckling. Vare sig vi är medvetna
om det eller inte, genomför vi testning hela tiden medan vi utvecklar en
webbapplikation. Till exempel när vi skriver en klass i PHP, kan det hända att
vi använder några echo
- eller die
-satser för att visa att vi implementerar
en metod korrekt; när vi implementerar en webbsida innehållande ett komplext
HTML-formulär, kan vi prova att mata in testdata för att garantera att sidan
interagerar med oss som tänkt. Mer avancerade utvecklare kanske skriver kod för
att automatisera denna testningsprocess så att vi varje gång vi behöver testa
något, endast behöver hämta fram koden och låta datorn göra testningen åt oss.
Detta är känt som automatiserad testning, vilket är huvudämnet för detta kapitel.
Testningsstödet som erbjuds av Yii omfattar enhetstestning och funktionell testning.
Ett enhetstest verifierar att en enskild kodenhet fungerar som tänkt. Inom objektorienterad programmering är den grundläggande kodenheten en klass. Ett enhetstest behöver därför huvudsakligen verifiera att var och en av metoderna i klassens gränssnitt (interface) fungerar korrekt. Dvs, med givna inparametrar, verifierar testet att metoden returnerar förväntat resultat. Enhetstester utvecklas vanligen av samma personer som skriver de klasser som testas.
Ett funktionellt test verifierar att en finess (t.ex. hantering av postningar i ett bloggsystem) fungerar som väntat. I jämförelse med ett enhetstest hör ett funktionellt test till en högre nivå eftersom en finess som testas ofta omfattar flera klasser. Funktionella tester är vanligen utvecklade av personer som är mycket väl insatta i systemkraven (de kan vara antingen utvecklare eller kvalitetssäkringsingenjörer).
Nedan visas utvecklingscykeln inom så kallad testdriven utveckling (TDD):
Upprepa steg 1 till 5 för att driva implementeringen av funktionalitet framåt.
Stödet för testning som Yii erbjuder kräver PHPUnit 3.5+ samt Selenium Remote Control 1.0+. Se deras respektive dokumentation angående installation av PHPUnit och Selenium Remote Control.
När vi använder konsolkommandot yiic webapp
till att skapa en ny Yii-
applikation, kommer det att generera följande filer och kataloger åt oss med
ändamålet att skriva och köra nya test:
testdrive/ protected/ containing protected application files tests/ containing tests for the application fixtures/ containing database fixtures functional/ containing functional tests unit/ containing unit tests report/ containing coverage reports bootstrap.php the script executed at the very beginning phpunit.xml the PHPUnit configuration file WebTestCase.php the base class for Web-based functional tests
Som framgår ovan, kommer våra test att huvudsakligen placeras i tre kataloger:
fixtures
, functional
och unit
och katalogen report
kommer att användas
för lagring av genererade kodtäckningsrapporter.
För att köra test (enhetstest eller funktionella test), kan vi köra följande kommandon i ett konsolfönster:
% cd testdrive/protected/tests % phpunit functional/PostTest.php // kör ett enstaka test % phpunit --verbose functional // kör alla test under 'functional' % phpunit --coverage-html ./report unit
I ovanstående exempel kör det sista kommandot alla tester under katalogen unit
och skapar en kodtäckningsrapport i katalogen report
. Märk att xdebug-tillägget
måste vara installerat och aktiverat för att kodtäckningsrapport skall kunna genereras.
Låt oss titta på vad som kan finnas i filen bootstrap.php
. Denna fil är
speciell eftersom den motsvarar startskriptet och utgör
startpunkt vid exekvering av en uppsättning tester.
$yiit='path/to/yii/framework/yiit.php';
$config=dirname(__FILE__).'/../config/test.php';
require_once($yiit);
require_once(dirname(__FILE__).'/WebTestCase.php');
Yii::createWebApplication($config);
Ovan inkluderas först filen yiit.php
från Yii-ramverket, genom vilken några
globala konstanter initialiseras samt erforderliga basklasser för test
inkluderas. Därefter skapas en instans av webbapplikation med hjälp av
konfigurationsfilen test.php
. Om vi tittar närmare på test.php
, kommer vi
att finna att den ärver från konfigurationen i main.php
och lägger till
applikationskomponenten fixture
som är av klassen CDbFixtureManager.
I nästa avsnitt kommer fixturer att beskrivas detaljerat.
return CMap::mergeArray(
require(dirname(__FILE__).'/main.php'),
array(
'components'=>array(
'fixture'=>array(
'class'=>'system.test.CDbFixtureManager',
),
/* uncomment the following to provide test database connection
'db'=>array(
'connectionString'=>'DSN for test database',
),
*/
),
)
);
När vi kör tester som involverar en databas bör vi använda en testdatabas så att
exekvering av tester inte påverkar normala utvecklings- eller
produktionsaktiviteter. För att åstadkomma detta behöver vi bara ta bort
kommentaren kring db
-konfigurationen ovan och fylla i propertyn
connectionString
med DSN:et (namnet på datakällan) för testdatabasen.
Med ett sådant här bootstrap-skript förfogar vi vid körning av enhetstester över en applikationsinstans som är nästan likadan som den som servar request från webbanvändare. Den huvudsakliga skillnaden är att den innehåller fixturhanteraren samt använder testdatabasen.
Found a typo or you think this page needs improvement?
Edit it on github !
Signup or Login in order to comment.