170 likes | 324 Views
Functional Tests in Symfony. Sayed Ahmed B.Sc. Eng. in Computer Science & Engineering M. Sc. in Computer Science Exploring Computing for 14+ years sayed@justetc.net http://sayed.justetc.net. Functional Tests. to test your application from end to end
E N D
Functional Tests in Symfony Sayed Ahmed B.Sc. Eng. in Computer Science & Engineering M. Sc. in Computer Science Exploring Computing for 14+ years sayed@justetc.net http://sayed.justetc.net
Functional Tests • to test your application from end to end • from the request made by a browser to the response sent by the server • To test all the layers of an application: • the routing, • the model • the actions • and the templates • Facilitate to test use cases • Test scenarios (application usage scenarios) • Functional tests in Symfony • provide a way to easily describe scenarios • Each scenario can then be played automatically over and over again • by simulating the experience a user has in a browser
Automated Testing using Selenium • http://seleniumhq.org/ • “Selenium automates browsers. That's it. What you do with that power is entirely up to you. Primarily it is for automating web applications for testing purposes, but is certainly not limited to just that. Boring web-based administration tasks can (and should!) also be automated as well.”
The sfBrowserclass • sfBrowser provides methods that simulates navigation done in a classic browser: • get() Gets a URL • post() Posts to a URL • call() Calls a URL (used for PUT and DELETE methods) • back() Goes back one page in the history • forward() Goes forward one page in the history • reload() Reloads the current page • click() Clicks on a link or a button • select() selects a radiobutton or checkbox • deselect() deselects a radiobutton or checkbox • restart() Restarts the browser
The sfBrowser class • setHttpHeader() Sets an HTTP header • setAuth() Sets the basic authentication credentials • setCookie() Set a cookie • removeCookie() Removes a cookie • clearCookies() Clears all current cookies • followRedirect() Follows a redirect
The sfTestFunctionalclass • all tasks that generate a module automatically create a basic functional test file:
The Request Tester (with('request')->begin) • isParameter() Checks a request parameter value • isFormat() Checks the format of a request • isMethod() Checks the method • hasCookie() Checks whether the request has a cookie with the given name • isCookie() Checks the value of a cookie
The Response Tester • checkElement() Checks if a response CSS selector match some criteria • checkForm() Checks an sfForm form object • debug() Prints the response output to ease debug • matches() Tests a response against a regexp • isHeader() Checks the value of a header • isStatusCode() Checks the response status code • isRedirected() Checks if the current response is a redirect • isValid() Checks if a response is well-formed XML (you also validate the response again its document type be passing true as an argument)
Running Functional Tests • Execute the test file • $ phptest/functional/frontend/categoryActionsTest.php • Use the test:functional Task • $ phpsymfonytest:functional frontend categoryActions
Test Data • include(dirname(__FILE__).'/../../bootstrap/functional.php'); • $browser = new sfTestFunctional(new sfBrowser()); • Doctrine_Core::loadData(sfConfig::get('sf_test_dir').'/fixtures');
Writing Functional Tests • Writing functional tests is like playing a scenario in a browser
Debugging Functional Tests • $browser->with('response')->debug(); • symfony provides the ~debug|Debug~() method to output the response header and content:
Functional Tests Harness • The test:functional task can also be used to launch all functional tests for an application: • $ phpsymfonytest:functionalfrontend
Tests Harness • there is also a task to launch all tests for a project (unit and functional): • $ phpsymfonytest:all
References • http://www.symfony-project.org/jobeet/1_4/Doctrine/en/09