Download - Testes de unidade na prática
![Page 1: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/1.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/2.jpg)
Tiago FurtadoMestre em Ciência da ComputaçãoUniversidade Federal de Viçosa (UFV)
![Page 3: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/3.jpg)
![Page 4: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/4.jpg)
Vamos falar de coisa boa?
![Page 5: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/5.jpg)
Testes de unidade
![Page 6: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/6.jpg)
![Page 7: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/7.jpg)
Testes de softwareunidade
![Page 8: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/8.jpg)
Testes de software
8/70
![Page 9: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/9.jpg)
Testes de software
9/70
![Page 10: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/10.jpg)
Testes de software
Martin Fowler. martinfowler.com/bliki/TestPyramid.html, 2012.
10/70
![Page 11: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/11.jpg)
Testes de software
11/70
![Page 12: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/12.jpg)
Testes de unidadeO que são? Onde vivem? De que se alimentam?
![Page 13: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/13.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/14.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/15.jpg)
O todo é maior do que a simples somadas suas partes.
“”
Aristóteles
![Page 16: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/16.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/17.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/18.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/19.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/20.jpg)
![Page 21: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/21.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/22.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/23.jpg)
Testes de unidadeComo?
Manualmente
23/70
![Page 24: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/24.jpg)
Testes de unidadeComo?
~Automático~
24/70
![Page 25: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/25.jpg)
Testes de unidadeComo?
Usando um framework de testes
25/70
![Page 26: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/26.jpg)
E quando um objeto interage com outro?
26/70
![Page 27: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/27.jpg)
Objetos dublês!
27/70
![Page 28: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/28.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/29.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/30.jpg)
Quando escrevê-los?!
30/70
![Page 31: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/31.jpg)
![Page 32: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/32.jpg)
TDDTest-driven development
![Page 33: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/33.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/34.jpg)
Test-driven development (TDD)
34/70
![Page 35: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/35.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/36.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/37.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/38.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/39.jpg)
![Page 40: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/40.jpg)
Test-driven development (TDD)3. Escrever código
class Calculator{
}
PHP
40/70
![Page 41: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/41.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/42.jpg)
Test-driven development (TDD)5. Refatorar o código
42/70
![Page 43: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/43.jpg)
Test-driven development (TDD)Repetir...
43/70
![Page 44: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/44.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/45.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/46.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/47.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/48.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/49.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/50.jpg)
Test-driven development (TDD)Repetir...
50/70
![Page 51: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/51.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/52.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/53.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/54.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/55.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/56.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/57.jpg)
Test-driven development (TDD)Repetir...
57/70
![Page 58: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/58.jpg)
Cobertura de testes
![Page 59: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/59.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/60.jpg)
Como garantir 100% de cobertura de testes?
60/70
![Page 61: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/61.jpg)
![Page 62: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/62.jpg)
Testes de unidade na Meritt
![Page 63: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/63.jpg)
Testes de unidade na MerittStatus
63/70
![Page 64: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/64.jpg)
Testes de unidade na MerittStatus
64/70
![Page 65: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/65.jpg)
Considerações finais
![Page 66: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/66.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/67.jpg)
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 69: Testes de unidade na prática](https://reader030.vdocuments.pub/reader030/viewer/2022020123/55aeaadc1a28abfc2d8b466b/html5/thumbnails/69.jpg)
Pay attention to zeros. If there is a zero,someone will divide by it.
“”
Cem Kaner