Por que usá-los? Como são escritos? Como automatizá-los? Serão abordados aspectos conceituais de qualidade de código, cobertura de testes e TDD, com exemplos em aplicações desenvolvidas na Meritt.
14. Testes de unidade
Por quê?
Software livre de defeitos deveria ser sempre entregue
Mas...
·
·
software é muito complexo
pessoas são imperfeitas! ><"
-
-
14/70
15. O todo é maior do que a simples soma
das suas partes.
“
”
Aristóteles
16. Testes de unidade
Por quê?
Garantir a correção das partes
interfacePersonInterface{
publicfunctioncanBeArrested();
}
classPersonimplementsPersonInterface{
publicfunction__construct($age);
/*...*/
}
(newPerson(17))->canBeArrested();
(newPerson(18))->canBeArrested();
(newPerson(19))->canBeArrested();
(newPerson(-1))->canBeArrested();
(newPerson(0))->canBeArrested();
(newPerson("RUKM?"))->canBeArrested();
PHP
17. Testes de unidade
Por quê?
Ampliar a capacidade de análise do todo
interfacePersonInterface{/*...*/}
classPersonimplementsPersonInterface{
publicfunction__construct($age);
/*...*/
}
interfacePoliceInterface{
publicfunctionarrest(PersonInterface$person);
}
classPoliceimplementsPoliceInterface{/*...*/}
$police=newPolice();
$police->arrest(newPerson(15));
$police->arrest(newPerson(19));
PHP
35. Test-driven development (TDD)
1. Escrever um teste
classCalculatorTestextendsPHPUnit_Framework_TestCase
{
/**
*@test
*/
publicfunctionsumTest()
{
}
}
PHP
35/70
36. Test-driven development (TDD)
2. Garantir que o novo teste falha
$./vendor/bin/phpunit--bootstrap./vendor/autoload.php
test/CalculatorTest.php
PHPUnit4.5-gf75e6b2bySebastianBergmann.
.
Time:75ms,Memory:2.75Mb
OK(1test,0assertions)
36/70
37. Test-driven development (TDD)
2. Garantir que o novo teste falha
classCalculatorTestextendsPHPUnit_Framework_TestCase
{
/**
*@test
*/
publicfunctionsumTest()
{
$calculator=newCalculator();
}
}
PHP
37/70
38. Test-driven development (TDD)
2. Garantir que o novo teste falha
$./vendor/bin/phpunit--bootstrap./vendor/autoload.php
test/CalculatorTest.php
PHPUnit4.5-gf75e6b2bySebastianBergmann.
PHPFatalerror:
Class'TFurtadoUnitTestSampleCalculator'notfound
in.../test/CalculatorTest.phponline19
PHPStacktrace:
PHP 1.{main}()./vendor/phpunit/phpunit/phpunit:0
...
38/70
44. Test-driven development (TDD)
1. Escrever um teste
classCalculatorTestextendsPHPUnit_Framework_TestCase
{
/**
*@test
*/
publicfunctionsumTest()
{
$calculator=newCalculator();
$this->assertSame(3,$calculator->sum(1,2));
}
}
PHP
44/70
45. Test-driven development (TDD)
2. Garantir que o novo teste falha
$./vendor/bin/phpunit--bootstrap./vendor/autoload.php
test/CalculatorTest.php
PHPUnit4.5-gf75e6b2bySebastianBergmann.
PHPFatalerror: Calltoundefinedmethod
TFurtadoUnitTestSampleCalculator::sum()
in.../test/CalculatorTest.phponline20
PHPStacktrace:
PHP 1.{main}()./vendor/phpunit/phpunit/phpunit:0
...
45/70
51. Test-driven development (TDD)
1. Escrever um teste
classCalculatorTestextendsPHPUnit_Framework_TestCase
{
/**
*@test
*/
publicfunctionsumTest()
{
$calculator=newCalculator();
$this->assertSame(3,$calculator->sum(1,2));
$this->assertSame(4,$calculator->sum(2,2));
}
}
PHP
51/70
52. Test-driven development (TDD)
2. Garantir que o novo teste falha
$./vendor/bin/phpunit--bootstrap./vendor/autoload.php
test/CalculatorTest.php
PHPUnit4.5-gf75e6b2bySebastianBergmann.
F
Time:76ms,Memory:3.00Mb
Therewas1failure:
1)TFurtadoUnitTestSampleCalculatorTest::sumTest
Failedassertingthat3isidenticalto4.
.../test/CalculatorTest.php:21
FAILURES!
Tests:1,Assertions:2,Failures:1.
52/70
66. Considerações finais
Testes 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
67. Considerações finais
Testes 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