contato@qualister.com.br
(48) 3285-5615
twitter.com/qualister
facebook.com/qualister
linkedin.com/company/qualister
De Unitário a Aceitação:
Automatizando Testes
com Codeception
Trilha PHP | São Paulo | 25/07/2015
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
Conceito de Unidade, Integração
e Aceitação
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).
Automação de testes
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
Frameworks PHP usados para
automatizar testes
Frameworks PHP usados para automatizar testes
Testes de unidade
PHPUnit
Testes de integração
PHPUnit
+
Guzzle
Testes de aceitação
Behat
+
Webdriver
Sobre o
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.
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');
?>
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)
Preparando o projeto
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
HANDS-ON
Automatizando testes de
unidade
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
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);
}
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 :(
HANDS-ON
Automatizando testes de
integração em APIs
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
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:
Automatizando testes de integração em APIs
5. Execute os testes de integração em API
vendor/bin/codecept run api --steps
HANDS-ON
Automatizando testes de
Aceitação
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
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');
?>
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.
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
HANDS-ON
Gerando relatórios de
execução
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
Thanks to beta testers
Adriel, Lilian, Mário e Robson
contato@qualister.com.br
(48) 3285-5615
twitter.com/qualister
facebook.com/qualister
linkedin.com/company/qualister
Feedback:
joind.in/14851

[TDC2015] De unitário a aceitação: Automação de testes com Codeception

  • 1.
    contato@qualister.com.br (48) 3285-5615 twitter.com/qualister facebook.com/qualister linkedin.com/company/qualister De Unitárioa Aceitação: Automatizando Testes com Codeception Trilha PHP | São Paulo | 25/07/2015
  • 2.
    Palestrante Júlio de Lima Especialistaem 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
  • 3.
    Conceito de Unidade,Integração e Aceitação
  • 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).
  • 5.
  • 6.
    Automação de testes Testarmanualmente 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
  • 7.
    Frameworks PHP usadospara automatizar testes
  • 8.
    Frameworks PHP usadospara automatizar testes Testes de unidade PHPUnit Testes de integração PHPUnit + Guzzle Testes de aceitação Behat + Webdriver
  • 9.
  • 10.
    Sobre o Codeception Frameworkopen-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 Vejamum 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 Internamenteele utiliza os frameworks: • PHPUnit • Guzzle • Facebook Webdriver • Symfony BrowserKit • Entre outros Pré-requisitos: • PHP 5.3+ • CURL enabled • Composer (para o nosso Hands-on)
  • 13.
  • 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
  • 15.
  • 16.
    Automatizando testes deunidade 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 deunidade 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 deunidade 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 :(
  • 19.
  • 20.
    Automatizando testes deintegraçã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 deintegraçã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 deintegração em APIs 5. Execute os testes de integração em API vendor/bin/codecept run api --steps
  • 23.
  • 24.
    Automatizando testes deAceitaçã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 deAceitaçã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 deAceitaçã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
  • 28.
  • 29.
    Automatizando testes deAceitaçã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
  • 30.
    Thanks to betatesters Adriel, Lilian, Mário e Robson
  • 31.