Codeception, testes de interface

· 3 minutos de leitura
Codeception, testes de interface

Fala galera,

Mais uma vez falando sobre o Codeception, no post passado mostrei como fazer o setup inicial e como começar a usá lo com testes unitários. Clique aqui para ver o post anterior.

Testes unitários são provavelmente o primeiro tipo de teste que você vai ver em qualquer tutorial, são os testes mais simples de serem feitos e provavelmente, os mais importantes. São os testes unitários que vão testar as suas funções, as suas classes, as suas regras de negócio e sua integração com o banco. Para este último, apesar de na prática não há diferença, existe uma especialização dos testes unitários, que são os testes de integração. A diferença entre um teste unitário e de integração é basicamente que o teste de integração faz acesso a um recurso externo, seja ele um banco de dados, uma API, ou qualquer outra coisa. Não irei abordar esse tipo de teste aqui, pois na prática os testes de integração são testes unitários.

Continuando, vamos a uma categoria de testes que muitos não dão importância, porém é simplesmente essa categoria que garante a experiência do usuário, que são os chamados testes de interface. Testes de interface comumente verificam os elementos HTML na tela, podendo verificar propriedades, conteúdo e tudo mais.

Uma das grandes vantagens do Codeception que eu vejo sobre o PHPUnit puro, é que ele é muito mais completo, podendo abordar uma gama muito maior de cenários, formas diferentes de acesso, minimizando as brechas. O exemplo que vou dar a seguir é um teste que acessará a página do usuário no facebook.

Começando...

Antes de mais nada vamos criar um novo projeto com o composer, crie uma pasta qualquer e execute o comando abaixo.

composer require codeception/codeception

Logo após vamos criar a estrutura inicial do Codeception com o comando abaixo:

vendorbincodecept bootstrap

Agora vamos criar nosso teste de interface. No Codeception os testes de interface são chamados de testes de aceitação, ou em inglês “acceptance”. Para isso execute o seguinte comando:

vendorbincodecept generate:cept acceptance LoginFacebook

Isto criará o arquivo “tests/acceptance/LoginFacebookCept.php”, abrindo o arquivo você verá a seguinte linha:

$I = new AcceptanceTester($scenario);

Nesta linha é criado um objeto da classe AcceptanceTester, que nada mais é que uma das classes de teste do Codeception> Vamos ver alguns comandos disponíveis logo mais, observe o nome dado a variável do objeto: $I. Esta variável é bastante usada na documentação do Codeception, simulando a ação do usuário. Então se você quiser que o usuário clique em algo você pode dizer "$I->click(‘Salvar’);", dizendo para o usuário clicar no botão com o texto “Salvar”.

Veja abaixo o código completo que conecta no Facebook e posta uma mensagem:

$I = new AcceptanceTester($scenario); $I->wantTo('Fazer login no facebook e ver o próprio nome');
$I->amOnPage('/login');
$I->seeInCurrentUrl('/login');
$I->fillField('email','[email protected]');
$I->fillField('pass','******');
$I->click('login');
$I->seeInCurrentUrl('/');
$I->see('Nome do Usuário');

Obviamente você deve mudar os valores para seu usuário e senha. Antes de rodar esse teste altere o arquivo “acceptance.suite.yml” de “url:” para “url: https://www.facebook.com/", assim o comando “$I->amOnPage()” considera como base a URL “https://www.facebook.com”.

Para rodar esse teste execute aquele mesmo comando que vimos no post passado:

vendorbincodecept run

Se tudo der certo, será mostrada uma mensagem dizendo que o teste passou, do contrário uma mensagem dizendo “fail” aparecerá com o erro.

Este foi um teste muito simples com o Codeception, mas podemos ter uma noção básica dos seus comandos, cada linha e comando é auto descritiva, pode ser traduzida literalmente, assim comandos como o $I->click(’login’) indicam, “Eu clico no botão login”.

Pessoal, esta foi uma breve introdução a parte de testes com interface do Codeception, comente o que achou nos comentários, critique, sugira, estamos aqui para ouvir, ou melhor ler. Até a próxima.