O documento descreve uma palestra sobre automação de testes com o framework Codeception. A palestra aborda conceitos de testes de unidade, integração e aceitação e como automatizá-los com Codeception, PHPUnit, Guzzle e outros frameworks. Também apresenta exemplos práticos de como escrever testes de unidade, integração e aceitação com Codeception.
2. Palestrante
Júlio de Lima
Especialista em teste de software com ênfase em
automação de testes de software, possui formação em
Tecnologia da Informação e certificações internacionais e
(CTFL e CTAL-TM pelo ISTQB) e nacional (CBTS pela ALATS)
em teste de software. Professor convidado em cursos de pós
graduação em instituições do Paraná e Santa Catarina.
julio.lima@qualister.com.br
twitter.com/juliodelimas
br.linkedin.com/in/juliodelimas
goldtips.by/juliodelimas
4. Conceito de Unidade, Integração e Aceitação
Testes de unidade
Avaliam isoladamente se
os métodos de uma
classe funcionam como
esperado.
Testes de integração
Avaliam se, após
integrados, os componentes
ou sistemas conseguem
interagir entre si como
esperado.
Testes de aceitação
Avaliam se o produto final
atende as requisitos
iniciais na perspectiva de
usuário final (negócios).
6. Automação de testes
Testar manualmente o software na perspectiva
de unidade, integração e aceitação é um
processo demorado e custoso. Quando novas
versões do software são construídas torna-se,
muitas vezes, impossível re-testar tudo o que
foi testado nas versões anteriores e as novas
funcionalidades.
Principais benefícios são:
• Re-execução de testes executados em versões anteriores
• Feedback instantâneo após mudanças no código
• Melhoria na escrita do código
• Confiança na aplicação
10. Sobre o Codeception
Framework open-source para automação de testes que
reune os principais frameworks disponíveis no mercado.
A escrita dos testes é feita de forma descritiva, muito
semelhante ao estilo BDD.
Desenvolvido com o intuito de que os testes de unidade,
integração e aceitação pudessem ser escritos usando um
estilo único.
Possui geradores que servem para criar o template inicial
dos testes.
11. Sobre o Codeception
Vejam um exemplo de um teste de aceitação:
<?php
$I = new AcceptanceTester($scenario);
$I->wantTo('adicionar um novo pedido');
$I->amOnPage('/');
$I->click('Novo pedido');
$I->fillField('id', 1);
$I->selectOption('produto', 'Firefox');
$I->click('button');
$I->see('Sucesso');
?>
12. Sobre o Codeception
Internamente ele utiliza os frameworks:
• PHPUnit
• Guzzle
• Facebook Webdriver
• Symfony BrowserKit
• Entre outros
Pré-requisitos:
• PHP 5.3+
• CURL enabled
• Composer (para o nosso Hands-on)
14. Preparando o projeto
1. Crie o diretório “codeception-tdc” e dentro dele teremos o
diretório “src” (que armazena as classes do projeto)
2. Crie o arquivo “composer.json” e adicione o conteúdo abaixo:
{
"require": {
"codeception/codeception": "*"
},
"autoload": {
"classmap": [
"src"
]
}
}
3. Rode o comando
composer install
4. Para criar os arquivos iniciais rode o comando
vendor/bin/codecept bootstrap
16. Automatizando testes de unidade
1. Criaremos um teste de unidade:
vendor/bin/codecept generate:test unit Pedido
Obs. Poderíamos também criar um teste do PHPUnit com o comando:
php codecept.phar generate:phpunit unit Pedido
17. Automatizando testes de unidade
2. Criaremos um novo teste para validar que é possível salvar um
pedido:
/**
* @test
*/
public function adicionarProdutoNoPedidoValidarQueFoiAdicionado()
{
// Arrange
$pedidoServicos = new PedidoServicos();
// Act
$resposta = $pedidoServicos->salvar($this->pedido);
// Assert
$this->tester->assertEquals('Sucesso', $resposta);
}
18. Automatizando testes de unidade
3. Para executá-lo basta executar o comando abaixo:
vendor/bin/codecept run unit
4. Buscando o isolamento das classes durante o teste, podemos criar
Stubs (implementadas a partir da classe de rock do PHPUnit) para
simular o comportamento de outras classes:
// Arrange
$pedidoServicos = new PedidoServicos();
$pedidoServicos = CodeceptionUtil
Stub::make('PedidoServicos', ['salvar' => 'Sucesso']);
Ponto negativo: Não é possível mocar interfaces :(
20. Automatizando testes de integração em APIs
1. Criaremos a suite de testes de Api
vendor/bin/codecept generate:suite api
2. Usaremos o gerador do Codeception para gerar o teste de integração
de novo pedido:
vendor/bin/codecept generate:cept api NovoPedido
3. Configuramos a URL base de nossa aplicação na propriedade URL no
arquivo de configuração da suíte de testes de aceitação: api.suite.yml
class_name: ApiTester
modules:
enabled:
- REST:
url: 'http://localhost:8888/qualister-php-testing/api'
depends: PhpBrowser
21. Automatizando testes de integração em APIs
<?php
$I = new ApiTester($scenario);
$I->wantTo('adicionar um novo pedido');
$I->amHttpAuthenticated('phptesting', '123');
$I->sendPOST('/pedido', [
'produtoid' => 10,
'produtonome' => 'Firefox',
'produtoestoque' => 50,
'produtovalor' => 49.90
]);
$I->seeResponseCodeIs(200);
$I->seeResponseIsJson();
$I->seeResponseContainsJson(['message' => 'Sucesso', 'status' =>
'sucesso']);
?>
4. Escreveremos o teste que enviará a requisição à API:
22. Automatizando testes de integração em APIs
5. Execute os testes de integração em API
vendor/bin/codecept run api --steps
24. Automatizando testes de Aceitação
1. Usaremos o gerador do Codeception para gerar o teste de aceitação
de novo pedido:
vendor/bin/codecept generate:cept acceptance NovoPedido
2. Configuramos a URL base de nossa aplicação na propriedade URL no
arquivo de configuração da suíte de testes de aceitação:
acceptance.suite.yml
class_name: AcceptanceTester
modules:
enabled:
- PhpBrowser:
url: 'http://localhost:8888/qualister-php-testing/web'
- HelperAcceptance
25. Automatizando testes de Aceitação
3. Criamos os comandos de execução dos testes:
<?php
$I = new AcceptanceTester($scenario);
$I->wantTo('adicionar um novo pedido');
$I->amOnPage('/');
$I->click('Novo pedido');
$I->fillField('id', 1);
$I->selectOption('produto', 'Firefox');
$I->fillField('estoque', 50);
$I->fillField('valor', 49.90);
$I->click('button');
$I->expect('a mensagem "sucesso" seja apresentada');
$I->see('Sucesso');
?>
26. Automatizando testes de Aceitação
4. Execute os testes de aceitação
vendor/bin/codecept run acceptance --steps
5. Para executar os testes em um browser real, precisamos que o
Selenium Server (java -jar bin/selenium-server-standalone-2.46.0.jar)
esteja sendo executado, após isso, modificaremos o arquivo de
configuração da suite de aceitação:
class_name: AcceptanceTester
modules:
enabled:
- WebDriver:
url: 'http://localhost:8888/qualister-php-testing/web'
browser: firefox
window_size: maximize
- HelperAcceptance
Pode trabalhar com PhpBrowser ou Selenium Webdriver.
27. PhpBrowser vs Webdriver
PhpBrowser
- É muito rápido
- Usa Texto, Name, CSS Selector ou XPath para identificar os elementos
- Só podemos clicar em links com URLs válidas e botões de submissão de forms
- Não consegue simular o preenchimento de campos que não estão em formulários
- Não testa Javascript
- Não presume identificar a visibilidade dos elementos
- Usa Guzzle e Symfony BrowserKit para enviar requisições ao servidor
WebDriver
- É mais lento
- Usa Texto, Name, CSS Selector ou XPath para identificar os elementos
- Permite tirar screenshots de telas
- Só podemos clicar em links com URLs válidas e botões de submissão de forms
- Não consegue simular o preenchimento de campos que não estão em formulários
- Não testa Javascript
- Não presume identificar a visibilidade dos elementos
- Usa Guzzle e Symfony BrowserKit para simular o browser
29. Automatizando testes de Aceitação
Podemos gerar relatórios em HTML para que a leitura torne-
se mais simples:
vendor/bin/codecept run --html
O relatório também pode ser exportado no format JUnit
XML, através do comando abaixo:
vendor/bin/codecept run —-xml