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.

<div class="revision">$Id$</div>