SlideShare uma empresa Scribd logo
1 de 70
Baixar para ler offline
Testes de unidade na prática
Porquê?Quando?Como?
Tiago Furtado <tfurtado@gmail.com>
Full-stack developer, Meritt
XVII SECCOM
Tiago Furtado
Mestre em Ciência da Computação
Universidade Federal de Viçosa (UFV)
Vamos falar de coisa boa?
Testes de unidade
Testes de softwareunidade
Testes de software
8/70
Testes de software
9/70
Testes de software
Martin Fowler. martinfowler.com/bliki/TestPyramid.html, 2012.
10/70
Testes de software
11/70
Testes de unidade
O que são? Onde vivem? De que se alimentam?
Testes de unidade
interfaceCalculatorInterface{
publicfunctionsum($first,$second);
publicfunctionsubtract($first,$second);
}
classCalculatorimplementsCalculatorInterface{/*...*/}
classCalculatorTest{
/**@test*/
publicfunctionsumShouldReturnTheSumOfTwoNumbers(){
$calculator=newCalculator();
$result=$calculator->sum(1,2);
if($result!==3){
thrownewException("Somethingwrong'snotright¯_(ツ)_/¯");
}
}
}
PHP
13/70
Testes de unidade
Por quê?
Software livre de defeitos deveria ser sempre entregue
Mas...
·
·
software é muito complexo
pessoas são imperfeitas! ><"
-
-
14/70
O todo é maior do que a simples soma
das suas partes.
“
”
Aristóteles
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
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
Testes de unidade
Como?
Manualmente
functionsum($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
Testes de unidade
Como?
Manualmente
functionsum($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
Testes de unidade
1 <?php
2 functionsum($a,$b){
3 return0+$b;
4 }
5
6 functionsumTest($a,$b,$c){
7 if(sum($a,$b)===$c){return;}
8 thrownewException(/*...*/);
9 }
10sumTest(0,0,0);
11sumTest(1,0,1);
12sumTest(0,1,1);
PHP
PHPFatalerror: Uncaughtexception'Exception'insumTest.php:8
Stacktrace:
#0sumTest.php(11):sumTest(1,0,1)
#1{main}
throwninsumTest.phponline8
Testes de unidade
Como?
Usando um framework de testes
classCalculator{
publicfunctionsum($a,$b){
return$a+$b;
}
}
classCalculatorTestextendsPHPUnit_Framework_TestCase{
/**@test*/
publicfunctionsumTest(){
$this->assertSame(0,sum(0,0));
$this->assertSame(1,sum(1,0));
$this->assertSame(1,sum(0,1));
}
}
PHP
Testes de unidade
Como?
Manualmente
23/70
Testes de unidade
Como?
~Automático~
24/70
Testes de unidade
Como?
Usando um framework de testes
25/70
E quando um objeto interage com outro?
26/70
Objetos dublês!
27/70
Testes de unidade
classPoliceimplementsPoliceInterface{
publicfunctionarrest(PersonInterface$person){
if(!$person->canBeArrested()){
thrownewException(/*...*/);
}
}
}
PHP
28/70
Testes de unidade
classPoliceTestextendsPHPUnit_Framework_TestCase{
/**@test*/
publicfunctionarrestShouldThrowExceptionIfPersonCantBeArrested(){
$person=$this->getMockForAbstractClass(PersonInterface::class);
$person->expects($this->once())
->method('canBeArrested')
->willReturn(false);
$this->setExpectedException(Exception::class);
$police=newPolice();
$police->arrest($person);
}
}
PHP
29/70
Quando escrevê-los?!
30/70
TDD
Test-driven development
Test-driven development (TDD)
Princípios
KISS: Keep It Simple, Stupid
YAGNI: You Aren't Gonna Need It
33/70
Test-driven development (TDD)
34/70
Test-driven development (TDD)
1. Escrever um teste
classCalculatorTestextendsPHPUnit_Framework_TestCase
{
/**
*@test
*/
publicfunctionsumTest()
{
}
}
PHP
35/70
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
Test-driven development (TDD)
2. Garantir que o novo teste falha
classCalculatorTestextendsPHPUnit_Framework_TestCase
{
/**
*@test
*/
publicfunctionsumTest()
{
$calculator=newCalculator();
}
}
PHP
37/70
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
Test-driven development (TDD)
3. Escrever código
classCalculator
{
}
PHP
40/70
Test-driven development (TDD)
4. Garantir que os testes passam
$./vendor/bin/phpunit--bootstrap./vendor/autoload.php
test/CalculatorTest.php
PHPUnit4.5-gf75e6b2bySebastianBergmann.
.
Time:65ms,Memory:2.75Mb
OK(1test,0assertions)
41/70
Test-driven development (TDD)
5. Refatorar o código
42/70
Test-driven development (TDD)
Repetir...
43/70
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
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
Test-driven development (TDD)
3. Escrever código
classCalculator
{
publicfunctionsum($a,$b)
{
$sum=3;
return$sum;
}
}
PHP
46/70
Test-driven development (TDD)
4. Garantir que os testes passam
$./vendor/bin/phpunit--bootstrap./vendor/autoload.php
test/CalculatorTest.php
PHPUnit4.5-gf75e6b2bySebastianBergmann.
.
Time:77ms,Memory:2.75Mb
OK(1test,1assertion)
47/70
Test-driven development (TDD)
5. Refatorar o código
classCalculator
{
publicfunctionsum($a,$b)
{
return3;
}
}
$sum=3;
return$sum;
PHP
48/70
Test-driven development (TDD)
5. Refatorar o código
$./vendor/bin/phpunit--bootstrap./vendor/autoload.php
test/CalculatorTest.php
PHPUnit4.5-gf75e6b2bySebastianBergmann.
.
Time:87ms,Memory:2.75Mb
OK(1test,1assertion)
49/70
Test-driven development (TDD)
Repetir...
50/70
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
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
Test-driven development (TDD)
3. Escrever código
classCalculator
{
publicfunctionsum($a,$b)
{
$sum=$a+$b;
return$sum;
}
}
return3;
PHP
53/70
Test-driven development (TDD)
4. Garantir que os testes passam
$./vendor/bin/phpunit--bootstrap./vendor/autoload.php
test/CalculatorTest.php
PHPUnit4.5-gf75e6b2bySebastianBergmann.
.
Time:90ms,Memory:2.75Mb
OK(1test,2assertions)
54/70
Test-driven development (TDD)
5. Refatorar o código
classCalculator
{
publicfunctionsum($a,$b)
{
;
return$a+$b;
}
}
$sum=$a+$b;
return$sum
PHP
55/70
Test-driven development (TDD)
5. Refatorar o código
$./vendor/bin/phpunit--bootstrap./vendor/autoload.php
test/CalculatorTest.php
PHPUnit4.5-gf75e6b2bySebastianBergmann.
.
Time:87ms,Memory:2.75Mb
OK(1test,1assertion)
56/70
Test-driven development (TDD)
Repetir...
57/70
Cobertura de testes
Quanto do software deve estar coberto por
testes de unidade?
100%!
TODO!
O software INTEIRO!
Deu pra endenter, né?
59/70
Como garantir 100% de cobertura de testes?
60/70
Testes de unidade na Meritt
Testes de unidade na Meritt
Status
63/70
Testes de unidade na Meritt
Status
64/70
Considerações finais
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
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
Temos vagas!
meritt.recruiterbox.com
Pay attention to zeros. If there is a zero,
someone will divide by it.
“
”
Cem Kaner
Muito obrigado!
tfurtado@gmail.com
speakerdeck.com/tfurtado
github.com/tfurtado
meritt.com.br

Mais conteúdo relacionado

Mais procurados (20)

Junit 4.0
Junit 4.0Junit 4.0
Junit 4.0
 
Minicurso de TDD
Minicurso de TDDMinicurso de TDD
Minicurso de TDD
 
TDD com Python (Completo)
TDD com Python (Completo)TDD com Python (Completo)
TDD com Python (Completo)
 
Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junit
 
Series lab
Series labSeries lab
Series lab
 
Implementando Testes Unitários em Java - Manoel Pimentel
Implementando Testes Unitários em Java - Manoel PimentelImplementando Testes Unitários em Java - Manoel Pimentel
Implementando Testes Unitários em Java - Manoel Pimentel
 
TDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fislTDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fisl
 
PHPUnit e teste de software
PHPUnit e teste de softwarePHPUnit e teste de software
PHPUnit e teste de software
 
Testes Unitários
Testes UnitáriosTestes Unitários
Testes Unitários
 
TDD na Prática
TDD na PráticaTDD na Prática
TDD na Prática
 
Test-Driven Development with PHP
Test-Driven Development with PHPTest-Driven Development with PHP
Test-Driven Development with PHP
 
Testes de Sofware
Testes de SofwareTestes de Sofware
Testes de Sofware
 
Etapas da programação
Etapas da programaçãoEtapas da programação
Etapas da programação
 
Logica usando c_-_aula_1
Logica usando c_-_aula_1Logica usando c_-_aula_1
Logica usando c_-_aula_1
 
Java primeiros-passos
Java primeiros-passosJava primeiros-passos
Java primeiros-passos
 
Revisão OCPJP7 - Class Design (parte 04)
Revisão OCPJP7 - Class Design (parte 04)Revisão OCPJP7 - Class Design (parte 04)
Revisão OCPJP7 - Class Design (parte 04)
 
Polimorfismo
PolimorfismoPolimorfismo
Polimorfismo
 
Java 12
Java 12Java 12
Java 12
 
Exercícios da Aula de LAB 01
Exercícios da Aula de LAB 01Exercícios da Aula de LAB 01
Exercícios da Aula de LAB 01
 
Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1
 

Destaque

Dr. Kathryn E. Piquette, Cologne Center for eHumanities, Universität zu Köln:...
Dr. Kathryn E. Piquette, Cologne Center for eHumanities, Universität zu Köln:...Dr. Kathryn E. Piquette, Cologne Center for eHumanities, Universität zu Köln:...
Dr. Kathryn E. Piquette, Cologne Center for eHumanities, Universität zu Köln:...UCLDH
 
teorema phytagoras
teorema phytagorasteorema phytagoras
teorema phytagorasEzy Rachma
 
Speech Presentation
Speech PresentationSpeech Presentation
Speech PresentationJoyce Costa
 
OpenForest -portal and Case of Bark Bread
OpenForest -portal and Case of Bark Bread OpenForest -portal and Case of Bark Bread
OpenForest -portal and Case of Bark Bread Anu Liljeström
 
Web Desiging Course in Chandigarh
Web Desiging Course in ChandigarhWeb Desiging Course in Chandigarh
Web Desiging Course in ChandigarhWebcom Incorp
 
KIDS IN CHINA
KIDS IN CHINAKIDS IN CHINA
KIDS IN CHINAjimis584
 
DALIL PHYTAGORAS
DALIL PHYTAGORASDALIL PHYTAGORAS
DALIL PHYTAGORASEzy Rachma
 
Karla Vohra Resume_v16
Karla Vohra Resume_v16Karla Vohra Resume_v16
Karla Vohra Resume_v16Kruti Vohra
 

Destaque (20)

Dr. Kathryn E. Piquette, Cologne Center for eHumanities, Universität zu Köln:...
Dr. Kathryn E. Piquette, Cologne Center for eHumanities, Universität zu Köln:...Dr. Kathryn E. Piquette, Cologne Center for eHumanities, Universität zu Köln:...
Dr. Kathryn E. Piquette, Cologne Center for eHumanities, Universität zu Köln:...
 
Busqueda en dialnet
Busqueda en dialnetBusqueda en dialnet
Busqueda en dialnet
 
Revisi pid klmpk 3
Revisi pid klmpk 3Revisi pid klmpk 3
Revisi pid klmpk 3
 
Penilaian
PenilaianPenilaian
Penilaian
 
Blog
BlogBlog
Blog
 
Cupcakes!
Cupcakes!Cupcakes!
Cupcakes!
 
teorema phytagoras
teorema phytagorasteorema phytagoras
teorema phytagoras
 
Speech Presentation
Speech PresentationSpeech Presentation
Speech Presentation
 
Task 1b
Task 1bTask 1b
Task 1b
 
OpenForest -portal and Case of Bark Bread
OpenForest -portal and Case of Bark Bread OpenForest -portal and Case of Bark Bread
OpenForest -portal and Case of Bark Bread
 
Norway - InfoBarrel
Norway - InfoBarrelNorway - InfoBarrel
Norway - InfoBarrel
 
OSHA Certificates
OSHA CertificatesOSHA Certificates
OSHA Certificates
 
MIMA Monthly January 2016 - “Social Broadcasting for Business”
MIMA Monthly January 2016 - “Social Broadcasting for Business” MIMA Monthly January 2016 - “Social Broadcasting for Business”
MIMA Monthly January 2016 - “Social Broadcasting for Business”
 
Untitled Presentation
Untitled PresentationUntitled Presentation
Untitled Presentation
 
Web Desiging Course in Chandigarh
Web Desiging Course in ChandigarhWeb Desiging Course in Chandigarh
Web Desiging Course in Chandigarh
 
KIDS IN CHINA
KIDS IN CHINAKIDS IN CHINA
KIDS IN CHINA
 
DALIL PHYTAGORAS
DALIL PHYTAGORASDALIL PHYTAGORAS
DALIL PHYTAGORAS
 
Task 1b
Task 1bTask 1b
Task 1b
 
Revisi pid klmpk 1
Revisi pid klmpk 1Revisi pid klmpk 1
Revisi pid klmpk 1
 
Karla Vohra Resume_v16
Karla Vohra Resume_v16Karla Vohra Resume_v16
Karla Vohra Resume_v16
 

Semelhante a Testes de unidade na prática

Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitDiego Tremper
 
Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitDiego Tremper
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 
Como melhoramos a performance dos testes automatizados com py.test e factoryboy
Como melhoramos a performance dos testes automatizados com py.test e factoryboyComo melhoramos a performance dos testes automatizados com py.test e factoryboy
Como melhoramos a performance dos testes automatizados com py.test e factoryboyLeonardo Galani
 
Dojo de programação - Dia de Java - UFSCar
Dojo de programação - Dia de Java - UFSCarDojo de programação - Dia de Java - UFSCar
Dojo de programação - Dia de Java - UFSCarLuiz Ribeiro
 
Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Michael Castillo Granados
 
Introdução a testes unitários automatizados com JUnit e NUnit
Introdução a testes unitários automatizados com JUnit e NUnitIntrodução a testes unitários automatizados com JUnit e NUnit
Introdução a testes unitários automatizados com JUnit e NUnitelliando dias
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Elton Minetto
 
PHPSP TestFest 2009
PHPSP TestFest 2009PHPSP TestFest 2009
PHPSP TestFest 2009Rafael Dohms
 
Teste de Integração - Unidade III
Teste de Integração - Unidade IIITeste de Integração - Unidade III
Teste de Integração - Unidade IIIJoão Lourenço
 
Coding Dojo e Test Driven Development
Coding Dojo e Test Driven DevelopmentCoding Dojo e Test Driven Development
Coding Dojo e Test Driven DevelopmentRodrigo Alves Vieira
 
Coding Dojo e Test Driven Development
Coding Dojo e Test Driven DevelopmentCoding Dojo e Test Driven Development
Coding Dojo e Test Driven Developmentpugpe
 
Testes de regressão automatizados
Testes de regressão automatizadosTestes de regressão automatizados
Testes de regressão automatizadosCristian R. Silva
 

Semelhante a Testes de unidade na prática (20)

Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnit
 
Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnit
 
Frameworks para C 3º DeSif
Frameworks para C 3º DeSifFrameworks para C 3º DeSif
Frameworks para C 3º DeSif
 
Mock Objects
Mock ObjectsMock Objects
Mock Objects
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
Como melhoramos a performance dos testes automatizados com py.test e factoryboy
Como melhoramos a performance dos testes automatizados com py.test e factoryboyComo melhoramos a performance dos testes automatizados com py.test e factoryboy
Como melhoramos a performance dos testes automatizados com py.test e factoryboy
 
Dojo de programação - Dia de Java - UFSCar
Dojo de programação - Dia de Java - UFSCarDojo de programação - Dia de Java - UFSCar
Dojo de programação - Dia de Java - UFSCar
 
Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014
 
Ganhando tempo com casos de testes
Ganhando tempo com casos de testesGanhando tempo com casos de testes
Ganhando tempo com casos de testes
 
TDD em 220V
TDD em 220VTDD em 220V
TDD em 220V
 
Introdução a testes unitários automatizados com JUnit e NUnit
Introdução a testes unitários automatizados com JUnit e NUnitIntrodução a testes unitários automatizados com JUnit e NUnit
Introdução a testes unitários automatizados com JUnit e NUnit
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2
 
PHPSP TestFest 2009
PHPSP TestFest 2009PHPSP TestFest 2009
PHPSP TestFest 2009
 
Teste de Integração - Unidade III
Teste de Integração - Unidade IIITeste de Integração - Unidade III
Teste de Integração - Unidade III
 
Coding Dojo e Test Driven Development
Coding Dojo e Test Driven DevelopmentCoding Dojo e Test Driven Development
Coding Dojo e Test Driven Development
 
Coding Dojo e Test Driven Development
Coding Dojo e Test Driven DevelopmentCoding Dojo e Test Driven Development
Coding Dojo e Test Driven Development
 
Testes de regressão automatizados
Testes de regressão automatizadosTestes de regressão automatizados
Testes de regressão automatizados
 
Testes: Por onde Começar?
Testes: Por onde Começar?Testes: Por onde Começar?
Testes: Por onde Começar?
 
Algoritmos de ordenação
Algoritmos de ordenaçãoAlgoritmos de ordenação
Algoritmos de ordenação
 

Testes de unidade na prática