testes de unidade na prática

70
Testes de unidade na prática Por quê? Quando? Como? Tiago Furtado < [email protected]> Full-stack developer, Meritt XVII SECCOM

Upload: tiago-furtado

Post on 22-Jul-2015

136 views

Category:

Software


1 download

TRANSCRIPT

Page 1: Testes de unidade na prática

Testes de unidade na práticaPor quê? Quando? Como?

Tiago Furtado <[email protected]>Full-stack developer, MerittXVII SECCOM

Page 2: Testes de unidade na prática

Tiago FurtadoMestre em Ciência da ComputaçãoUniversidade Federal de Viçosa (UFV)

Page 3: Testes de unidade na prática
Page 4: Testes de unidade na prática

Vamos falar de coisa boa?

Page 5: Testes de unidade na prática

Testes de unidade

Page 6: Testes de unidade na prática
Page 7: Testes de unidade na prática

Testes de softwareunidade

Page 8: Testes de unidade na prática

Testes de software

8/70

Page 9: Testes de unidade na prática

Testes de software

9/70

Page 10: Testes de unidade na prática

Testes de software

Martin Fowler. martinfowler.com/bliki/TestPyramid.html, 2012.

10/70

Page 11: Testes de unidade na prática

Testes de software

11/70

Page 12: Testes de unidade na prática

Testes de unidadeO que são? Onde vivem? De que se alimentam?

Page 13: Testes de unidade na prática

Testes de unidade

interface CalculatorInterface { public function sum($first, $second); public function subtract($first, $second);}

class Calculator implements CalculatorInterface { /* ... */ }

class CalculatorTest { /** @test */ public function sumShouldReturnTheSumOfTwoNumbers() { $calculator = new Calculator(); $result = $calculator->sum(1, 2); if ($result !== 3) { throw new Exception("Something wrong's not right ̄\_(ツ)_/̄"); } }}

PHP

13/70

Page 14: Testes de unidade na prática

Testes de unidadePor quê?

Software livre de defeitos deveria ser sempre entregueMas...

··

software é muito complexopessoas são imperfeitas! ><"

--

14/70

Page 15: Testes de unidade na prática

O todo é maior do que a simples somadas suas partes.

“”

Aristóteles

Page 16: Testes de unidade na prática

Testes de unidadePor quê?

Garantir a correção das partes

interface PersonInterface { public function canBeArrested();}

class Person implements PersonInterface { public function __construct($age); /*...*/}

(new Person(17))->canBeArrested();(new Person(18))->canBeArrested();(new Person(19))->canBeArrested();(new Person(-1))->canBeArrested();(new Person(0))->canBeArrested();(new Person("RUKM?"))->canBeArrested();

PHP

Page 17: Testes de unidade na prática

Testes de unidadePor quê?

Ampliar a capacidade de análise do todo

interface PersonInterface { /*...*/ }class Person implements PersonInterface { public function __construct($age); /*...*/}

interface PoliceInterface { public function arrest(PersonInterface $person);}class Police implements PoliceInterface { /*...*/ }

$police = new Police();$police->arrest(new Person(15));$police->arrest(new Person(19));

PHP

Page 18: Testes de unidade na prática

Testes de unidadeComo?

Manualmente

function sum($a, $b) { return $a + 0;}

printf("sum(%d, %d) = %d [%d]\n", 0, 0, sum(0, 0), 0);printf("sum(%d, %d) = %d [%d]\n", 1, 0, sum(1, 0), 1);printf("sum(%d, %d) = %d [%d]\n", 0, 1, sum(0, 1), 1);

PHP

sum(0, 0) = 0 [0]sum(1, 0) = 1 [1]sum(0, 1) = 0 [1]

18/70

Page 19: Testes de unidade na prática

Testes de unidadeComo?

Manualmente

function sum($a, $b) { return $a + $b;}

printf("sum(%d, %d) = %d [%d]\n", 0, 0, sum(0, 0), 0);printf("sum(%d, %d) = %d [%d]\n", 1, 0, sum(1, 0), 1);printf("sum(%d, %d) = %d [%d]\n", 0, 1, sum(0, 1), 1);

PHP

sum(0, 0) = 0 [0]sum(1, 0) = 1 [1]sum(0, 1) = 1 [1]

19/70

Page 20: Testes de unidade na prática
Page 21: Testes de unidade na prática

Testes de unidade

1 <?php2 function sum($a, $b) {3 return 0 + $b;4 }56 function sumTest($a, $b, $c) {7 if (sum($a, $b) === $c) { return; }8 throw new Exception(/*...*/);9 }10 sumTest(0, 0, 0);11 sumTest(1, 0, 1);12 sumTest(0, 1, 1);

PHP

PHP Fatal error: Uncaught exception 'Exception' in sumTest.php:8Stack trace:#0 sumTest.php(11): sumTest(1, 0, 1)#1 {main} thrown in sumTest.php on line 8

Page 22: Testes de unidade na prática

Testes de unidadeComo?

Usando um framework de testes

class Calculator { public function sum($a, $b) { return $a + $b; }}

class CalculatorTest extends PHPUnit_Framework_TestCase { /** @test */ public function sumTest() { $this->assertSame(0, sum(0, 0)); $this->assertSame(1, sum(1, 0)); $this->assertSame(1, sum(0, 1)); }}

PHP

Page 23: Testes de unidade na prática

Testes de unidadeComo?

Manualmente

23/70

Page 24: Testes de unidade na prática

Testes de unidadeComo?

~Automático~

24/70

Page 25: Testes de unidade na prática

Testes de unidadeComo?

Usando um framework de testes

25/70

Page 26: Testes de unidade na prática

E quando um objeto interage com outro?

26/70

Page 27: Testes de unidade na prática

Objetos dublês!

27/70

Page 28: Testes de unidade na prática

Testes de unidade

class Police implements PoliceInterface { public function arrest(PersonInterface $person) { if (! $person->canBeArrested()) { throw new Exception(/*...*/); } }}

PHP

28/70

Page 29: Testes de unidade na prática

Testes de unidade

class PoliceTest extends PHPUnit_Framework_TestCase { /** @test */ public function arrestShouldThrowExceptionIfPersonCantBeArrested() { $person = $this->getMockForAbstractClass(PersonInterface::class); $person->expects($this->once()) ->method('canBeArrested') ->willReturn(false);

$this->setExpectedException(Exception::class);

$police = new Police(); $police->arrest($person); }}

PHP

29/70

Page 30: Testes de unidade na prática

Quando escrevê-los?!

30/70

Page 31: Testes de unidade na prática
Page 32: Testes de unidade na prática

TDDTest-driven development

Page 33: Testes de unidade na prática

Test-driven development (TDD)Princípios

KISS: Keep It Simple, Stupid

YAGNI: You Aren't Gonna Need It

33/70

Page 34: Testes de unidade na prática

Test-driven development (TDD)

34/70

Page 35: Testes de unidade na prática

Test-driven development (TDD)1. Escrever um teste

class CalculatorTest extends PHPUnit_Framework_TestCase{ /** * @test */ public function sumTest() { }}

PHP

35/70

Page 36: Testes de unidade na prática

Test-driven development (TDD)2. Garantir que o novo teste falha

$ ./vendor/bin/phpunit --bootstrap ./vendor/autoload.php test/CalculatorTest.phpPHPUnit 4.5-gf75e6b2 by Sebastian Bergmann.

.

Time: 75 ms, Memory: 2.75Mb

OK (1 test, 0 assertions)

36/70

Page 37: Testes de unidade na prática

Test-driven development (TDD)2. Garantir que o novo teste falha

class CalculatorTest extends PHPUnit_Framework_TestCase{ /** * @test */ public function sumTest() { $calculator = new Calculator(); }}

PHP

37/70

Page 38: Testes de unidade na prática

Test-driven development (TDD)2. Garantir que o novo teste falha

$ ./vendor/bin/phpunit --bootstrap ./vendor/autoload.php test/CalculatorTest.phpPHPUnit 4.5-gf75e6b2 by Sebastian Bergmann.

PHP Fatal error: Class 'TFurtado\UnitTestSample\Calculator' not found in .../test/CalculatorTest.php on line 19PHP Stack trace:PHP 1. {main}() ./vendor/phpunit/phpunit/phpunit:0 ...

38/70

Page 39: Testes de unidade na prática
Page 40: Testes de unidade na prática

Test-driven development (TDD)3. Escrever código

class Calculator{

}

PHP

40/70

Page 41: Testes de unidade na prática

Test-driven development (TDD)4. Garantir que os testes passam

$ ./vendor/bin/phpunit --bootstrap ./vendor/autoload.php test/CalculatorTest.phpPHPUnit 4.5-gf75e6b2 by Sebastian Bergmann.

.

Time: 65 ms, Memory: 2.75Mb

OK (1 test, 0 assertions)

41/70

Page 42: Testes de unidade na prática

Test-driven development (TDD)5. Refatorar o código

42/70

Page 43: Testes de unidade na prática

Test-driven development (TDD)Repetir...

43/70

Page 44: Testes de unidade na prática

Test-driven development (TDD)1. Escrever um teste

class CalculatorTest extends PHPUnit_Framework_TestCase{ /** * @test */ public function sumTest() { $calculator = new Calculator(); $this->assertSame(3, $calculator->sum(1, 2)); }}

PHP

44/70

Page 45: Testes de unidade na prática

Test-driven development (TDD)2. Garantir que o novo teste falha

$ ./vendor/bin/phpunit --bootstrap ./vendor/autoload.php test/CalculatorTest.phpPHPUnit 4.5-gf75e6b2 by Sebastian Bergmann.

PHP Fatal error: Call to undefined method TFurtado\UnitTestSample\Calculator::sum() in .../test/CalculatorTest.php on line 20PHP Stack trace:PHP 1. {main}() ./vendor/phpunit/phpunit/phpunit:0 ...

45/70

Page 46: Testes de unidade na prática

Test-driven development (TDD)3. Escrever código

class Calculator{ public function sum($a, $b) { $sum = 3; return $sum; }}

PHP

46/70

Page 47: Testes de unidade na prática

Test-driven development (TDD)4. Garantir que os testes passam

$ ./vendor/bin/phpunit --bootstrap ./vendor/autoload.php test/CalculatorTest.phpPHPUnit 4.5-gf75e6b2 by Sebastian Bergmann.

.

Time: 77 ms, Memory: 2.75Mb

OK (1 test, 1 assertion)

47/70

Page 48: Testes de unidade na prática

Test-driven development (TDD)5. Refatorar o código

class Calculator{ public function sum($a, $b) { return 3; }}

$sum = 3;return $sum;

PHP

48/70

Page 49: Testes de unidade na prática

Test-driven development (TDD)5. Refatorar o código

$ ./vendor/bin/phpunit --bootstrap ./vendor/autoload.php test/CalculatorTest.phpPHPUnit 4.5-gf75e6b2 by Sebastian Bergmann.

.

Time: 87 ms, Memory: 2.75Mb

OK (1 test, 1 assertion)

49/70

Page 50: Testes de unidade na prática

Test-driven development (TDD)Repetir...

50/70

Page 51: Testes de unidade na prática

Test-driven development (TDD)1. Escrever um teste

class CalculatorTest extends PHPUnit_Framework_TestCase{ /** * @test */ public function sumTest() { $calculator = new Calculator(); $this->assertSame(3, $calculator->sum(1, 2)); $this->assertSame(4, $calculator->sum(2, 2)); }}

PHP

51/70

Page 52: Testes de unidade na prática

Test-driven development (TDD)2. Garantir que o novo teste falha

$ ./vendor/bin/phpunit --bootstrap ./vendor/autoload.php test/CalculatorTest.phpPHPUnit 4.5-gf75e6b2 by Sebastian Bergmann.

FTime: 76 ms, Memory: 3.00MbThere was 1 failure:

1) TFurtado\UnitTestSample\CalculatorTest::sumTestFailed asserting that 3 is identical to 4.

.../test/CalculatorTest.php:21

FAILURES!Tests: 1, Assertions: 2, Failures: 1.

52/70

Page 53: Testes de unidade na prática

Test-driven development (TDD)3. Escrever código

class Calculator{ public function sum($a, $b) { $sum = $a + $b; return $sum; }}

return 3;

PHP

53/70

Page 54: Testes de unidade na prática

Test-driven development (TDD)4. Garantir que os testes passam

$ ./vendor/bin/phpunit --bootstrap ./vendor/autoload.php test/CalculatorTest.phpPHPUnit 4.5-gf75e6b2 by Sebastian Bergmann.

.

Time: 90 ms, Memory: 2.75Mb

OK (1 test, 2 assertions)

54/70

Page 55: Testes de unidade na prática

Test-driven development (TDD)5. Refatorar o código

class Calculator{ public function sum($a, $b) { ; return $a + $b; }}

$sum = $a + $b;return $sum

PHP

55/70

Page 56: Testes de unidade na prática

Test-driven development (TDD)5. Refatorar o código

$ ./vendor/bin/phpunit --bootstrap ./vendor/autoload.php test/CalculatorTest.phpPHPUnit 4.5-gf75e6b2 by Sebastian Bergmann.

.

Time: 87 ms, Memory: 2.75Mb

OK (1 test, 1 assertion)

56/70

Page 57: Testes de unidade na prática

Test-driven development (TDD)Repetir...

57/70

Page 58: Testes de unidade na prática

Cobertura de testes

Page 59: Testes de unidade na prática

Quanto do software deve estar coberto portestes de unidade?

100%!

TODO!

O software INTEIRO!Deu pra endenter, né?

59/70

Page 60: Testes de unidade na prática

Como garantir 100% de cobertura de testes?

60/70

Page 61: Testes de unidade na prática
Page 62: Testes de unidade na prática

Testes de unidade na Meritt

Page 63: Testes de unidade na prática

Testes de unidade na MerittStatus

63/70

Page 64: Testes de unidade na prática

Testes de unidade na MerittStatus

64/70

Page 65: Testes de unidade na prática

Considerações finais

Page 66: Testes de unidade na prática

Considerações finaisTestes de unidade são...

... essenciais para garantir a manutenibilidade do software

... instrumentos de simples implementação

... muito valiosos para criar um produto de qualidade

... uma importante forma de documentação técnica

... divertidos! Por que não?

·····

66/70

Page 67: Testes de unidade na prática

Considerações finaisTestes de unidade não são...

... a abordagem definitiva para testes de software

... uma garantia de qualidade do produto final

... a solução mágica para software mal arquitetado

···

67/70

Page 68: Testes de unidade na prática

Temos vagas!

meritt.recruiterbox.com

Page 69: Testes de unidade na prática

Pay attention to zeros. If there is a zero,someone will divide by it.

“”

Cem Kaner