qualidade no desenvolvimento de software com phpunit

37
Latinoware 2008

Upload: diegotremper

Post on 05-Dec-2014

7.140 views

Category:

Technology


2 download

DESCRIPTION

Palestra sobre PHPUnit apresentada no Latinoware 2008

TRANSCRIPT

Page 1: Qualidade no desenvolvimento de software com PHPUnit

Latinoware 2008

Page 2: Qualidade no desenvolvimento de software com PHPUnit

Diego Tremper Zend Certified Engineer Entusiasta PHP Palestrante Estudante

Page 3: Qualidade no desenvolvimento de software com PHPUnit

Introdução

Motivação

Vantagens

Como funciona?

O PHPUnit

Instalação

Caso de Teste

Configurando o Teste

PHPUnit_Framework_Assert

Verificações de exceções

Provedores de dados

Code Coverage

Perguntas

Page 4: Qualidade no desenvolvimento de software com PHPUnit

Errar é inerente a natureza humana. Precaver-se

contra os erros é uma atitude inteligente.

O processo de desenvolvimento de software é sujeito

a erros. Sendo assim, a atividade de teste é

fundamental para se obter produtos de software com

garantia de qualidade.

Discordar ou ignorar a frase acima revela grande

amadorismo.

Page 5: Qualidade no desenvolvimento de software com PHPUnit

Testes Unitários

São utilizados para testar as unidades de software

desenvolvidas

Tem como objetivo encontrar falhas de

funcionamento dentro de uma pequena parte do

sistema.

Page 6: Qualidade no desenvolvimento de software com PHPUnit

Porque testar?

Page 7: Qualidade no desenvolvimento de software com PHPUnit

“Na minha máquina funciona!”

“Mas eu testei!”

“Estranho!? parou de funcionar do nada!”

“Será que vai dar problema se eu alterar

isso?”

Page 8: Qualidade no desenvolvimento de software com PHPUnit

Evita surpresas desagradáveis

Reduz o tempo gasto com debug

Auxilia o refectoring (E muito!!!!)

Aumenta a qualidade do código

É um dos primeiros passos para a Integração

Contínua

Page 9: Qualidade no desenvolvimento de software com PHPUnit

1. Definir a interface pública do alvo

2. Implementar o esqueleto do alvo

3. Definir quais métodos serão testados

4. Definir os testes

5. Projetar/implementar o caso de teste

6. Implementar a classe alvo

7. Executar os testes

8. Analisar o resultado. Em caso de bugs voltar ao passo 6

9. Avaliar a corvertura dos testes. Planejar e definir novos testes se necessário

Page 10: Qualidade no desenvolvimento de software com PHPUnit

Caso de testes

Calculadora

Operações Valores de entrada Resultado esperado

add 1+1 2

sub 7-2 5

div 30/3 10

mult 4*4 16

div 2/0 Exceção???

Page 11: Qualidade no desenvolvimento de software com PHPUnit

Escrito por Sebastian Bergmann

Utilizado para escrever os testes

É adequado para os níveis de teste unitário e de

integração

Usa asserções para testar os resultados esperados.

Dispõem de métodos para facilitar a criação do

ambiente de teste.

Page 12: Qualidade no desenvolvimento de software com PHPUnit

Quem usa?

eZ Systems

▪ eZ Components

Zend Technolgies Ltd.

▪ Zend Framework

PHP-GTK

IBM SDO

Creole

Propel

Phing

Eu!

Page 13: Qualidade no desenvolvimento de software com PHPUnit

$ pear channel-discover pear.phpunit.de $ pear install phpunit/PHPUnit

Page 14: Qualidade no desenvolvimento de software com PHPUnit

Classe Calculadora : definição da interface

<?php

class Calculadora {public function add($arg1, $arg2){}public function sub($arg1, $arg2){}public function mult($arg1, $arg2){}public function div($arg1, $arg2){}

}

Page 15: Qualidade no desenvolvimento de software com PHPUnit

Implementação dos testes

<?php

require_once 'PHPUnit/Framework/TestCase.php';require_once 'Calculadora.php';

class CalculadoraTest extends PHPUnit_Framework_TestCase {private $calculadora;protected function setUp() {

$this->calculadora = new Calculadora ( );}

public function testDiv($arg1, $arg2) {$result = $this->calculadora->div ( 30, 3 );$this->assertEquals ( 10, $result );

}}

Page 16: Qualidade no desenvolvimento de software com PHPUnit

Implementação dos testes

<?php

require_once 'PHPUnit/Framework/TestCase.php';require_once 'Calculadora.php';

class CalculadoraTest extends PHPUnit_Framework_TestCase {private $calculadora;protected function setUp() {

$this->calculadora = new Calculadora ( );}

public function testDiv($arg1, $arg2) {$result = $this->calculadora->div ( 30, 3 );$this->assertEquals ( 10, $result );

}}

Caso de TesteAs classes de teste devem estendera classe do framework

Page 17: Qualidade no desenvolvimento de software com PHPUnit

Implementação dos testes

<?php

require_once 'PHPUnit/Framework/TestCase.php';require_once 'Calculadora.php';

class CalculadoraTest extends PHPUnit_Framework_TestCase {private $calculadora;protected function setUp() {

$this->calculadora = new Calculadora ( );}

public function testDiv($arg1, $arg2) {$result = $this->calculadora->div ( 30, 3 );$this->assertEquals ( 10, $result );

}}

Inicialização da classe alvo

Page 18: Qualidade no desenvolvimento de software com PHPUnit

Implementação dos testes

<?php

require_once 'PHPUnit/Framework/TestCase.php';require_once 'Calculadora.php';

class CalculadoraTest extends PHPUnit_Framework_TestCase {private $calculadora;protected function setUp() {

$this->calculadora = new Calculadora ( );}

public function testDiv($arg1, $arg2) {$result = $this->calculadora->div ( 30, 3 );$this->assertEquals ( 10, $result );

}}

Afirmação do resultado

Valores de entrada

Page 19: Qualidade no desenvolvimento de software com PHPUnit

Classe Calculadora : implementação do alvo

<?php

class Calculadora {public function add($arg1, $arg2) {

return $arg1 + $arg2;}public function sub($arg1, $arg2) {

return $arg1 - $arg2;}public function mult($arg1, $arg2) {

return $arg1 * $arg2;}public function div($arg1, $arg2) {

return $arg1 / $arg2;}

}

Page 20: Qualidade no desenvolvimento de software com PHPUnit

Execução

Page 21: Qualidade no desenvolvimento de software com PHPUnit

Entendendo a execução

“.” Exibido quando a execução do teste é bem sucedida

“F” Exibido quando ocorre uma falha na execução

“E” Exibido quando ocorre um erro ao rodar o teste

“S” Exibido quando um teste não é executado

“I” Exibido quando um teste é marcado como imcompleto

ou não implementado

Page 22: Qualidade no desenvolvimento de software com PHPUnit

setUp() : será executado antes de cada teste

tearDown() : será executado depois de cada

teste

setUp() test*() tearDown()

Page 23: Qualidade no desenvolvimento de software com PHPUnit

<?php

require_once 'PHPUnit/Framework/TestCase.php';require_once 'Calculadora.php';

class CalculadoraTest extends PHPUnit_Framework_TestCase {

private $calculadora;

protected function setUp() {$this->calculadora = new Calculadora ( );

}

public function testDiv() {}public function testMult() {}

protected function tearDown() {$this->calculadora = null;

}}

Page 24: Qualidade no desenvolvimento de software com PHPUnit

markTestIncomplete($mensagem)

markTestSkipped($mensagem)

fail($mensagem)

assertTrue($variavel)

assertNull($variavel)

assertEquals($esperado, $atual)

assertContains($valor, $array)

assertRegExp($padrao, $string)

assertType($tipo, $variavel)

Page 25: Qualidade no desenvolvimento de software com PHPUnit

Como verificar se meu método lança uma exceção?

<?php

class Calculadora {

//...public function div($arg1, $arg2) {

if (0 == $arg2)throw new ArithmeticException('Somente Chuck Norris pode

dividir por zero!');return $arg1 / $arg2;

}//...

}

Page 26: Qualidade no desenvolvimento de software com PHPUnit

Como verificar se meu método lança uma exceção?

<?php

require_once 'PHPUnit/Framework/TestCase.php';require_once 'Calculadora.php';

class CalculadoraTest extends PHPUnit_Framework_TestCase {

//.../*** @expectedException ArithmeticException*/public function testDiv() {

$this->calculadora->div(2, 0);}//...

}

Page 27: Qualidade no desenvolvimento de software com PHPUnit

Utilizando provedores de dados

Util quando um mesmo método deve ser testado

com diferentes valores

Elimina a necessidade de ter vários testes apenas

com os valores de entrada e/ou resultado

esperado diferente

Page 28: Qualidade no desenvolvimento de software com PHPUnit

Utilizando provedores de dados

<?php

require_once 'PHPUnit/Framework/TestCase.php';require_once 'Calculadora.php';

class CalculadoraTest extends PHPUnit_Framework_TestCase {

public function testAdd1() {$this->assertEquals( 4, $this->calculadora->mult(2, 2));

}public function testAdd2() {

$this->assertEquals( 9, $this->calculadora->mult(3, 3));}public function testAdd3() {

$this->assertEquals( 16, $this->calculadora->mult(4, 4));}

}

Page 29: Qualidade no desenvolvimento de software com PHPUnit

Utilizando provedores de dados/*** @dataProvider dataProviderMult*/

public function testAddWithDataProvider($arg1, $arg2, $expected) {$this->assertEquals ( $expected,

$this->calculadora->add ( $arg1, $arg2 ));

}/*** @return array(array)*/public static function dataProviderMult() {

return array (// array ( argumento 1 , argumento 2 , resultado esperado )

array ( 2 , 2 , 4 ),array ( 3 , 3 , 9 )

);}

}

Page 30: Qualidade no desenvolvimento de software com PHPUnit

Como testar os meus testes?

Como saber quantos por cento de meu

código está coberto por testes?

Como saber quais linhas do meu código estão

cobertas por testes?

Page 31: Qualidade no desenvolvimento de software com PHPUnit

Utiliza a extensão xDebug

$ phpunit –coverage-html ./coverage CalculadoraTest.php

Page 32: Qualidade no desenvolvimento de software com PHPUnit
Page 33: Qualidade no desenvolvimento de software com PHPUnit

Linhas que não estão cobertaspor testes

Linhas que estão cobertaspor testes

Page 34: Qualidade no desenvolvimento de software com PHPUnit

Testar é uma atividade destrutiva!

Pense de forma negativa quando estiver

criando planos de teste ou explorando o

software!

Explore funcionalidades, pense no que não foi

pensado!

Page 35: Qualidade no desenvolvimento de software com PHPUnit

Perguntas?

Page 36: Qualidade no desenvolvimento de software com PHPUnit

Obrigado!!!

Contato: [email protected]: http://www.linkedin.com/in/diegotremper

Blog: http://www.diegotremper.com

Page 37: Qualidade no desenvolvimento de software com PHPUnit

http://www.phpunit.de/ http://www.xdebug.org