[phpconferencebr] automação de testes com codeception
TRANSCRIPT
www.qualister.com.br
(48) 4052-9536 / 9540 [email protected]
Automação de testes BDD usando Codeception
por Júlio de Lima
@juliodelimas
Palestrante
Júlio de LimaEspecialista 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.
twitter.com/juliodelimasbr.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 GuzzleHttp\Client( ["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 = \Codeception\Util\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' - \Helper\Acceptance
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 projeto2. 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 - \Helper\Acceptance
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