www.qualister.com.br
(48) 4052-9536 / 9540
contato@qualister.com.br
Automação de testes
BDD usando
Codeception



por Júlio de Lima

@juliodelimas
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 (CTFL e CTAL-TM pelo ISTQB) e nacional
(CBTS pela ALATS) relacionada a testes de software além de ser
certificado na ferramenta SoapUI Pro pela SmartBear Software.
Atualmente é consultor de automação de testes e instrutor na Qualister
e é professor de disciplina de teste de software em cursos de pós-
graduação no Paraná e em Santa Catarina.
julio.lima@qualister.com.br
twitter.com/juliodelimas
br.linkedin.com/in/juliodelimas
goldtips.by/juliodelimas
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
BDD: Desenvolvimento Dirigido por Comportamentos
3
BDD: Desenvolvimento Dirigido por
Comportamentos
Analisando as empresas brasileiras usando a regra de Paretto,
apenas 20% usam documentação com base em UML, as outras 80%
documentam o software com linguagem comum, e-mails,
verbalmente ou mesmo papel de pão.
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
BDD: Desenvolvimento Dirigido por Comportamentos
4
Um exemplo de descrição do software por e-mail
"Olá José, aqui é a Maria, preciso que
altere nosso sistema. Quero ter a
possibilidade de registrar as
movimentações de entrada e saída (no
máximo 100 reais) de nosso caixa."
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
BDD: Desenvolvimento Dirigido por Comportamentos
5
Agora, o mesmo exemplo usando BDD
Funcionalidade: Gerenciar Movimentações
Sendo o administrador de uma loja
Posso gerenciar movimentações
Para que possa ver, de forma simples, as entradas e saídas de valores
Cenário: Gerando uma movimentação de entrada
Dado que eu esteja autenticado como administrador
E que eu tenha acessado o menu "Movimentações"
E clicado em "Nova movimentação” para inserir uma movimentação
Quando eu informar os dados:
|tipo|valor|itens|
|Entrada|500,00|Almoçar|
E clicar em "Gravar"
Então verei a mensagem "Sucesso ao inserir a movimentação"
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
BDD: Desenvolvimento Dirigido por Comportamentos
6
Cenário: Gerando uma movimentação de saída dentro do valor limite
Dado que eu esteja autenticado como administrador
E que eu tenha acessado o menu "Movimentações"
E clicado em "Nova movimentação” para inserir uma movimentação
Quando eu informar os dados:
|tipo|valor|itens|
|Saída|100,00|Almoçar|
E clicar em "Gravar"
Então verei a mensagem "Sucesso ao inserir a movimentação"
Cenário: Gerando uma movimentação de saída fora do valor limite
Dado que eu esteja autenticado como administrador
E que eu tenha acessado o menu "Movimentações"
E clicado em "Nova movimentação” para inserir uma movimentação
Quando eu informar os dados:
|tipo|valor|itens|
|Saída|100,01|Almoçar|
E clicar em "Gravar"
Então verei a mensagem "São permitidas apenas movimentações de saída
de até 100 reais"
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
Testes manuais e suas limitações
7
Os testes manuais servem para testar,
sem o uso de ferramentas
automatizadas, se o software atende as
necessidades do cliente e se funciona
como esperado.
Clientes podem ser: O usuário final, os
desenvolvedores, as empresas que
consumirão nossa API, entre outros.
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
Testes manuais e suas limitações
8
Os testes tendem a serem trabalhosos,
custosos, demorados, repetitivos e
muitas vezes inviáveis.
Exige que o testador tenha as habilidades
necessárias para atuar nestas áreas e destreza
para saber priorizar os testes que deverão ser
executados, pois na maioria das vezes não dá
tempo para testar tudo.
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
Testes manuais e suas limitações
9
Os testes tendem a serem trabalhosos,
custosos, demorados, repetitivos e
muitas vezes inviáveis.
Exige que o testador tenha as habilidades
necessárias para atuar nestas áreas e destreza
para saber priorizar os testes que deverão ser
executados, pois na maioria das vezes não dá
tempo para testar tudo.
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
Testes automatizados para ajudar a remover limitações
10
Testes automatizados são scripts
programados para avaliar os softwares,
eles complementam o trabalho manual.
Nos traz uma série de benefícios, como:
Segurança mesmo após fazer alterações
drásticas no sistema, redução de debugs no
código, velocidade na liberação de versões,
economia no tempo dos testadores manuais.
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
Testes automatizados para ajudar a remover limitações
11
Vejamos alguns frameworks
open-source usados para
automatizar testes
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
Testes automatizados para ajudar a remover limitações
12
PHPUnit
Usado para automatizar testes de
unidade em PHP
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
Testes automatizados para ajudar a remover limitações
13
class PedidoTest extends PHPUnit_Framework_TestCase
{
/**
* @test
* @author Julio
*/
public function aoAdicionarProdutoAListaDeveraConterApenas1Item()
{
// Arrange
$pedido = new Pedido();
$produto = $this->getMockBuilder("IProduto")
->setConstructorArgs(
array(1, "PlayStation", 5, 999.99)
)
->getMock();
// Act
$pedido->addItemPedido($produto, 2);
$pedidoitens = $pedido->getPedidoItens();
// Assert
$this->assertCount(1, $pedidoitens);
$this->assertEquals(array($produto, 2), $pedidoitens[0]);
}
}
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
Testes automatizados para ajudar a remover limitações
14
PHPUnit com Guzzle
Guzzle é um framework usado para
fazer requisições à APIs Rest
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
Testes automatizados para ajudar a remover limitações
15
class PedidoAPITest extends PHPUnit_Framework_TestCase
{
/**
* @test
* @author Julio
*/
public function testAcessarRootEntaoReceber200SucessoECodigo()
{
// Arrange
$client = new GuzzleHttpClient(
["base_uri" => "http://localhost:8888/qualister-testing/api"]
);
// Act
$resposta = $this->client->get("/", ['auth' => ['phptesting', '123']]);
// Assert
$this->assertEquals(200, $resposta->getStatusCode());
$body = json_decode($resposta->getBody(), true);
$this->assertEquals("gnitsetphp", $body["data"]["codigo"]);
}
}
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
Testes automatizados para ajudar a remover limitações
16
PHPUnit com Selenium
WebDriver
Selenium WebDriver é um framework
usado para simular interações com
aplicações web em um browser real ou
headless
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
Testes automatizados para ajudar a remover limitações
17
class PedidoWebTest extends PHPUnit_Framework_TestCase
{
/**
* @test
* @author Julio
*/
public function acessarPaginaInicialValidarMensagensDeAlerta()
{
// Arrange
$this->driver = RemoteWebDriver::create("http://localhost:
4444/wd/hub", DesiredCapabilities::firefox());
$this->driver->manage()->window()->maximize();
$this->driver->get("http://localhost:8888/qualister-php-
testing/web/");
// Act
$this->driver->findElement(WebDriverBy::id("order"))->click();
$this->driver->switchTo()->alert()->accept();
$texto = $this->driver->switchTo()->alert()->getText();
$this->driver->switchTo()->alert()->accept();
// Arrange
$this->assertContains("Faça login antes", $texto);
}
}
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
Muitos frameworks e uma curva de aprendizagem maior
18
Existem muitos frameworks PHP
utilizados para automatizar testes, mas
cada um deles tem suas características
e uma forma específica de escrita.
Todos eles usam a forma de organização
dos testes em linguagem técnica e não
de negócios.
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
Codeception e sua DSL Jedi
19
Codeception é um framework criado
para facilitar a automação de testes em
todas as camadas de um software,
escrevendo seguindo o padrão BDD.
Ele possui um DSL própria, muito simples
de se compreender.
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
Codeception e sua DSL Jedi
20
<?php
$I = new AcceptanceTester($scenario);
$I->am('Administrador de uma loja');
$I->wantTo('gerenciar movimentações');
$I->lookForwardTo('Ver, de forma simples, as entradas e
saídas de valores');
$I->amOnPage('/');
$I->fillField('usuariologin', 'teste');
$I->fillField('usuariosenha', '123');
$I->click('Entrar');
$I->click('Movimentações');
$I->click('Nova movimentação');
$I->selectOption("select", "Entrada");
$I->fillField('movimentacaovalor', '500,00');
$I->fillField('movimentacaoitens', 'Almoçar');
$I->click('Gravar');
$I->see('Sucesso ao inserir a movimentação');
?>
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
Codeception e sua DSL Jedi
21
Para usar o Codeception basta baixar o
arquivo codecept.phar e adiciona-lo na
raiz do diretório do projeto, no nosso
caso, "PHPConferenceBr".
E então rodar o comando "php
codecept.phar bootstrap" para
criar a arquitetura inicial.
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
Automatizando testes de unidade
22
Automatizando testes de
unidade com Codeception
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
Automatizando testes de unidade
23
1. Execute o comando "php codecept.phar
generate:test unit Pedido" para criar
uma classe de teste de unidade chamada
"PedidoTest.php";

2. Adicione os requires às classes que serão
testadas:
require './src/Pedido.php';
require './src/PedidoServicos.php';

3. Adicione os comandos abaixo no
PedidoTest.php contido na pasta tests/unit:
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
Automatizando testes de unidade
24
public function
testAdicionarProdutoNoPedidoValidarQueFoiAdicionado()
{
// Arrange
$pedido = new Pedido();
$pedidoServicos = CodeceptionUtil
Stub::make('PedidoServicos', ['salvar' =>
'Sucesso']);
// Act
$resposta = $pedidoServicos->salvar($pedido);
// Assert
$this->tester->assertEquals('Sucesso',
$resposta);
}
4. Execute-o digitando o comando "php
codecept.phar run unit".
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
Automatizando testes de API
25
Automatizando testes de API
com Codeception
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
Automatizando testes de API
26
1. Execute o comando "php codecept.phar generate:suite
api" para gerar a suite de API
2. Adicione as configurações dos testes de API no arquivo
api.suite.yml:
class_name: ApiTester
modules:
enabled:
- REST:
url: 'http://localhost:8888/
qualister-php-testing/api'
depends: PhpBrowser
3. Execute o comando "php codecept.phar build" para que o
projeto seja atualizado e construídas as dependências referentes à
suite de APIs
4. Execute o comando "php codecept.phar generate:cept
api NovoPedido" para criar um teste de API
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
Automatizando testes de API
27
5. Adicione os comandos abaixo no NovoPedidoCept.php contido na pasta
tests/api:
<?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']);
?>
6. Execute-o digitando o comando "php codecept.phar run api --
steps".
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
Automatizando testes Aceitação Web
28
Automatizando testes de
Aceitação Web com
Codeception
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
Automatizando testes Aceitação Web
29
1. Execute o comando "php codecept.phar
generate:cept acceptance NovoPedido"
para criar um teste de aceitação web
2. Adicione as configurações dos testes de
Aceitação no arquivo acceptance.suite.yml:
class_name: AcceptanceTester
modules:
enabled:
- PhpBrowser:
url: 'http://localhost:8888/
qualister-php-testing/web'
- HelperAcceptance
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
Automatizando testes Aceitação Web
30
3. Adicione os comandos abaixo no NovoPedidoCept.php contido na
pasta tests/acceptance:
<?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');
?>
4. Execute-o digitando o comando "php codecept.phar run
acceptance --steps".
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
Automatizando testes Aceitação Web
31
É possível também executar os testes
utilizando browsers reais, ao invés de
utilizar testes com browsers headless,
neste caso, usa-se o Selenium WebDriver
para executar tal ação, veja os passos a
seguir.
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
Automatizando testes Aceitação Web
32
1. Baixe o Selenium Server Standalone em https://selenium-
release.storage.googleapis.com/index.html?path=2.46/ e mova-o para a pasta
"bin" dentro do projeto



2. Starte o Selenium Server usando o comando "java -jar bin/selenium-
server-standalone-2.46.0.jar"

3. Altera as configurações dos testes de Aceitação no arquivo
acceptance.suite.yml:
class_name: AcceptanceTester
modules:
enabled:
- WebDriver:
url: 'http://localhost:8888/qualister-php-
testing/web'
browser: firefox
window_size: maximize
- HelperAcceptance

4. Execute-o digitando o comando "php codecept.phar run acceptance --
steps".
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
Executando todos os testes e gerando relatórios
33
Executando todos os testes e
gerando relatórios:
php codecept.phar run --html
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
34
Links interessantes
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
35
• https://github.com/sebastianbergmann/phpunit
• https://github.com/guzzle/guzzle
• https://github.com/facebook/php-webdriver
• http://codeception.com/
• http://www.qualister.com.br/videos/tdc2015-
hands-on-de-automacao-de-testes-de-unidade-
api-e-aceitacao-com-codeception
Referências
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
36
PHPSP + Pub
www.qualister.com.brwww.qualister.com.br
Texto do Título
• Nível de Corpo Um
– Nível de Corpo Dois
• Nível de Corpo Três
– Nível de Corpo Quatro
» Nível de Corpo Cinco
37

[PHPConferenceBR] Automação de testes com Codeception

  • 1.
    www.qualister.com.br (48) 4052-9536 /9540 contato@qualister.com.br Automação de testes BDD usando Codeception
 
 por Júlio de Lima
 @juliodelimas
  • 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 (CTFL e CTAL-TM pelo ISTQB) e nacional (CBTS pela ALATS) relacionada a testes de software além de ser certificado na ferramenta SoapUI Pro pela SmartBear Software. Atualmente é consultor de automação de testes e instrutor na Qualister e é professor de disciplina de teste de software em cursos de pós- graduação no Paraná e em Santa Catarina. julio.lima@qualister.com.br twitter.com/juliodelimas br.linkedin.com/in/juliodelimas goldtips.by/juliodelimas
  • 3.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco BDD: Desenvolvimento Dirigido por Comportamentos 3 BDD: Desenvolvimento Dirigido por Comportamentos Analisando as empresas brasileiras usando a regra de Paretto, apenas 20% usam documentação com base em UML, as outras 80% documentam o software com linguagem comum, e-mails, verbalmente ou mesmo papel de pão.
  • 4.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco BDD: Desenvolvimento Dirigido por Comportamentos 4 Um exemplo de descrição do software por e-mail "Olá José, aqui é a Maria, preciso que altere nosso sistema. Quero ter a possibilidade de registrar as movimentações de entrada e saída (no máximo 100 reais) de nosso caixa."
  • 5.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco BDD: Desenvolvimento Dirigido por Comportamentos 5 Agora, o mesmo exemplo usando BDD Funcionalidade: Gerenciar Movimentações Sendo o administrador de uma loja Posso gerenciar movimentações Para que possa ver, de forma simples, as entradas e saídas de valores Cenário: Gerando uma movimentação de entrada Dado que eu esteja autenticado como administrador E que eu tenha acessado o menu "Movimentações" E clicado em "Nova movimentação” para inserir uma movimentação Quando eu informar os dados: |tipo|valor|itens| |Entrada|500,00|Almoçar| E clicar em "Gravar" Então verei a mensagem "Sucesso ao inserir a movimentação"
  • 6.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco BDD: Desenvolvimento Dirigido por Comportamentos 6 Cenário: Gerando uma movimentação de saída dentro do valor limite Dado que eu esteja autenticado como administrador E que eu tenha acessado o menu "Movimentações" E clicado em "Nova movimentação” para inserir uma movimentação Quando eu informar os dados: |tipo|valor|itens| |Saída|100,00|Almoçar| E clicar em "Gravar" Então verei a mensagem "Sucesso ao inserir a movimentação" Cenário: Gerando uma movimentação de saída fora do valor limite Dado que eu esteja autenticado como administrador E que eu tenha acessado o menu "Movimentações" E clicado em "Nova movimentação” para inserir uma movimentação Quando eu informar os dados: |tipo|valor|itens| |Saída|100,01|Almoçar| E clicar em "Gravar" Então verei a mensagem "São permitidas apenas movimentações de saída de até 100 reais"
  • 7.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco Testes manuais e suas limitações 7 Os testes manuais servem para testar, sem o uso de ferramentas automatizadas, se o software atende as necessidades do cliente e se funciona como esperado. Clientes podem ser: O usuário final, os desenvolvedores, as empresas que consumirão nossa API, entre outros.
  • 8.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco Testes manuais e suas limitações 8 Os testes tendem a serem trabalhosos, custosos, demorados, repetitivos e muitas vezes inviáveis. Exige que o testador tenha as habilidades necessárias para atuar nestas áreas e destreza para saber priorizar os testes que deverão ser executados, pois na maioria das vezes não dá tempo para testar tudo.
  • 9.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco Testes manuais e suas limitações 9 Os testes tendem a serem trabalhosos, custosos, demorados, repetitivos e muitas vezes inviáveis. Exige que o testador tenha as habilidades necessárias para atuar nestas áreas e destreza para saber priorizar os testes que deverão ser executados, pois na maioria das vezes não dá tempo para testar tudo.
  • 10.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco Testes automatizados para ajudar a remover limitações 10 Testes automatizados são scripts programados para avaliar os softwares, eles complementam o trabalho manual. Nos traz uma série de benefícios, como: Segurança mesmo após fazer alterações drásticas no sistema, redução de debugs no código, velocidade na liberação de versões, economia no tempo dos testadores manuais.
  • 11.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco Testes automatizados para ajudar a remover limitações 11 Vejamos alguns frameworks open-source usados para automatizar testes
  • 12.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco Testes automatizados para ajudar a remover limitações 12 PHPUnit Usado para automatizar testes de unidade em PHP
  • 13.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco Testes automatizados para ajudar a remover limitações 13 class PedidoTest extends PHPUnit_Framework_TestCase { /** * @test * @author Julio */ public function aoAdicionarProdutoAListaDeveraConterApenas1Item() { // Arrange $pedido = new Pedido(); $produto = $this->getMockBuilder("IProduto") ->setConstructorArgs( array(1, "PlayStation", 5, 999.99) ) ->getMock(); // Act $pedido->addItemPedido($produto, 2); $pedidoitens = $pedido->getPedidoItens(); // Assert $this->assertCount(1, $pedidoitens); $this->assertEquals(array($produto, 2), $pedidoitens[0]); } }
  • 14.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco Testes automatizados para ajudar a remover limitações 14 PHPUnit com Guzzle Guzzle é um framework usado para fazer requisições à APIs Rest
  • 15.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco Testes automatizados para ajudar a remover limitações 15 class PedidoAPITest extends PHPUnit_Framework_TestCase { /** * @test * @author Julio */ public function testAcessarRootEntaoReceber200SucessoECodigo() { // Arrange $client = new GuzzleHttpClient( ["base_uri" => "http://localhost:8888/qualister-testing/api"] ); // Act $resposta = $this->client->get("/", ['auth' => ['phptesting', '123']]); // Assert $this->assertEquals(200, $resposta->getStatusCode()); $body = json_decode($resposta->getBody(), true); $this->assertEquals("gnitsetphp", $body["data"]["codigo"]); } }
  • 16.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco Testes automatizados para ajudar a remover limitações 16 PHPUnit com Selenium WebDriver Selenium WebDriver é um framework usado para simular interações com aplicações web em um browser real ou headless
  • 17.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco Testes automatizados para ajudar a remover limitações 17 class PedidoWebTest extends PHPUnit_Framework_TestCase { /** * @test * @author Julio */ public function acessarPaginaInicialValidarMensagensDeAlerta() { // Arrange $this->driver = RemoteWebDriver::create("http://localhost: 4444/wd/hub", DesiredCapabilities::firefox()); $this->driver->manage()->window()->maximize(); $this->driver->get("http://localhost:8888/qualister-php- testing/web/"); // Act $this->driver->findElement(WebDriverBy::id("order"))->click(); $this->driver->switchTo()->alert()->accept(); $texto = $this->driver->switchTo()->alert()->getText(); $this->driver->switchTo()->alert()->accept(); // Arrange $this->assertContains("Faça login antes", $texto); } }
  • 18.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco Muitos frameworks e uma curva de aprendizagem maior 18 Existem muitos frameworks PHP utilizados para automatizar testes, mas cada um deles tem suas características e uma forma específica de escrita. Todos eles usam a forma de organização dos testes em linguagem técnica e não de negócios.
  • 19.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco Codeception e sua DSL Jedi 19 Codeception é um framework criado para facilitar a automação de testes em todas as camadas de um software, escrevendo seguindo o padrão BDD. Ele possui um DSL própria, muito simples de se compreender.
  • 20.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco Codeception e sua DSL Jedi 20 <?php $I = new AcceptanceTester($scenario); $I->am('Administrador de uma loja'); $I->wantTo('gerenciar movimentações'); $I->lookForwardTo('Ver, de forma simples, as entradas e saídas de valores'); $I->amOnPage('/'); $I->fillField('usuariologin', 'teste'); $I->fillField('usuariosenha', '123'); $I->click('Entrar'); $I->click('Movimentações'); $I->click('Nova movimentação'); $I->selectOption("select", "Entrada"); $I->fillField('movimentacaovalor', '500,00'); $I->fillField('movimentacaoitens', 'Almoçar'); $I->click('Gravar'); $I->see('Sucesso ao inserir a movimentação'); ?>
  • 21.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco Codeception e sua DSL Jedi 21 Para usar o Codeception basta baixar o arquivo codecept.phar e adiciona-lo na raiz do diretório do projeto, no nosso caso, "PHPConferenceBr". E então rodar o comando "php codecept.phar bootstrap" para criar a arquitetura inicial.
  • 22.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco Automatizando testes de unidade 22 Automatizando testes de unidade com Codeception
  • 23.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco Automatizando testes de unidade 23 1. Execute o comando "php codecept.phar generate:test unit Pedido" para criar uma classe de teste de unidade chamada "PedidoTest.php";
 2. Adicione os requires às classes que serão testadas: require './src/Pedido.php'; require './src/PedidoServicos.php';
 3. Adicione os comandos abaixo no PedidoTest.php contido na pasta tests/unit:
  • 24.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco Automatizando testes de unidade 24 public function testAdicionarProdutoNoPedidoValidarQueFoiAdicionado() { // Arrange $pedido = new Pedido(); $pedidoServicos = CodeceptionUtil Stub::make('PedidoServicos', ['salvar' => 'Sucesso']); // Act $resposta = $pedidoServicos->salvar($pedido); // Assert $this->tester->assertEquals('Sucesso', $resposta); } 4. Execute-o digitando o comando "php codecept.phar run unit".
  • 25.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco Automatizando testes de API 25 Automatizando testes de API com Codeception
  • 26.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco Automatizando testes de API 26 1. Execute o comando "php codecept.phar generate:suite api" para gerar a suite de API 2. Adicione as configurações dos testes de API no arquivo api.suite.yml: class_name: ApiTester modules: enabled: - REST: url: 'http://localhost:8888/ qualister-php-testing/api' depends: PhpBrowser 3. Execute o comando "php codecept.phar build" para que o projeto seja atualizado e construídas as dependências referentes à suite de APIs 4. Execute o comando "php codecept.phar generate:cept api NovoPedido" para criar um teste de API
  • 27.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco Automatizando testes de API 27 5. Adicione os comandos abaixo no NovoPedidoCept.php contido na pasta tests/api: <?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']); ?> 6. Execute-o digitando o comando "php codecept.phar run api -- steps".
  • 28.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco Automatizando testes Aceitação Web 28 Automatizando testes de Aceitação Web com Codeception
  • 29.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco Automatizando testes Aceitação Web 29 1. Execute o comando "php codecept.phar generate:cept acceptance NovoPedido" para criar um teste de aceitação web 2. Adicione as configurações dos testes de Aceitação no arquivo acceptance.suite.yml: class_name: AcceptanceTester modules: enabled: - PhpBrowser: url: 'http://localhost:8888/ qualister-php-testing/web' - HelperAcceptance
  • 30.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco Automatizando testes Aceitação Web 30 3. Adicione os comandos abaixo no NovoPedidoCept.php contido na pasta tests/acceptance: <?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'); ?> 4. Execute-o digitando o comando "php codecept.phar run acceptance --steps".
  • 31.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco Automatizando testes Aceitação Web 31 É possível também executar os testes utilizando browsers reais, ao invés de utilizar testes com browsers headless, neste caso, usa-se o Selenium WebDriver para executar tal ação, veja os passos a seguir.
  • 32.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco Automatizando testes Aceitação Web 32 1. Baixe o Selenium Server Standalone em https://selenium- release.storage.googleapis.com/index.html?path=2.46/ e mova-o para a pasta "bin" dentro do projeto
 
 2. Starte o Selenium Server usando o comando "java -jar bin/selenium- server-standalone-2.46.0.jar"
 3. Altera as configurações dos testes de Aceitação no arquivo acceptance.suite.yml: class_name: AcceptanceTester modules: enabled: - WebDriver: url: 'http://localhost:8888/qualister-php- testing/web' browser: firefox window_size: maximize - HelperAcceptance
 4. Execute-o digitando o comando "php codecept.phar run acceptance -- steps".
  • 33.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco Executando todos os testes e gerando relatórios 33 Executando todos os testes e gerando relatórios: php codecept.phar run --html
  • 34.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco 34 Links interessantes
  • 35.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco 35 • https://github.com/sebastianbergmann/phpunit • https://github.com/guzzle/guzzle • https://github.com/facebook/php-webdriver • http://codeception.com/ • http://www.qualister.com.br/videos/tdc2015- hands-on-de-automacao-de-testes-de-unidade- api-e-aceitacao-com-codeception Referências
  • 36.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco 36 PHPSP + Pub
  • 37.
    www.qualister.com.brwww.qualister.com.br Texto do Título •Nível de Corpo Um – Nível de Corpo Dois • Nível de Corpo Três – Nível de Corpo Quatro » Nível de Corpo Cinco 37