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 (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
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