Testes Funcionais ================== Antes de ler esta seção, é recomendável que você primeiro leia a [documentação do Selenium](http://seleniumhq.org/docs/) e a [documentação do PHPUnit](http://www.phpunit.de/wiki/Documentation). Nós resumimos a seguir os princípios básicos de escrita de testes funcionais no Yii: * Como nos testes unitários, um teste funcional é escrito em termos de uma classe `XyzTest` que estende de [CWebTestCase], onde `Xyz` representa a classe que está sendo testada. Uma vez que `PHPUnit_Extensions_SeleniumTestCase` é a classe-mãe de [CWebTestCase], podemos usar todos os métodos herdados desta classe. * A classe do teste funcional é salva num arquivo PHP chamado `XyzTest.php`. Por convenção, o arquivo do teste funcional pode ser armazenado no diretório `protected/tests/functional`. * A classe de teste contém principalmente um conjunto de métodos de teste chamados como `testAbc`, onde `Abc` geralmente é o nome de uma funcionalidade que será testada. Por exemplo, para testar a funcionalidade de login, podemos ter um método de teste chamado `testLogin`. * Um método de teste geralmente contém uma série de declarações que emitirão comandos para o Selenium RC interagir com a aplicação Web que está sendo testada. Também contém declarações de asserção para verificar que a aplicação Web responde conforme o esperado. Antes de explicarmos como escrever um teste funcional, observaremos o arquivo `WebTestCase.php` gerado pelo comando `yiic webapp`. Este arquivo define a classe `WebTestCase` que pode servir como a classe-mãe de todas as classes de testes funcionais. ~~~ [php] define('TEST_BASE_URL','http://localhost/yii/demos/blog/index-test.php/'); class WebTestCase extends CWebTestCase { /** * Configura antes que cada método de teste seja executado. * Define principalmente a URL base da aplicação de testes. */ protected function setUp() { parent::setUp(); $this->setBrowserUrl(TEST_BASE_URL); } ...... } ~~~ A classe `WebTestCase` define principalmente a URL base de todas as páginas que serão testadas. Mais adiante, nos métodos de teste, podemos usar URLs relativas para especificar quais páginas serão testadas. Também devemos prestar atenção se usamos na URL base de testes o arquivo `index-test.php` como script de entrada ao invés de `index.php`. A única diferença entre `index-test.php` e `index.php` é que o primeiro usa a configuração de aplicação `test.php` enquanto o segundo usa `main.php`. Agora descrevemos como testar a funcionalidade de mostrar um post no [exemplo de blog](http://www.yiiframework.com/demos/blog). Primeiro escrevemos a classe de teste como segue, observando que ela estende da classe-mãe que acabamos de mostrar: ~~~ [php] class PostTest extends WebTestCase { public $fixtures=array( 'posts'=>'Post', ); public function testShow() { $this->open('post/1'); // verifica se o título do post de exemplo existe $this->assertTextPresent($this->posts['sample1']['title']); // verifica se o formulário de comentários existe $this->assertTextPresent('Leave a Comment'); } ...... } ~~~ Como ao escrever classes de testes unitários, nós declaramos as fixtures que serão usadas por este teste. Aqui indicamos que a fixture `Post` deve ser usada. No método de teste `testShow`, primeiros instruimos o Selenium RC a acessar a URL `post/1`. Observe que esta é uma URL relativa, e que a URL completa é formada adicionando-a à URL base que configuramos na classe-mãe (ou seja, `http://localhost/yii/demos/blog/index-test.php/post/1`). Então verificamos que podemos encontrar o título do post `sample1` na página da Web atual. E nós também verificamos que a página contém o texto `Leave a Comment` (deixe um comentário). > Tip|Dica: Antes de rodar os testes funcionais, o servidor do Selenium-RC deve estar iniciado. Isso pode ser feito executando-se o comando `java -jar selenium-server.jar` dentro do diretório de instalação do servidor do Selenium.