82
Programação Orientada a Testes André Luiz Forchesatto

Introdução a Programação Orientada a testes

Embed Size (px)

Citation preview

Page 1: Introdução a Programação Orientada a testes

Programação Orientada a Testes

André Luiz Forchesatto

Page 2: Introdução a Programação Orientada a testes

Ementário

● Compreender as técnicas para teste de software através da utilização de ferramentas de testes automatizados. Avaliação de qualidade do código e cobertura de testes utilizando ferramentas automatizadas.

Page 3: Introdução a Programação Orientada a testes

POG

POF

XGH

Page 4: Introdução a Programação Orientada a testes

POG

POF

XGH

Page 5: Introdução a Programação Orientada a testes
Page 6: Introdução a Programação Orientada a testes

Testes de Software

● A atividade de teste é o processo de executar um programa com a intenção de descobrir um erro

● Um bom caso de teste é aquele que tem uma elevada probabilidade de revelar um erro ainda não descoberto

● Um teste bem-sucedido é aquele que revela um erro ainda não descoberto.

Page 7: Introdução a Programação Orientada a testes

Testes de Software

● Se erros facilmente corrigíveis forem encontrados a qualidade e a confiabilidade do software estão aceitáveis ou os testes são inadequados para revelar erros graves

● Se não for encontrado erro a configuração de teste não foi suficientemente elaborada e erros estão escondidos no software

Page 8: Introdução a Programação Orientada a testes

Testes de Software

● Projetar testes que descubram sistematicamente diferentes classes de erros e façam-no com uma quantidade de tempo e esforço mínimos.

● Se erros graves forem encontrados com regularidade a qualidade e a confiabilidade de software são suspeitas.

Page 9: Introdução a Programação Orientada a testes

Etapas para atividade de testes

Fonte: http://pt.slideshare.net/FabricioFFC/introduo-ao-teste-de-software-uma-abordagem-prtica

Page 10: Introdução a Programação Orientada a testes

O que Testar?

● Normal ISO/IEC 9126/1991 ou NBR 13596

Fonte: http://pt.slideshare.net/FabricioFFC/introduo-ao-teste-de-software-uma-abordagem-prtica

Page 11: Introdução a Programação Orientada a testes

Dependerá do tipo de software

Fonte: http://pt.slideshare.net/FabricioFFC/introduo-ao-teste-de-software-uma-abordagem-prtica

Page 12: Introdução a Programação Orientada a testes

Projeto de casos de teste

Métodos de Projeto de Casos de Teste oferecem uma abordagem sistemática ao teste e um mecanismo que ajuda a garantir a mais alta probabilidade de revelar erros no software com uma quantidade mínima de tempo e esforço. Utilizado para códigos já existentes.

ABORDAGENS de TESTE:

1. Teste de Caixa Preta

2. Teste de Caixa Branca

Page 13: Introdução a Programação Orientada a testes

Teste Caixa Preta

● Refere-se aos testes que são realizados nas interfaces do software.

● São usados para demonstrar que as funções dos softwares são operacionais, que a entrada é adequadamente aceita e a saída é corretamente produzida;

● Verifica se a integridade das informações externas é mantida

● Examina aspectos do sistema sem se preocupar muito com a estrutura lógica interna do software.

Page 14: Introdução a Programação Orientada a testes

Teste Caixa Preta

● Concentram-se nos requisitos funcionais do software.

1) funções incorretas ou ausentes2) erros de interface

3) erros nas estruturas de dados ou no acesso a bancos de dados externos4) erros de desempenho5) erros de inicialização e término

Page 15: Introdução a Programação Orientada a testes

Teste Caixa Branca

● Baseia-se num minucioso exame dos detalhes procedimentais

● "Status do programa" pode ser examinado em vários pontos para determinar se o status esperado ou estabelecido corresponde ao status real

● São testados os caminhos lógicos através do software, fornecendo-se casos de teste que põem à prova conjuntos específicos de condições e/ou laços

Page 16: Introdução a Programação Orientada a testes

Teste Caixa Branca

● Um teste de Caixa Branca efetuado de forma muito cuidadosa levaria a "100% de programas corretos" ?

● Testes exaustivos apresentam certos problemas logísticos. Mesmo para pequenos programas, o número de caminhos lógicos possíveis pode ser muito grande.

● É um método de projeto de casos de teste que usa a estrutura de controle do projeto procedimental para derivar casos de teste.

Page 17: Introdução a Programação Orientada a testes

Teste Caixa Branca

● Podem ser derivados casos de teste que: ○ garantam que todos os caminhos independentes

dentro de um módulo tenham sido exercitados pelo menos uma vez.

○ exercitem todas as decisões lógicas para valores falsos ou verdadeiros.

○ executem todos os laços em suas fronteiras e dentro de seus limites operacionais.

○ exercitem as estruturas de dados internas para garantir a sua validade.

Page 18: Introdução a Programação Orientada a testes

Teste Caixa Branca

● Teste de Caminho Básico:○ O método de caminho básico possibilita que o

projetista do caso de teste derive uma medida de complexidade lógica de um projeto procedimental e use essa medida como guia para definir um conjunto básico de caminhos de execução.

○ GRAFO DE FLUXO ou GRAFO DE PROGRAMA: uma notação para representar o fluxo de controle. Cada construção estruturada tem um símbolo de grafo correspondente.

Page 19: Introdução a Programação Orientada a testes

Teste Caixa Branca

Page 20: Introdução a Programação Orientada a testes

Teste Caixa Branca

● Caminho Independente:○ Qualquer caminho através do programa que

introduza pelo menos um novo conjunto de instruções de processamento ou uma nova condição.

Page 21: Introdução a Programação Orientada a testes

21

Conjunto BásicoCaminho 1: 1-11Caminho 2: 1-2-3-4-5-10-1-11Caminho 3: 1-2-3-6-8-9-10-1-11Caminho 4: 1-2-3-6-7-9-10-1-11

Teste Caixa Branca

Page 22: Introdução a Programação Orientada a testes

22

● Complexidade Ciclomática

○ É uma métrica de software que proporciona uma medida quantitativa da complexidade lógica de um programa.

○ Define o número de caminhos independentes do conjunto básico de um programa e oferece um limite máximo para o número de testes que deve ser realizado para garantir que todas as instruções sejam executadas pelo menos uma vez.

Teste de Caixa BrancaTeste de Caminho Básico

Page 23: Introdução a Programação Orientada a testes

23

● Complexidade Ciclomática○ É computada numa das 3 formas seguintes:

1. o número de regiões do gráfico de fluxo2. V(G) = E-N+2, onde E é o número de ramos do grafo e N o número de nós do grafo de fluxo G3. V(G) = P+1, onde P é o número de nós predicativos (nós que contém uma condição) contidos no grafo de fluxo G

Teste de Caixa BrancaTeste de Caminho Básico

Page 24: Introdução a Programação Orientada a testes

24

Complexidade Ciclomática O grafo de fluxo tem 4 regiões

V(G) = 11 ramos - 9 nós + 2 = 4

V(G) = 3 nós predicativos + 1 = 4

Complexidade Ciclomática

do grafo de fluxo é 4.

Grafo de Fluxo

região1

região2região

3

região4

Ramos

Nós

Teste de Caixa BrancaTeste de Caminho Básico

Page 25: Introdução a Programação Orientada a testes

25

O valor de V(G) oferece um limite máximo no número de testes que deve ser projetado e executado para garantir a cobertura de todas as instruções de programa.

Teste de Caixa BrancaTeste de Caminho Básico

Page 26: Introdução a Programação Orientada a testes

26

Derivando Caso de Testes - Passos do Método

1. Usando o projeto ou o código como base trace um grafo de fluxo correspondente

Teste de Caixa BrancaTeste de Caminho Básico

Page 27: Introdução a Programação Orientada a testes

Teste de Caixa BrancaTeste de Caminho Básico

4

8

1,2

3

7 5,6

9

10

Procedimento MAIOR(A:VETOR; T:inteiro; var MAX:inteiro);variáveis I,M:inteiroInicio1 M<- A[1];2 I<-2;3 enquanto I < T faça4 se A[I] > M5 então M<- A[I]6 I<- I+17 senão I<- I+18 fim se9 fim enquanto10 MAX<-M; fim do procedimento

Page 28: Introdução a Programação Orientada a testes

28

Derivando Caso de Testes - Passos do Método

2. Determine a Complexidade Ciclomática do grafo de fluxo resultante

Teste de Caixa BrancaTeste de Caminho Básico

Page 29: Introdução a Programação Orientada a testes

29

Complexidade Ciclomática

1. O grafo de fluxo tem 3 regiões

2. V(G) = 9 ramos - 8 nós + 2 = 3

3. V(G) = 2 nós predicativos + 1 = 3

A Complexidade Ciclomática é 3.

4

8

1,2

3

7 5,6

9

10

R2

R1

R3

Teste de Caixa BrancaTeste de Caminho Básico

Page 30: Introdução a Programação Orientada a testes

30

Derivando Caso de Testes - Passos do Método3. Determine um conjunto básico de caminhos linearmente independentes (3 caminhos)

Teste de Caixa BrancaTeste de Caminho Básico

Page 31: Introdução a Programação Orientada a testes

31

Teste de Caixa BrancaTeste de Caminho Básico

Caminhos

Caminho 1: 1, 2, 3, 9, 10

Caminho 2: 1, 2, 3, 4, 5, 6, 8, 3, 9, 10

Caminho 3: 1, 2, 3, 4, 7, 8, 3, 9, 104

8

1,2

3

7 5,6

9

10

R2

R1

R3

Page 32: Introdução a Programação Orientada a testes

32

Derivando Caso de Testes - Passos do Método4. Prepare os casos de teste que forcem a

execução de cada caminho no conjunto básico.

Teste de Caixa BrancaTeste de Caminho Básico

Page 33: Introdução a Programação Orientada a testes

Teste de Caixa BrancaTeste de Caminho Básico

CaminhosCaminho 1: 1, 2, 3, 9, 10 A=(1,3) T=0Resultado Esperado => Max=1Caminho 2: 1, 2, 3, 4, 5, 6, 8, 3, 9,10 A=(1,3) T=3 Resultado Esperado => Max=3Caminho 3: 1, 2, 3, 4, 7, 8, 3, 9, 10 A=(3,1) T=3

Resultado Esperado => Max=3

Procedimento MAIOR(A:VETOR; T:inteiro; var MAX:inteiro);variáveis I,M:inteiroInicio1 M<- A[1];2 I<-2;3 enquanto I < T faça4 se A[I] > M5 então M<- A[I]6 I<- I+17 senão I<- I+18 fim se9 fim enquanto10 MAX<-M; fim do procedimento

Page 34: Introdução a Programação Orientada a testes

Teste de Caixa BrancaFerramenta: EclEmma

● http://www.eclemma.org/

● Plug-in do eclipse para métricas de teste, cobertura e complexidade.

● Pode ser instalado pelo Eclipse MarketPlace

Page 35: Introdução a Programação Orientada a testes

Teste de Caixa BrancaFerramenta: EclEmma

Page 36: Introdução a Programação Orientada a testes

Estratégias de Testes

● Teste de Unidade: É a verificação de um módulo único de programa isolado dos outros módulos.

● Teste de Integração: É a verificação das interfaces (comunicações) entre os módulos do sistema.

● Teste de Validação: É a verificação das funções do sistema conforme o que consta na sua especificação (requisitos do software).

● Teste de Sistema: É a verificação das funções do sistema no ambiente real, integrado com outros sistemas, conforme a definição do(s) usuário(s).

Page 37: Introdução a Programação Orientada a testes

Ferramentas e frameworks para testes

Ferramenta Finalidade

JUnit, Hamcrest Teste unitário, automatiza a criação básica dos testes.

Selenium Testes de aceitação, simula o comportamento do usuário utilizando o sistema.

JMetter Teste de stress, simula uma quantidade de usuário para o sistema.

Mockito Testes unitário, auxiliar na hora de isolar rotinas que não devem ser testadas.

DBunit Teste de integração, popula bases de dados com informações de exemplo.

Spring-test Teste de integração, auxiliar a construção dos testes que dependem do framework.

SonarQube Ferramenta de análise de qualidade de código e cobertura de testes

Jenkins Ferramenta para integração continua.

Page 38: Introdução a Programação Orientada a testes

JUnit

● Junit é um framework que facilita o desenvolvimento e execução de testes○ API para construção dos testes○ Plugin e ferramentas para execução e visualização

dos resultados● API

○ Métodos: assertTrue(), assertEquals(), fail() entre outros, são responsáveis por verificar os resultados do teste

● Donwload○ www.junit.org

Page 39: Introdução a Programação Orientada a testes

Para que serve?● 'Padrão' para testes de unidade em Java

○ Desenvolvido por Kent Beck (o guru do XP) e Erich Gamma (o G do GoF "Design Patterns")

○ Testar é bom mas é chato; JUnit torna as coisas mais agradáveis, facilitando■ A criação e execução automática de testes■ A apresentação dos resultados

● JUnit pode verificar se cada método de uma classe funciona da forma esperada○ Permite agrupar e rodar vários testes ao mesmo

tempo○ Na falha, mostra a causa em cada teste

Page 40: Introdução a Programação Orientada a testes

Como utilizar● Criar uma classe de Test em seu projeto,

e anotar os métodos com @Testimport org.junit.Test;import static org.junit.Assert.*;

public class AppTest{

@Test public void testSoma(){ App ap = new App(); assertEquals(new Float(10), ap.soma(5f, 5f)); }}

Page 41: Introdução a Programação Orientada a testes

Como utilizar...private Float valor1;private Float valor2;

@Before public void setUp(){ valor1 = 5f; valor2 = 5f; }

@After public void tearDown(){ //Libera recursos }...

Antes de iniciar cada método de teste

Após execução de cada método de teste

Page 42: Introdução a Programação Orientada a testes

Algumas checagens

● assertEquals● assertArrayEquals● fail● assertFalse● assertTrue● assertNull● assertNotNull● assertThat

Page 43: Introdução a Programação Orientada a testes

Uso das checagens

Valor Esperado Valor Obtido

Page 44: Introdução a Programação Orientada a testes

Hamcrest

● Frameworks que melhora a legibilidade dos testes.

● Simplifica a criação dos Asserts● Retorna mensagens de falha mais legíveis● https://code.google.com/p/hamcrest/wiki/Tutorial

Page 45: Introdução a Programação Orientada a testes

Hamcrest

fonte: http://blog.caelum.com.br/melhorando-a-legibilidade-dos-seus-testes-com-o-hamcrest/

Page 46: Introdução a Programação Orientada a testes

Hamcrest - Matches

● Collections○ array○ hasEntry, hasKey, hasValue ○ hasItem, hasItems ○ hasItemInArray

● Object○ equalTo○ hasToString○ instanceOf, isCompatibleType○ notNullValue, nullValue

Page 47: Introdução a Programação Orientada a testes

Hamcrest - Matches

● Number○ closeTo○ greaterThan, greaterThanOrEqualTo, lessThan,

lessThanOrEqualTo● Text

○ equalToIgnoringCase○ equalToIgnoringWhiteSpace○ containsString○ endsWith○ startsWith

Page 48: Introdução a Programação Orientada a testes

Hamcrest - Matches

● Core○ anything○ describedAs○ is

● Logical○ allOf○ anyOf ○ not

Page 49: Introdução a Programação Orientada a testes

Hamcrest - Matches

● Matcher Personalizado:○ Devemos extender de TypeSafeMatcher e

passar o tipo do objeto a ser avaliado○ Depois implementar os métodos:

■ void describeTo(Description desc)■ boolean matchesSafely(T objeto)

Page 50: Introdução a Programação Orientada a testes

Hamcrest - Matches

fonte: http://blog.caelum.com.br/melhorando-a-legibilidade-dos-seus-testes-com-o-hamcrest/

Page 51: Introdução a Programação Orientada a testes

Prática

Criar projetos para exercitar os testes

Page 52: Introdução a Programação Orientada a testes

TDD

● Test-Driven Development● Desenvolvimento guiado pelos Testes● Publicado pela primeira vez no livro TDD: By

Example por Kent Beck em 2002● Uma das técnicas para receber feedback

rápido

Page 53: Introdução a Programação Orientada a testes

TDD - Vantagens

● Foco no teste e não na implementação● Código nasce testado● Simplicidade● Melhor reflexão sobre o designer da classe

Page 54: Introdução a Programação Orientada a testes

TDD

Page 55: Introdução a Programação Orientada a testes

Prática

Fazer exercício sugerido no livro Test-Driven Development da casa do código, página 21 capítulo 3.

Page 56: Introdução a Programação Orientada a testes

Mock

● Objetos Dublês, ou objetos "falso"● Simulam o comportamento das

dependências

Page 58: Introdução a Programação Orientada a testes

Mockito

● Framework open-source que auxilia na construção de Mocks

● Possui uma API fluente de fácil aprendizagem

● http://mockito.org/● https://github.com/mockito/mockito

Page 59: Introdução a Programação Orientada a testes

Mockito

● @Mock● @RunWith(MockitoJUnitRunner.class)● when● thenReturn● thenReturn● verify● doReturn(Object)● doThrow(Throwable)● doThrow(Class)● doAnswer(Answer)● doNothing()● doCallRealMethod()● spy

Page 60: Introdução a Programação Orientada a testes

Mockito

Page 61: Introdução a Programação Orientada a testes

Prática

Mockar objetos com Mockito

Page 62: Introdução a Programação Orientada a testes

Testes de integração

● São testes que avaliam toda infra-estrutura do programa, desde a base de dados até os sistemas integrados;

● Geralmente levam muito mais tempo para serem executados;

● Frameworks úteis:○ DBUnit○ Spring-test

Page 63: Introdução a Programação Orientada a testes

Spring-boot-test

● Simplifica o start dos testes de integração que dependem do contexto do Spring

● Já traz os frameworks Spring Test, JUnit, Hamcrest and Mockito com dependência

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope></dependency>

Page 64: Introdução a Programação Orientada a testes

Classe de teste

Page 65: Introdução a Programação Orientada a testes

Spring - Teste Integração web

● Simplifica através do MockMVC a comunicação com o Controller, simulando um requisição HTTP real.

Page 66: Introdução a Programação Orientada a testes

Spring - Teste Integração web

● Simplifica a construção do teste, através de uma interface fluente

Page 67: Introdução a Programação Orientada a testes

Prática

Criar testes para aplicação web

Page 68: Introdução a Programação Orientada a testes

DbUnit Teste Integração BD

● Framework para automatizar carga de base de dados

● Importa ou exporta dados para diferentes SGDB

● Se integra ao Spring● http://dbunit.sourceforge.net/● http://springtestdbunit.github.io/spring-test-dbunit/

Page 69: Introdução a Programação Orientada a testes

DbUnit Teste Integração BD

● Dependências

<dependency><groupId>com.github.springtestdbunit</groupId><artifactId>spring-test-dbunit</artifactId><version>1.1.0</version><scope>test</scope>

</dependency><dependency>

<groupId>org.dbunit</groupId><artifactId>dbunit</artifactId><version>2.5.0</version><scope>test</scope>

</dependency>

Page 70: Introdução a Programação Orientada a testes

Spring-test + DBUnit

● Utiliza o mesmo dataSource que o Spring cria;

● Integração com o sistema de Transação e Listeners do Spring;

@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration@TestExecutionListeners({DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class, TransactionalTestExecutionListener.class, DbUnitTestExecutionListener.class })

Page 71: Introdução a Programação Orientada a testes

Spring-test + DBUnit

● @DatabaseSetup("sampleData.xml")○ Inicializa a base de dados

● @DatabaseTearDown○ Reseta a base de dados

● @ExpectedDatabase("expectedData.xml")○ Resultado esperado após insert, update, delete

Page 72: Introdução a Programação Orientada a testes

DBUnit - sample.xml

<dataset><tabela1 coluna1="valorcoluna1" coluna2="valorcoluna2"/><tabela1 coluna1="valor2coluna1" coluna2="valor2coluna2"/><tabela1 coluna1="valor3coluna1" coluna2="valor3coluna2"/>

</dataset>

Page 73: Introdução a Programação Orientada a testes

Prática

Utilizar o DBUnit para popular uma base para testes.

Page 74: Introdução a Programação Orientada a testes

Testes de aceitação - Selenium

● Conjunto de softwares diferentes para automatização de testes para web;

● Automatização do teste realizado pelo usuário;

● Avaliação com base nas tags HTML geradas pelo sistema;

Page 75: Introdução a Programação Orientada a testes

Selenium

fonte: http://pt.slideshare.net/hugs/selenium2mobilewebtesting

Page 76: Introdução a Programação Orientada a testes

Vantagens Selenium

● Testes de regressão freqüente

● Feedback rápido para os desenvolvedores

● Iterações virtualmente ilimitado de execução do caso de teste

● Disciplinado documentação de casos de teste

● Relatórios defeito personalizado

● Encontrar defeitos perdidos por testes manuais

Page 77: Introdução a Programação Orientada a testes

WebDriver

● É uma API orientada a objetos que facilita a construção de testes para páginas web;

● Provê comandos para navegar em páginas web, localizar e manipular elementos html.

http://docs.seleniumhq.org/docs/03_webdriver.jsp

Tutorial com lista de comandos: http://www.devmedia.com.br/introducao-aos-testes-funcionais-automatizados-com-junit-e-selenium-webdriver/28037

Page 78: Introdução a Programação Orientada a testes

Comandos Comum

● get()● findElement()● click()● submit()● sendKeys()● isDisplayed()

Page 79: Introdução a Programação Orientada a testes

Localização de elementos

● class● css seletor● id● xPath

Page 80: Introdução a Programação Orientada a testes

Selenium - Download

<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>2.45.0</version></dependency>

Page 81: Introdução a Programação Orientada a testes

Criando o Teste

Page 82: Introdução a Programação Orientada a testes

Prática

Criar sistema web e testes com Selenium.