Funktionell testning
Före läsning av detta avsnitt rekommenderas läsning av Selenium-dokumentationen och PHPUnit-dokumentationen. Här följer en sammanfattning av de grundläggande principerna för hur man skriver ett funktionellt test i Yii:
Liksom för ett enhetstest är ett funktionellt test skrivet i form av en klass
XyzTest
som ärver från CWebTestCase, därXyz
står för klassen som skall testas. EftersomPHPUnit_Extensions_SeleniumTestCase
är förälder till CWebTestCase, kan vi använda alla metoder som ärvs från denna.Klassen med det funktionella testet spara i en PHP-fil med namnet
XyzTest.php
. Enligt konvention sparas filen med det funktionella testet under katalogenprotected/tests/functional
.Testklassen består i huvudsak av en uppsättning testmetoder med namn som
testAbc
, därAbc
ofta är namnet på den finess som är föremål för testning. För att till exempel testa funktionen logga in användare, kan vi ha en testmetod med namnettestLogin
.En testmetod innehåller vanligen en sekvens av satser som ger ut kommandon till Selenium RC för interaktion med webbapplikationen som testas. Testmetoden innehåller också assertion-satser för att verifiera att webbapplikationen svarar som förväntat.
Låt oss, innan vi beskriver hur man skriver ett funktionellt test, titta närmare
på filen WebTestCase.php
skapad av yiic webapp
-kommandot. Denna fil
definierar WebTestCase
vilken kan tjänstgöra som basklass för alla klasser med
funktionella test.
define('TEST_BASE_URL','http://localhost/yii/demos/blog/index-test.php/'); class WebTestCase extends CWebTestCase { /** * Sets up before each test method runs. * This mainly sets the base URL for the test application. */ protected function setUp() { parent::setUp(); $this->setBrowserUrl(TEST_BASE_URL); } ...... }
Klassen WebTestCase
sätter i huvudsak upp en bas-URL till sidorna som skall testas.
Senare, i testmetoderna, kan relativa URL:er användas för att specificera vilka sidor
som skall testas.
Det är värt att notera är att i bas-URL:en för testning används index-test.php
som startskript, i stället för index.php
. Den enda skillnaden mellan index-test.php
och index.php
är att den förra använder filen test.php
som applikationskonfiguration
medan den senare använder main.php
.
Nu kan vi beskriva hur man kan testa förfarandet för att visa en postning i applikationen blog demo. Först skriver vi testklassen som följer, med beaktande att testklassen ärver från basklassen vi just beskrivit:
class PostTest extends WebTestCase { public $fixtures=array( 'posts'=>'Post', ); public function testShow() { $this->open('post/1'); // verify the sample post title exists $this->assertTextPresent($this->posts['sample1']['title']); // verify comment form exists $this->assertTextPresent('Leave a Comment'); } ...... }
I likhet med hur vi skriver en klass för enhetstestning, deklarerar vi fixturerna
som skall användas i aktuellt test. I detta fall indikerar vi att fixturen Post
skall användas. I testmetoden testShow
, instruerar vi först Selenium RC att
öppna URL:en post/1
. Lägg märke till att detta är en relativ URL och att den
kompletta URL:en bildas genom att lägga till den till bas-URL:en som sattes upp
i basklassen (dvs http://localhost/yii/demos/blog/index- test.php/post/1
).
Därefter verifierar vi att det går att hitta titeln för postningen sample1
i den
för tillfället visade webbsidan. Vi kontrollerar även att sidan innehåller texten
Leave a Comment
.
Tips: Innan funktionella test kan köras måste Selenium-RC-servern startas. Detta kan göras genom exekvering av kommandot
java -jar selenium-server.jar
från Selenium-serverns installationskatalog.