SlideShare uma empresa Scribd logo
1 de 74
TESTES UNITÁRIOS
Jadson Santos
Software Engineer
Testes Unitários
• O que são Testes Unitários?
• É um nível de teste de software no qual
componentes individuais são testados
(métodos)
• O propósito é validar se cada unidade do
software executa como esperado
11/06/2016 Testes Unitários 2
Testes Unitários
11/06/2016 Testes Unitários 3
Testes Unitários
• Os testes unitários tem como benefício:
• Garantir que problemas serão descobertos
cedo.
• Facilitar a manutenção de código
• Servir como documentação
• Ajudam a melhorar o design do seu código
e torna-lo um melhor desenvolvedor
11/06/2016 Testes Unitários 4
Testes Unitários
11/06/2016 Testes Unitários 5
Testes Unitários
11/06/2016 Testes Unitários
• Como escrever um teste para essa classe???
6
Testes Unitários
• Criando
método
para
testar
conta com
saldo
11/06/2016 Testes Unitários 7
Testes Unitários
11/06/2016 Testes Unitários
•Pronto???
•A classe está testada ????
8
Testes Unitários
• Criando
método para
testar conta
sem saldo
11/06/2016 Testes Unitários 9
Testes Unitários
11/06/2016 Testes Unitários
•E agora???
•A classe está testada ????
10
Testes Unitários
• E se alguém
criar uma
conta
passando
nulo???
11/06/2016 Testes Unitários 11
Testes Unitários
• Alterando a classe conta para passar no 3º teste
11/06/2016 Testes Unitários 12
Testes Unitários
11/06/2016 Testes Unitários
• Qualquer alteração na classe Conta, você terá mais
confiança de que o comportamento do método temSaldo
será mantido!!!
13
Os três testes
passaram
Testes Unitários
• Algumas observações:
• Para ter certeza de que o seu código não tem erro,
deve-se testar todas as possíveis entradas do método
• Para a variável saldo:
• 4.94065645841246544e-324d a 1.79769313486231570e+308d
• Geralmente, se testa alguns valores chaves que
representam todas as possíveis entradas:
• -1000, -1, 0, null, +1, +1000
• Tenha criatividade para imaginar as possiblidades de
testes!!!
11/06/2016 Testes Unitários 14
Testes Unitários
• Não teste métodos triviais, tipo get e set padrões, só se
esses métodos tiverem validações.
• Achou um bug? Não conserte sem antes escrever um
teste que o pegue
• Preocupe-se com a qualidade do código dos seus
testes, mantenha igual ao código das classes que estão
sendo testadas, pois você vai precisar mantê-los do
mesmo jeito.
11/06/2016 Testes Unitários 15
Testes Unitários
• Para esse simples exemplo:
• Classe Conta: 13 linhas de código
• Classe Conta Teste: 31 linhas de código
• O número de linhas de código para se testar um
sistema geralmente é maior que o número de linhas de
código do sistema
11/06/2016 Testes Unitários 16
JUnit
• Framework que facilita o desenvolvimento e
execução de testes unitários em código JAVA.
• Facilita a criação, execução automática de testes e a
apresentação dos resultados
11/06/2016 Testes Unitários
Junit
17
Junit
11/06/2016 Testes Unitários
•Vamos criar o mesmo teste da classe
Conta usado o JUnit
18
JUnit
• Criando um teste unitário com JUnit
11/06/2016 Testes Unitários 19
JUnit
• Criando um teste
unitário com Junit
• Defina o nome da classe
• E a classe que vai ser
testada
11/06/2016 Testes Unitários 20
JUnit
• Criando um teste unitário com JUnit
• Escolha os métodos a serem testados
11/06/2016 Testes Unitários 21
JUnit
• Criando um teste com JUnit
11/06/2016 Testes Unitários
A partir da Versão 4 do JUnit todo método com um @Test
é um teste unitário a ser executo
Substitui o método main()
22
JUnit
• Criando um teste com JUnit
11/06/2016 Testes Unitários
Junit possui vários métodos “assertions”
Substitui os testes feitos anteriormente “if ... else .. println()”
23
Main Assert Statements
11/06/2016 Testes Unitários
fail(String) Faz o método falhar
assertTrue(boolean, condition) Testa se a condição é verdadeira
assertFalse(boolean, condition) Testa se a condição é falsa
assetEquals(expected, actual) Teste se dois valores são iguais
assertEquals(expected, actual,
tolerance)
Para float ou double, a tolerância é o número
de casas decimais a ser verificado
assertNull(object) Verifica se o objeto é nulo
assertNotNull(object) Verifica se o objeto não é nulo
24
JUnit
• Criando um teste com Junit
• Existem vários métodos assertX, para validar os
resultados dos testes
11/06/2016 Testes Unitários 25
JUnit
• Criando um teste com Junit
• Executando os Teste pelo Eclipse
11/06/2016 Testes Unitários 26
JUnit
• TestSuite: Permite executar um conjunto de
testes de uma só vez.
11/06/2016 Testes Unitários 27
JUnit
• Criando um teste com Junit
• TestSuite: Roda vários casos de testes ao mesmo
tempo
11/06/2016 Testes Unitários 28
JUnit
• Criando um teste com Junit
• TestSuite: Roda vários casos de testes ao mesmo
tempo
11/06/2016 Testes Unitários 29
JUnit
• Criando um teste com Junit
• TestSuite: Roda vários casos de testes ao mesmo
tempo
11/06/2016 Testes Unitários
Para adicionar novos testes ao TestSuite, basta apenas
adicionar novas classes à anotação @SuiteClasses
30
JUnit Annotations
11/06/2016 Testes Unitários
@Test Identifica um método de testes
@Test(expected= Exception.class) Falha se o método testado não retornar essa
exceção
@Test(timeout=100) Falha se o método demorar mais de
100milisegundos
@Before
public void method()
Executa antes de cada teste. Usado para
preparar o ambiente de teste
@After
public void method()
Executa depois de cada teste. Usado para
liberar recursos do teste
@BeforeClass
public static void method()
Executa 1 vez, antes de todos os testes.
Usado para preparar o ambiente de teste
O método anotado deve ser estátivo
@AfterClass
public static void method()
Executa 1 vez, depois de todos os testes.
Usado para liberar recursos do teste
O método anotado deve ser estático
@Ignore Ignora algum método de teste
31
JUnit Annotations
11/06/2016 Testes Unitários 32
JUnit Rule
11/06/2016 Testes Unitários
• Pode-se criar objetos que podem ser usados
nos seus métodos de teste
33
JUnit Categories
11/06/2016 Testes Unitários
• Serve para agrupar tipos de testes
34
JUnit Categories
11/06/2016 Testes Unitários
• Define em um TestSuite quais categorias serão
executadas por ele.
35
Mock Objects
11/06/2016 Testes Unitários
• Testes unitários devem testar uma classe
isoladamente, isto é, sem que o efeito de outras
classes com que ela se relaciona, interfiram no teste.
• Isso é particularmente muito difícil porque a maioria
das classes em um sistema real possuem
relacionamento com outras classes
• Para resolver esse problema, normalmente se usa a
metodologia de se criar Mocks.
36
Mock Objects
11/06/2016 Testes Unitários
• Objetos Mocks são implementações simuladas de um
interface ou classe que define a saída das chamas dos
métodos que se relacionam com a classe.
• Isso ajuda a assegurar que você só teste a classe e
que seu teste não será afetado por efeitos colaterais
37
Mock Objects
11/06/2016 Testes Unitários
• No mundo real a classe Conta deveria atualizar o saldo
de forma persistente, não apenas em memória.
38
Mock Objects
11/06/2016 Testes Unitários
• Nova versão da classe Conta:
39
Mock Objects
11/06/2016 Testes Unitários
• Tentativa de Criar um Teste para nova classe Conta
passando um objeto DAO para atualizar o saldo:
40
Mock Objects
11/06/2016 Testes Unitários
• Como resolver esse problema?
• Isso é, como alterar o comportamento do objeto DAO
para o teste passar, sem alterar o objeto DAO real
porque ele precisa se comunicar com o banco quando
for executado em produção?
• R: Por meio da herança.
41
Mock Objects
11/06/2016 Testes Unitários
• Criação de uma subclasse que simula(Mock) ser um
banco de dados
42
Mock Objects
11/06/2016 Testes Unitários
• No Teste Unitário que usa o objeto Mock criado:
• Objetivo não é testar se o dado é salvo, o objetivo
do teste é testar se a lógica do saque está correta
43
Mock Objects
11/06/2016 Testes Unitários
• O problema com Mock Objects é que eles são
trabalhosos de serem criados.
• Para isso surgiram vários Framework de geração de
Mock, esse é nosso próximo passo ....
44
Mockito
• É um Framework popular para construção
de Mocks que pode ser usado em conjunto
com o JUnit.
11/06/2016 Testes Unitários
Mockito
Junit
45
Mockito
• Em vez de você precisar criar os Mocks, você
apenas indica, que o Mockito criar o mock para
você.
11/06/2016 Testes Unitários 46
Mockito
• Por padrão um mock é uma subclasse com todos
os métodos vazios
• É possível definir valores a serem retornados ao
se chamar algum método do mock.
• Com os métodos
Mockito.when(...).thenReturn(...)
11/06/2016 Testes Unitários 47
Mockito
• Definindo o comportamento do método
buscaPorSaldoMaiorQue() do mock.
11/06/2016 Testes Unitários 48
Mockito
• É possível criar um Mock Parcial do objeto com
o método Spy().
• Mock Parcial é um mock cujo todos os métodos
possuem o comportamento real do objeto.
11/06/2016 Testes Unitários 49
Mockito
• E para que eu quero um Mock onde todos os
métodos possuem o comportamento real do
objeto um mock já não é para não realizar o
comportamento real?
• Porque as vezes, por exemplo, você precisa usar a classe testada
em algum método do Mockito, mas os métodos do mockito só
aceitando mocks, e você não deseja criar um mock da classe
testada, se não, você não vai ter código para ser executado na
classe testada. Nestes casos usa-se o mock parcial. Entendeu ?
Não! Espere mais 2 slides até eu explicar o que é o verify.
11/06/2016 Testes Unitários 50
Mockito
• Testar se um código foi executado.
11/06/2016 Testes Unitários 51
Útil para testar métodos voids. Você não tem o que testar porque o
método não retorna anda, mas pelo menos pode verificar se
determinado trecho de código foi executado. Se o teste chegou até
aquele trecho você sabe que ele executou sem problemas até ali.
Mockito
• Uso do mock parcial (continuando ...)
• Você quer usar o verify para verificar se algum método da sua classe
que está sendo testada foi chamado.
• Não é possível fazer
Mockito.verify(minhaClasse).doStuff(1);
• Porque minhaClasse não é um mock, é a classe que você está
testado. Não é desejado criar um mock dela. E o método verify só
aceita mocks como argumento. Para resolver essa situação é possível
fazer:
minhaClasse = Mockito.spy(minhaClasse); // cria um
mock mas mantém o comportamento dos métodos
Mockito.verify(minhaClasse).doStuff(1); // verificar
se o método doStuff da minha classe que está sendo
testada foi chamado recebendo o valor 1
Ps.: Todos os Métodos da minhaClasse serão executados normalmente
11/06/2016 Testes Unitários 52
Mockito
• Trabalhar com objetos que é difícil estipular um
valor específico no momento da execução.
Mockito.when(myClass.method(
Mockito.any(Date.class))).thenReturn(x);
• Para qualquer instancia da classe Date passada o método
myClass#method retorna o objeito X;
11/06/2016 Testes Unitários 53
Mockito
• Limitações do Mockito:
• Ele não consegue fazer mocks de:
• Classes Final
• Variáveis, Métodos e Objetos Estáticos
• Tipos primitivos
• Classes anônimas
• Métodos privados
• Por que?
• Porque o Mockito usa herança para criar mocks, ele herda da
classe real e cria uma subclasse com os método vazios os com
comportamento definidos por você para o teste.
11/06/2016 Testes Unitários 54
Mockito
• É comum vários sistemas possuírem dados
estáticos acessando banco de dados ou outros
recursos externos cujo mockito não consegue
isolar
11/06/2016 Testes Unitários 55
PowerMock
• Um Framework do Mock que estende o
Mockito para provê mocks mais poderosos.
• Principalmente de mockar objetos estáticos
11/06/2016 Testes Unitários
Mockito
Junit
PowerMock
56
PowerMock
• Um Framework do Mock que estende o Mockito
para provê mock mais poderosos.
• Ele consegue fazer isso porque ele vai no
bytecode da classe e altera o código para a
execução do teste.
11/06/2016 Testes Unitários 57
PowerMock
11/06/2016 Testes Unitários
• Testar uma classe que usa o método estático
getBundle()
58
PowerMock
11/06/2016 Testes Unitários
• Apenas com o Mockito
59
PowerMock
11/06/2016 Testes Unitários
• Apenas com o Mockito
60
PowerMock
11/06/2016 Testes Unitários
Use the PowerMock Junit runner
Declara a classe que nós iremos testar
e que possui o método estático.
Será carregada em outro classloader
Diz ao Powermock para realizar
mock dos métodos estáticos
da classe
61
PowerMock
11/06/2016 Testes Unitários
• Usando o PowerMock
62
PowerMock
• “PowerMock é uma ferramenta poderosa, mas
devemos sempre nós lembrar: Se nós
encontramos uma situação onde só o
PowerMock pode resolver nosso problema.
Então nós falhamos. Isso significa que a classe
que está sendo testada está errada.”
Charles Roth
www.thedance.net/~roth/TECHBLOG/powerMock.
html
11/06/2016 Testes Unitários 63
PowerMock
• Se você encontrar uma situação que precisa
mockar um método estático, então
provavelmente esse método não deveria ser
estático.
• Algumas vezes esse método pertence a uma
classe de terceiros que não pode ser alterada,
para essas situações que o PowerMock foi
criado.
11/06/2016 Testes Unitários 64
PowerMock
11/06/2016 Testes Unitários
• Outras funcionalidades:
• Chamar uma método real de um mock
• PowerMockito.doCallRealMethod()
.when(UFRNUtils.class, “checkRole”,
usuarioLogado,
PapeisProtocolo.RECEBER_PROTOCOLO);
• Pular a execução de algum método que não deve ser chamado
• PowerMockito.suppress(PowerMockito.method
(ProcessadorAnaliseComissaoProgressao.class,
“criar”));
65
Testes na Integração
Contínua
11/06/2016 Testes Unitários 66
Teste na Integração Contínua
• “Integração Contínua é uma prática de
desenvolvimento de software onde os membros
de um time integram seu trabalho
frequentemente. Cada integração é verificada por
um build automatizado (incluindo testes) para
detectar erros de integração o mais rápido
possível.” [Martin Fowler]
11/06/2016 Testes Unitários 67
Teste na Integração Contínua
• Testes automatizados é uma parte
fundamental da integração contínua
• Ou você usa testes automatizados ou você
não estará realizando integração contínua
11/06/2016 Testes Unitários 68
Teste na Integração Contínua
• Chamando Test Suites a partir do Gradle.
11/06/2016 Testes Unitários 69
Teste na Integração Contínua
11/06/2016 Testes Unitários 70
• Rodando os testes do sistema periodicamente
• Para isso crie um job que rode constantemente (idealmente a cada
commit) e execute os testes unitários
Teste na Integração Contínua
11/06/2016 Testes Unitários 71
• Rodando os testes do sistema periodicamente
• Esse job invoca a task unitTest do Gradle que por sua vez executa
os Test Suites do sistema
Teste na Integração Contínua
11/06/2016 Testes Unitários 72
• Rodando os testes do sistema periodicamente
• O Gradle armazena os resultado dos testes por padrão do diretório
build/test-results do projeto, é possível mandar o jenkins publicar
esses resultados
Teste na Integração Contínua
11/06/2016 Testes Unitários 73
• Rodando os testes do sistema periodicamente
• Assim é possível ver na interface do jenkins a tendência dos testes
do sistema
• Caso algum teste falhe, a build quebra e imediatamente toda a
equipe é avisada
Testes Unitários11/06/2016 74

Mais conteúdo relacionado

Mais procurados

Técnicas de Testes Funcionais Caixa-Preta
Técnicas de Testes Funcionais Caixa-PretaTécnicas de Testes Funcionais Caixa-Preta
Técnicas de Testes Funcionais Caixa-PretaLucas Amaral
 
An Introduction to Unit Testing
An Introduction to Unit TestingAn Introduction to Unit Testing
An Introduction to Unit TestingJoe Tremblay
 
Introdução a testes unitários com jUnit
Introdução a testes unitários com jUnitIntrodução a testes unitários com jUnit
Introdução a testes unitários com jUnitLeonardo Soares
 
An introduction to unit testing
An introduction to unit testingAn introduction to unit testing
An introduction to unit testingAdam Stephensen
 
Papéis em Teste e Qualidade de Software
Papéis em Teste e Qualidade de SoftwarePapéis em Teste e Qualidade de Software
Papéis em Teste e Qualidade de SoftwareCamilo Ribeiro
 
Automated Testing with Agile
Automated Testing with AgileAutomated Testing with Agile
Automated Testing with AgileKen McCorkell
 
Qualidade de Software: Teste de software
Qualidade de Software: Teste de softwareQualidade de Software: Teste de software
Qualidade de Software: Teste de softwareAlex Camargo
 
Testing in multiplatform environment
Testing in multiplatform environmentTesting in multiplatform environment
Testing in multiplatform environmentshivanichauhan1953
 
TOTVS - Agile Testing e a Importância de se ter Estratégia de Testes
TOTVS - Agile Testing e a Importância de se ter Estratégia de TestesTOTVS - Agile Testing e a Importância de se ter Estratégia de Testes
TOTVS - Agile Testing e a Importância de se ter Estratégia de TestesSamanta Cicilia
 
TDD and Unit Testing in Golang
TDD and Unit Testing in GolangTDD and Unit Testing in Golang
TDD and Unit Testing in GolangSofian Hadiwijaya
 
Unit Testing Concepts and Best Practices
Unit Testing Concepts and Best PracticesUnit Testing Concepts and Best Practices
Unit Testing Concepts and Best PracticesDerek Smith
 
Introdução a Testes Automatizados
Introdução a Testes AutomatizadosIntrodução a Testes Automatizados
Introdução a Testes Automatizadoselliando dias
 

Mais procurados (20)

Teste de Software - Introdução
Teste de Software - IntroduçãoTeste de Software - Introdução
Teste de Software - Introdução
 
Teste de software
Teste de softwareTeste de software
Teste de software
 
Técnicas de Testes Funcionais Caixa-Preta
Técnicas de Testes Funcionais Caixa-PretaTécnicas de Testes Funcionais Caixa-Preta
Técnicas de Testes Funcionais Caixa-Preta
 
Junit
JunitJunit
Junit
 
Unit testing
Unit testing Unit testing
Unit testing
 
Testing fundamentals
Testing fundamentalsTesting fundamentals
Testing fundamentals
 
An Introduction to Unit Testing
An Introduction to Unit TestingAn Introduction to Unit Testing
An Introduction to Unit Testing
 
Teste de Software
Teste de SoftwareTeste de Software
Teste de Software
 
Introdução a testes unitários com jUnit
Introdução a testes unitários com jUnitIntrodução a testes unitários com jUnit
Introdução a testes unitários com jUnit
 
An introduction to unit testing
An introduction to unit testingAn introduction to unit testing
An introduction to unit testing
 
Papéis em Teste e Qualidade de Software
Papéis em Teste e Qualidade de SoftwarePapéis em Teste e Qualidade de Software
Papéis em Teste e Qualidade de Software
 
Automated Testing with Agile
Automated Testing with AgileAutomated Testing with Agile
Automated Testing with Agile
 
Qualidade de Software: Teste de software
Qualidade de Software: Teste de softwareQualidade de Software: Teste de software
Qualidade de Software: Teste de software
 
Testing in multiplatform environment
Testing in multiplatform environmentTesting in multiplatform environment
Testing in multiplatform environment
 
TOTVS - Agile Testing e a Importância de se ter Estratégia de Testes
TOTVS - Agile Testing e a Importância de se ter Estratégia de TestesTOTVS - Agile Testing e a Importância de se ter Estratégia de Testes
TOTVS - Agile Testing e a Importância de se ter Estratégia de Testes
 
TDD and Unit Testing in Golang
TDD and Unit Testing in GolangTDD and Unit Testing in Golang
TDD and Unit Testing in Golang
 
Unit Testing Concepts and Best Practices
Unit Testing Concepts and Best PracticesUnit Testing Concepts and Best Practices
Unit Testing Concepts and Best Practices
 
Unit testing
Unit testingUnit testing
Unit testing
 
Introdução a Testes Automatizados
Introdução a Testes AutomatizadosIntrodução a Testes Automatizados
Introdução a Testes Automatizados
 
Python unit testing
Python unit testingPython unit testing
Python unit testing
 

Destaque

Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1Diego Pacheco
 
Ferramentas open source para auxiliar os testes de software
Ferramentas open source para auxiliar os testes de softwareFerramentas open source para auxiliar os testes de software
Ferramentas open source para auxiliar os testes de softwareJeremias Araujo
 
Testes Unitários/Integrados
Testes Unitários/IntegradosTestes Unitários/Integrados
Testes Unitários/IntegradosGiovanni Bassi
 
Desenvolvimento web ágil com Python e web2py #qconsp #qcon
Desenvolvimento web ágil com Python e web2py #qconsp #qconDesenvolvimento web ágil com Python e web2py #qconsp #qcon
Desenvolvimento web ágil com Python e web2py #qconsp #qconBruno Rocha
 
Testes e mocks: Em Visual Studio com .NET
Testes e mocks: Em Visual Studio com .NETTestes e mocks: Em Visual Studio com .NET
Testes e mocks: Em Visual Studio com .NETAlessandro Binhara
 
Testes de Caixa Branca e Métricas de Código
Testes de Caixa Branca e Métricas de CódigoTestes de Caixa Branca e Métricas de Código
Testes de Caixa Branca e Métricas de CódigoAricelio Souza
 
Metodologia Ágil Scrum
Metodologia Ágil ScrumMetodologia Ágil Scrum
Metodologia Ágil ScrumAricelio Souza
 
[Iniciante] - Testes Unitários com WP-UNIT no Wordpress
[Iniciante] - Testes Unitários com WP-UNIT no Wordpress[Iniciante] - Testes Unitários com WP-UNIT no Wordpress
[Iniciante] - Testes Unitários com WP-UNIT no WordpressRoger Ritter
 
ICEIS 2013 Presentation
ICEIS 2013 PresentationICEIS 2013 Presentation
ICEIS 2013 PresentationJadson Santos
 
Mini curso gerenciamento de configuração e mudança com GIT + Eclipse - I...
Mini curso gerenciamento de configuração e mudança com GIT + Eclipse  -  I...Mini curso gerenciamento de configuração e mudança com GIT + Eclipse  -  I...
Mini curso gerenciamento de configuração e mudança com GIT + Eclipse - I...Jadson Santos
 
ART de Engenheiro Civil
ART de Engenheiro CivilART de Engenheiro Civil
ART de Engenheiro CivilSesc Rio
 
Open Up – Gerenciando Projetos Sob Principios Ágeis
Open Up – Gerenciando Projetos Sob Principios ÁgeisOpen Up – Gerenciando Projetos Sob Principios Ágeis
Open Up – Gerenciando Projetos Sob Principios Ágeisjeanstreleski
 
Desenvolvimento web com python e web2py
Desenvolvimento web com python e web2pyDesenvolvimento web com python e web2py
Desenvolvimento web com python e web2pyRelsi Maron
 

Destaque (20)

Java8
Java8Java8
Java8
 
Bootstrap
BootstrapBootstrap
Bootstrap
 
Git
GitGit
Git
 
Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1
 
Gradle
GradleGradle
Gradle
 
Ferramentas open source para auxiliar os testes de software
Ferramentas open source para auxiliar os testes de softwareFerramentas open source para auxiliar os testes de software
Ferramentas open source para auxiliar os testes de software
 
Testes Unitários/Integrados
Testes Unitários/IntegradosTestes Unitários/Integrados
Testes Unitários/Integrados
 
Desenvolvimento web ágil com Python e web2py #qconsp #qcon
Desenvolvimento web ágil com Python e web2py #qconsp #qconDesenvolvimento web ágil com Python e web2py #qconsp #qcon
Desenvolvimento web ágil com Python e web2py #qconsp #qcon
 
Testes e mocks: Em Visual Studio com .NET
Testes e mocks: Em Visual Studio com .NETTestes e mocks: Em Visual Studio com .NET
Testes e mocks: Em Visual Studio com .NET
 
Testes de unidade - Conhecendo e aplicando
Testes de unidade - Conhecendo e aplicandoTestes de unidade - Conhecendo e aplicando
Testes de unidade - Conhecendo e aplicando
 
Apresentação de TDD na Fatec Jundiaí
Apresentação de TDD na Fatec JundiaíApresentação de TDD na Fatec Jundiaí
Apresentação de TDD na Fatec Jundiaí
 
Testes de Caixa Branca e Métricas de Código
Testes de Caixa Branca e Métricas de CódigoTestes de Caixa Branca e Métricas de Código
Testes de Caixa Branca e Métricas de Código
 
Metodologia Ágil Scrum
Metodologia Ágil ScrumMetodologia Ágil Scrum
Metodologia Ágil Scrum
 
[Iniciante] - Testes Unitários com WP-UNIT no Wordpress
[Iniciante] - Testes Unitários com WP-UNIT no Wordpress[Iniciante] - Testes Unitários com WP-UNIT no Wordpress
[Iniciante] - Testes Unitários com WP-UNIT no Wordpress
 
ICEIS 2013 Presentation
ICEIS 2013 PresentationICEIS 2013 Presentation
ICEIS 2013 Presentation
 
Mini curso gerenciamento de configuração e mudança com GIT + Eclipse - I...
Mini curso gerenciamento de configuração e mudança com GIT + Eclipse  -  I...Mini curso gerenciamento de configuração e mudança com GIT + Eclipse  -  I...
Mini curso gerenciamento de configuração e mudança com GIT + Eclipse - I...
 
ART de Engenheiro Civil
ART de Engenheiro CivilART de Engenheiro Civil
ART de Engenheiro Civil
 
Open Up – Gerenciando Projetos Sob Principios Ágeis
Open Up – Gerenciando Projetos Sob Principios ÁgeisOpen Up – Gerenciando Projetos Sob Principios Ágeis
Open Up – Gerenciando Projetos Sob Principios Ágeis
 
TDD com Python
TDD com PythonTDD com Python
TDD com Python
 
Desenvolvimento web com python e web2py
Desenvolvimento web com python e web2pyDesenvolvimento web com python e web2py
Desenvolvimento web com python e web2py
 

Semelhante a Testes Unitários

Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junitcejug
 
Mock it with mockito
Mock it with mockitoMock it with mockito
Mock it with mockitoRenan Uchôa
 
Pensando em java univali turbinando seus testes
Pensando em java univali   turbinando seus testesPensando em java univali   turbinando seus testes
Pensando em java univali turbinando seus testesSandro Giacomozzi
 
A importância dos testes unitários: do código legado ao pipeline de testes em...
A importância dos testes unitários: do código legado ao pipeline de testes em...A importância dos testes unitários: do código legado ao pipeline de testes em...
A importância dos testes unitários: do código legado ao pipeline de testes em...Rodrigo Oliveira, Msc, PMP
 
Qualidade no desenvolvimento de Software com TDD e PHPUnit
Qualidade no desenvolvimento de Software com TDD e PHPUnitQualidade no desenvolvimento de Software com TDD e PHPUnit
Qualidade no desenvolvimento de Software com TDD e PHPUnitDomingos Teruel
 
GOTEST-Aula3-Automacao-Processo-Testes.pdf
GOTEST-Aula3-Automacao-Processo-Testes.pdfGOTEST-Aula3-Automacao-Processo-Testes.pdf
GOTEST-Aula3-Automacao-Processo-Testes.pdfRodolphoCesar2
 
Como testar sua aplicação Android com Robotium
Como testar sua aplicação Android com RobotiumComo testar sua aplicação Android com Robotium
Como testar sua aplicação Android com RobotiumThayse Severiano
 
1 2 3 - Testando - Automatizando os testes de software
1 2 3 - Testando - Automatizando os testes de software1 2 3 - Testando - Automatizando os testes de software
1 2 3 - Testando - Automatizando os testes de softwareHeider Lopes
 
Introdução ao Teste de Software - Uma abordagem prática
Introdução ao Teste de Software - Uma abordagem práticaIntrodução ao Teste de Software - Uma abordagem prática
Introdução ao Teste de Software - Uma abordagem práticaFabrício Campos
 
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...Claudinei Brito Junior
 
Palestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnitPalestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnitRobinson Castilho
 
ABAP Code Retreat Brasil - Apagando tudo e começando novamente: Conhecendo o TDD
ABAP Code Retreat Brasil - Apagando tudo e começando novamente: Conhecendo o TDDABAP Code Retreat Brasil - Apagando tudo e começando novamente: Conhecendo o TDD
ABAP Code Retreat Brasil - Apagando tudo e começando novamente: Conhecendo o TDDRaphael Pacheco
 
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...Isaac de Souza
 
Testes de Unidade - Unidade II
Testes de Unidade - Unidade IITestes de Unidade - Unidade II
Testes de Unidade - Unidade IIJoão Lourenço
 
6. apresentacao rp tec com 2018 igor rozani e felipe muniz
6. apresentacao rp tec com 2018 igor rozani e felipe muniz6. apresentacao rp tec com 2018 igor rozani e felipe muniz
6. apresentacao rp tec com 2018 igor rozani e felipe munizMatheus de Lara Calache
 

Semelhante a Testes Unitários (20)

Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junit
 
Mock it with mockito
Mock it with mockitoMock it with mockito
Mock it with mockito
 
Pensando em java univali turbinando seus testes
Pensando em java univali   turbinando seus testesPensando em java univali   turbinando seus testes
Pensando em java univali turbinando seus testes
 
JUnit Experience
JUnit ExperienceJUnit Experience
JUnit Experience
 
J unit xp
J unit xpJ unit xp
J unit xp
 
A importância dos testes unitários: do código legado ao pipeline de testes em...
A importância dos testes unitários: do código legado ao pipeline de testes em...A importância dos testes unitários: do código legado ao pipeline de testes em...
A importância dos testes unitários: do código legado ao pipeline de testes em...
 
Qualidade no desenvolvimento de Software com TDD e PHPUnit
Qualidade no desenvolvimento de Software com TDD e PHPUnitQualidade no desenvolvimento de Software com TDD e PHPUnit
Qualidade no desenvolvimento de Software com TDD e PHPUnit
 
GOTEST-Aula3-Automacao-Processo-Testes.pdf
GOTEST-Aula3-Automacao-Processo-Testes.pdfGOTEST-Aula3-Automacao-Processo-Testes.pdf
GOTEST-Aula3-Automacao-Processo-Testes.pdf
 
Como testar sua aplicação Android com Robotium
Como testar sua aplicação Android com RobotiumComo testar sua aplicação Android com Robotium
Como testar sua aplicação Android com Robotium
 
1 2 3 - Testando - Automatizando os testes de software
1 2 3 - Testando - Automatizando os testes de software1 2 3 - Testando - Automatizando os testes de software
1 2 3 - Testando - Automatizando os testes de software
 
Introdução ao Teste de Software - Uma abordagem prática
Introdução ao Teste de Software - Uma abordagem práticaIntrodução ao Teste de Software - Uma abordagem prática
Introdução ao Teste de Software - Uma abordagem prática
 
Teste de software
Teste de softwareTeste de software
Teste de software
 
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
 
Palestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnitPalestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnit
 
1° Madrugada de Testes
1° Madrugada de Testes1° Madrugada de Testes
1° Madrugada de Testes
 
Esteroides JEE
Esteroides JEEEsteroides JEE
Esteroides JEE
 
ABAP Code Retreat Brasil - Apagando tudo e começando novamente: Conhecendo o TDD
ABAP Code Retreat Brasil - Apagando tudo e começando novamente: Conhecendo o TDDABAP Code Retreat Brasil - Apagando tudo e começando novamente: Conhecendo o TDD
ABAP Code Retreat Brasil - Apagando tudo e começando novamente: Conhecendo o TDD
 
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
 
Testes de Unidade - Unidade II
Testes de Unidade - Unidade IITestes de Unidade - Unidade II
Testes de Unidade - Unidade II
 
6. apresentacao rp tec com 2018 igor rozani e felipe muniz
6. apresentacao rp tec com 2018 igor rozani e felipe muniz6. apresentacao rp tec com 2018 igor rozani e felipe muniz
6. apresentacao rp tec com 2018 igor rozani e felipe muniz
 

Mais de Jadson Santos

Containerizing a Web Application with Vue.js and Java
Containerizing a Web Application with Vue.js and JavaContainerizing a Web Application with Vue.js and Java
Containerizing a Web Application with Vue.js and JavaJadson Santos
 
Continuous Delivery with Jenkins
Continuous Delivery with JenkinsContinuous Delivery with Jenkins
Continuous Delivery with JenkinsJadson Santos
 
Cd with Github Travis CI and Heroku
Cd with Github Travis CI and HerokuCd with Github Travis CI and Heroku
Cd with Github Travis CI and HerokuJadson Santos
 
Jenkins Continuous Delivery
Jenkins Continuous DeliveryJenkins Continuous Delivery
Jenkins Continuous DeliveryJadson Santos
 
Introduction to angular with a simple but complete project
Introduction to angular with a simple but complete projectIntroduction to angular with a simple but complete project
Introduction to angular with a simple but complete projectJadson Santos
 
Hazelcast Distributed Lock
Hazelcast Distributed LockHazelcast Distributed Lock
Hazelcast Distributed LockJadson Santos
 
Introdução ao Flyway
Introdução ao FlywayIntrodução ao Flyway
Introdução ao FlywayJadson Santos
 
Usando hiberante de forma otimizada
Usando hiberante de forma otimizadaUsando hiberante de forma otimizada
Usando hiberante de forma otimizadaJadson Santos
 
Usando JMeter para testar sua aplicação JSF
Usando JMeter para testar sua aplicação JSFUsando JMeter para testar sua aplicação JSF
Usando JMeter para testar sua aplicação JSFJadson Santos
 
Conditional Execution - A Pattern for the Implementation of Fine-Grained Vari...
Conditional Execution - A Pattern for the Implementation of Fine-Grained Vari...Conditional Execution - A Pattern for the Implementation of Fine-Grained Vari...
Conditional Execution - A Pattern for the Implementation of Fine-Grained Vari...Jadson Santos
 

Mais de Jadson Santos (12)

Containerizing a Web Application with Vue.js and Java
Containerizing a Web Application with Vue.js and JavaContainerizing a Web Application with Vue.js and Java
Containerizing a Web Application with Vue.js and Java
 
Continuous Delivery with Jenkins
Continuous Delivery with JenkinsContinuous Delivery with Jenkins
Continuous Delivery with Jenkins
 
Cd with Github Travis CI and Heroku
Cd with Github Travis CI and HerokuCd with Github Travis CI and Heroku
Cd with Github Travis CI and Heroku
 
Vue.js
Vue.jsVue.js
Vue.js
 
Jenkins Continuous Delivery
Jenkins Continuous DeliveryJenkins Continuous Delivery
Jenkins Continuous Delivery
 
Introduction to angular with a simple but complete project
Introduction to angular with a simple but complete projectIntroduction to angular with a simple but complete project
Introduction to angular with a simple but complete project
 
Hazelcast Distributed Lock
Hazelcast Distributed LockHazelcast Distributed Lock
Hazelcast Distributed Lock
 
Introdução ao Flyway
Introdução ao FlywayIntrodução ao Flyway
Introdução ao Flyway
 
Usando hiberante de forma otimizada
Usando hiberante de forma otimizadaUsando hiberante de forma otimizada
Usando hiberante de forma otimizada
 
Usando JMeter para testar sua aplicação JSF
Usando JMeter para testar sua aplicação JSFUsando JMeter para testar sua aplicação JSF
Usando JMeter para testar sua aplicação JSF
 
Enums
EnumsEnums
Enums
 
Conditional Execution - A Pattern for the Implementation of Fine-Grained Vari...
Conditional Execution - A Pattern for the Implementation of Fine-Grained Vari...Conditional Execution - A Pattern for the Implementation of Fine-Grained Vari...
Conditional Execution - A Pattern for the Implementation of Fine-Grained Vari...
 

Testes Unitários

  • 2. Testes Unitários • O que são Testes Unitários? • É um nível de teste de software no qual componentes individuais são testados (métodos) • O propósito é validar se cada unidade do software executa como esperado 11/06/2016 Testes Unitários 2
  • 4. Testes Unitários • Os testes unitários tem como benefício: • Garantir que problemas serão descobertos cedo. • Facilitar a manutenção de código • Servir como documentação • Ajudam a melhorar o design do seu código e torna-lo um melhor desenvolvedor 11/06/2016 Testes Unitários 4
  • 6. Testes Unitários 11/06/2016 Testes Unitários • Como escrever um teste para essa classe??? 6
  • 7. Testes Unitários • Criando método para testar conta com saldo 11/06/2016 Testes Unitários 7
  • 8. Testes Unitários 11/06/2016 Testes Unitários •Pronto??? •A classe está testada ???? 8
  • 9. Testes Unitários • Criando método para testar conta sem saldo 11/06/2016 Testes Unitários 9
  • 10. Testes Unitários 11/06/2016 Testes Unitários •E agora??? •A classe está testada ???? 10
  • 11. Testes Unitários • E se alguém criar uma conta passando nulo??? 11/06/2016 Testes Unitários 11
  • 12. Testes Unitários • Alterando a classe conta para passar no 3º teste 11/06/2016 Testes Unitários 12
  • 13. Testes Unitários 11/06/2016 Testes Unitários • Qualquer alteração na classe Conta, você terá mais confiança de que o comportamento do método temSaldo será mantido!!! 13 Os três testes passaram
  • 14. Testes Unitários • Algumas observações: • Para ter certeza de que o seu código não tem erro, deve-se testar todas as possíveis entradas do método • Para a variável saldo: • 4.94065645841246544e-324d a 1.79769313486231570e+308d • Geralmente, se testa alguns valores chaves que representam todas as possíveis entradas: • -1000, -1, 0, null, +1, +1000 • Tenha criatividade para imaginar as possiblidades de testes!!! 11/06/2016 Testes Unitários 14
  • 15. Testes Unitários • Não teste métodos triviais, tipo get e set padrões, só se esses métodos tiverem validações. • Achou um bug? Não conserte sem antes escrever um teste que o pegue • Preocupe-se com a qualidade do código dos seus testes, mantenha igual ao código das classes que estão sendo testadas, pois você vai precisar mantê-los do mesmo jeito. 11/06/2016 Testes Unitários 15
  • 16. Testes Unitários • Para esse simples exemplo: • Classe Conta: 13 linhas de código • Classe Conta Teste: 31 linhas de código • O número de linhas de código para se testar um sistema geralmente é maior que o número de linhas de código do sistema 11/06/2016 Testes Unitários 16
  • 17. JUnit • Framework que facilita o desenvolvimento e execução de testes unitários em código JAVA. • Facilita a criação, execução automática de testes e a apresentação dos resultados 11/06/2016 Testes Unitários Junit 17
  • 18. Junit 11/06/2016 Testes Unitários •Vamos criar o mesmo teste da classe Conta usado o JUnit 18
  • 19. JUnit • Criando um teste unitário com JUnit 11/06/2016 Testes Unitários 19
  • 20. JUnit • Criando um teste unitário com Junit • Defina o nome da classe • E a classe que vai ser testada 11/06/2016 Testes Unitários 20
  • 21. JUnit • Criando um teste unitário com JUnit • Escolha os métodos a serem testados 11/06/2016 Testes Unitários 21
  • 22. JUnit • Criando um teste com JUnit 11/06/2016 Testes Unitários A partir da Versão 4 do JUnit todo método com um @Test é um teste unitário a ser executo Substitui o método main() 22
  • 23. JUnit • Criando um teste com JUnit 11/06/2016 Testes Unitários Junit possui vários métodos “assertions” Substitui os testes feitos anteriormente “if ... else .. println()” 23
  • 24. Main Assert Statements 11/06/2016 Testes Unitários fail(String) Faz o método falhar assertTrue(boolean, condition) Testa se a condição é verdadeira assertFalse(boolean, condition) Testa se a condição é falsa assetEquals(expected, actual) Teste se dois valores são iguais assertEquals(expected, actual, tolerance) Para float ou double, a tolerância é o número de casas decimais a ser verificado assertNull(object) Verifica se o objeto é nulo assertNotNull(object) Verifica se o objeto não é nulo 24
  • 25. JUnit • Criando um teste com Junit • Existem vários métodos assertX, para validar os resultados dos testes 11/06/2016 Testes Unitários 25
  • 26. JUnit • Criando um teste com Junit • Executando os Teste pelo Eclipse 11/06/2016 Testes Unitários 26
  • 27. JUnit • TestSuite: Permite executar um conjunto de testes de uma só vez. 11/06/2016 Testes Unitários 27
  • 28. JUnit • Criando um teste com Junit • TestSuite: Roda vários casos de testes ao mesmo tempo 11/06/2016 Testes Unitários 28
  • 29. JUnit • Criando um teste com Junit • TestSuite: Roda vários casos de testes ao mesmo tempo 11/06/2016 Testes Unitários 29
  • 30. JUnit • Criando um teste com Junit • TestSuite: Roda vários casos de testes ao mesmo tempo 11/06/2016 Testes Unitários Para adicionar novos testes ao TestSuite, basta apenas adicionar novas classes à anotação @SuiteClasses 30
  • 31. JUnit Annotations 11/06/2016 Testes Unitários @Test Identifica um método de testes @Test(expected= Exception.class) Falha se o método testado não retornar essa exceção @Test(timeout=100) Falha se o método demorar mais de 100milisegundos @Before public void method() Executa antes de cada teste. Usado para preparar o ambiente de teste @After public void method() Executa depois de cada teste. Usado para liberar recursos do teste @BeforeClass public static void method() Executa 1 vez, antes de todos os testes. Usado para preparar o ambiente de teste O método anotado deve ser estátivo @AfterClass public static void method() Executa 1 vez, depois de todos os testes. Usado para liberar recursos do teste O método anotado deve ser estático @Ignore Ignora algum método de teste 31
  • 33. JUnit Rule 11/06/2016 Testes Unitários • Pode-se criar objetos que podem ser usados nos seus métodos de teste 33
  • 34. JUnit Categories 11/06/2016 Testes Unitários • Serve para agrupar tipos de testes 34
  • 35. JUnit Categories 11/06/2016 Testes Unitários • Define em um TestSuite quais categorias serão executadas por ele. 35
  • 36. Mock Objects 11/06/2016 Testes Unitários • Testes unitários devem testar uma classe isoladamente, isto é, sem que o efeito de outras classes com que ela se relaciona, interfiram no teste. • Isso é particularmente muito difícil porque a maioria das classes em um sistema real possuem relacionamento com outras classes • Para resolver esse problema, normalmente se usa a metodologia de se criar Mocks. 36
  • 37. Mock Objects 11/06/2016 Testes Unitários • Objetos Mocks são implementações simuladas de um interface ou classe que define a saída das chamas dos métodos que se relacionam com a classe. • Isso ajuda a assegurar que você só teste a classe e que seu teste não será afetado por efeitos colaterais 37
  • 38. Mock Objects 11/06/2016 Testes Unitários • No mundo real a classe Conta deveria atualizar o saldo de forma persistente, não apenas em memória. 38
  • 39. Mock Objects 11/06/2016 Testes Unitários • Nova versão da classe Conta: 39
  • 40. Mock Objects 11/06/2016 Testes Unitários • Tentativa de Criar um Teste para nova classe Conta passando um objeto DAO para atualizar o saldo: 40
  • 41. Mock Objects 11/06/2016 Testes Unitários • Como resolver esse problema? • Isso é, como alterar o comportamento do objeto DAO para o teste passar, sem alterar o objeto DAO real porque ele precisa se comunicar com o banco quando for executado em produção? • R: Por meio da herança. 41
  • 42. Mock Objects 11/06/2016 Testes Unitários • Criação de uma subclasse que simula(Mock) ser um banco de dados 42
  • 43. Mock Objects 11/06/2016 Testes Unitários • No Teste Unitário que usa o objeto Mock criado: • Objetivo não é testar se o dado é salvo, o objetivo do teste é testar se a lógica do saque está correta 43
  • 44. Mock Objects 11/06/2016 Testes Unitários • O problema com Mock Objects é que eles são trabalhosos de serem criados. • Para isso surgiram vários Framework de geração de Mock, esse é nosso próximo passo .... 44
  • 45. Mockito • É um Framework popular para construção de Mocks que pode ser usado em conjunto com o JUnit. 11/06/2016 Testes Unitários Mockito Junit 45
  • 46. Mockito • Em vez de você precisar criar os Mocks, você apenas indica, que o Mockito criar o mock para você. 11/06/2016 Testes Unitários 46
  • 47. Mockito • Por padrão um mock é uma subclasse com todos os métodos vazios • É possível definir valores a serem retornados ao se chamar algum método do mock. • Com os métodos Mockito.when(...).thenReturn(...) 11/06/2016 Testes Unitários 47
  • 48. Mockito • Definindo o comportamento do método buscaPorSaldoMaiorQue() do mock. 11/06/2016 Testes Unitários 48
  • 49. Mockito • É possível criar um Mock Parcial do objeto com o método Spy(). • Mock Parcial é um mock cujo todos os métodos possuem o comportamento real do objeto. 11/06/2016 Testes Unitários 49
  • 50. Mockito • E para que eu quero um Mock onde todos os métodos possuem o comportamento real do objeto um mock já não é para não realizar o comportamento real? • Porque as vezes, por exemplo, você precisa usar a classe testada em algum método do Mockito, mas os métodos do mockito só aceitando mocks, e você não deseja criar um mock da classe testada, se não, você não vai ter código para ser executado na classe testada. Nestes casos usa-se o mock parcial. Entendeu ? Não! Espere mais 2 slides até eu explicar o que é o verify. 11/06/2016 Testes Unitários 50
  • 51. Mockito • Testar se um código foi executado. 11/06/2016 Testes Unitários 51 Útil para testar métodos voids. Você não tem o que testar porque o método não retorna anda, mas pelo menos pode verificar se determinado trecho de código foi executado. Se o teste chegou até aquele trecho você sabe que ele executou sem problemas até ali.
  • 52. Mockito • Uso do mock parcial (continuando ...) • Você quer usar o verify para verificar se algum método da sua classe que está sendo testada foi chamado. • Não é possível fazer Mockito.verify(minhaClasse).doStuff(1); • Porque minhaClasse não é um mock, é a classe que você está testado. Não é desejado criar um mock dela. E o método verify só aceita mocks como argumento. Para resolver essa situação é possível fazer: minhaClasse = Mockito.spy(minhaClasse); // cria um mock mas mantém o comportamento dos métodos Mockito.verify(minhaClasse).doStuff(1); // verificar se o método doStuff da minha classe que está sendo testada foi chamado recebendo o valor 1 Ps.: Todos os Métodos da minhaClasse serão executados normalmente 11/06/2016 Testes Unitários 52
  • 53. Mockito • Trabalhar com objetos que é difícil estipular um valor específico no momento da execução. Mockito.when(myClass.method( Mockito.any(Date.class))).thenReturn(x); • Para qualquer instancia da classe Date passada o método myClass#method retorna o objeito X; 11/06/2016 Testes Unitários 53
  • 54. Mockito • Limitações do Mockito: • Ele não consegue fazer mocks de: • Classes Final • Variáveis, Métodos e Objetos Estáticos • Tipos primitivos • Classes anônimas • Métodos privados • Por que? • Porque o Mockito usa herança para criar mocks, ele herda da classe real e cria uma subclasse com os método vazios os com comportamento definidos por você para o teste. 11/06/2016 Testes Unitários 54
  • 55. Mockito • É comum vários sistemas possuírem dados estáticos acessando banco de dados ou outros recursos externos cujo mockito não consegue isolar 11/06/2016 Testes Unitários 55
  • 56. PowerMock • Um Framework do Mock que estende o Mockito para provê mocks mais poderosos. • Principalmente de mockar objetos estáticos 11/06/2016 Testes Unitários Mockito Junit PowerMock 56
  • 57. PowerMock • Um Framework do Mock que estende o Mockito para provê mock mais poderosos. • Ele consegue fazer isso porque ele vai no bytecode da classe e altera o código para a execução do teste. 11/06/2016 Testes Unitários 57
  • 58. PowerMock 11/06/2016 Testes Unitários • Testar uma classe que usa o método estático getBundle() 58
  • 61. PowerMock 11/06/2016 Testes Unitários Use the PowerMock Junit runner Declara a classe que nós iremos testar e que possui o método estático. Será carregada em outro classloader Diz ao Powermock para realizar mock dos métodos estáticos da classe 61
  • 63. PowerMock • “PowerMock é uma ferramenta poderosa, mas devemos sempre nós lembrar: Se nós encontramos uma situação onde só o PowerMock pode resolver nosso problema. Então nós falhamos. Isso significa que a classe que está sendo testada está errada.” Charles Roth www.thedance.net/~roth/TECHBLOG/powerMock. html 11/06/2016 Testes Unitários 63
  • 64. PowerMock • Se você encontrar uma situação que precisa mockar um método estático, então provavelmente esse método não deveria ser estático. • Algumas vezes esse método pertence a uma classe de terceiros que não pode ser alterada, para essas situações que o PowerMock foi criado. 11/06/2016 Testes Unitários 64
  • 65. PowerMock 11/06/2016 Testes Unitários • Outras funcionalidades: • Chamar uma método real de um mock • PowerMockito.doCallRealMethod() .when(UFRNUtils.class, “checkRole”, usuarioLogado, PapeisProtocolo.RECEBER_PROTOCOLO); • Pular a execução de algum método que não deve ser chamado • PowerMockito.suppress(PowerMockito.method (ProcessadorAnaliseComissaoProgressao.class, “criar”)); 65
  • 67. Teste na Integração Contínua • “Integração Contínua é uma prática de desenvolvimento de software onde os membros de um time integram seu trabalho frequentemente. Cada integração é verificada por um build automatizado (incluindo testes) para detectar erros de integração o mais rápido possível.” [Martin Fowler] 11/06/2016 Testes Unitários 67
  • 68. Teste na Integração Contínua • Testes automatizados é uma parte fundamental da integração contínua • Ou você usa testes automatizados ou você não estará realizando integração contínua 11/06/2016 Testes Unitários 68
  • 69. Teste na Integração Contínua • Chamando Test Suites a partir do Gradle. 11/06/2016 Testes Unitários 69
  • 70. Teste na Integração Contínua 11/06/2016 Testes Unitários 70 • Rodando os testes do sistema periodicamente • Para isso crie um job que rode constantemente (idealmente a cada commit) e execute os testes unitários
  • 71. Teste na Integração Contínua 11/06/2016 Testes Unitários 71 • Rodando os testes do sistema periodicamente • Esse job invoca a task unitTest do Gradle que por sua vez executa os Test Suites do sistema
  • 72. Teste na Integração Contínua 11/06/2016 Testes Unitários 72 • Rodando os testes do sistema periodicamente • O Gradle armazena os resultado dos testes por padrão do diretório build/test-results do projeto, é possível mandar o jenkins publicar esses resultados
  • 73. Teste na Integração Contínua 11/06/2016 Testes Unitários 73 • Rodando os testes do sistema periodicamente • Assim é possível ver na interface do jenkins a tendência dos testes do sistema • Caso algum teste falhe, a build quebra e imediatamente toda a equipe é avisada