Testes Funcionais

Antes de ler esta seção, é recomendável que você primeiro leia a documentação do Selenium e a documentação do PHPUnit. 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.

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. Primeiro escrevemos a classe de teste como segue, observando que ela estende da classe-mãe que acabamos de mostrar:

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).

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.

$Id$

Be the first person to leave a comment

Please to leave your comment.