Você está na página 1de 56

Cefet-PA Curso de Tecnologia em Anlise e Desenvolvimento de Sistemas Disciplina: Engenharia de Software da Web

Frameworks para Web


1 - Conceitos Bsicos sobre Framework 2 - Utilizando o framework JUnit para testes
Prof. Cludio Martins
1

Agenda

1 - Conceitos Bsicos sobre Framework 2 - Utilizando o framework JUnit para testes unitrios

1 - Conceitos Bsicos sobre Framework

O que um Framework? (Braga, 2003)


Diversas definies na literatura Todas do enfoque em facilitar o reuso


No s do cdigo-fonte Mas de todas as fases de desenvolvimento

O termo Framework geralmente utilizado como Framework de software orientado a objetos

Algumas Definies (1)

"Conjunto de classes que contm o projeto abstrato de solues para uma famlia de problemas relacionados, propiciando reuso com granularidade maior do que as classes"

(Johnson e Foote, 1988)

"Projeto de alto nvel que representa o contedo intelectual do software, que muito mais difcil de criar ou recriar do que o cdigo"

(Johnson e Russo, 1991)

Algumas Definies (2)

"Um framework composto por uma coleo de classes abstratas e concretas e a interface entre elas, representando o projeto de um subsistema"

(Pree, 1995)

Algumas Definies (3)

"Conjuntos de blocos de software prfabricados que programadores podem usar, estender e adaptar para solues computacionais especficas"

(Taligent, 1993)

Caractersticas Principais (1)


Tcnica de reuso orientado a objetos Inverso de Controle

Framework determina o fluxo de controle do programa e sua estrutura geral No reuso tradicional de componentes (por exemplo, isso cabe ao desenvolvedor)

Usando componentes de uma biblioteca Copiando o cdigo e adaptando-o novas necessidades

Caractersticas Principais (2)

Pontos variveis (hot spots)


Representam partes do framework que so especficas de sistemas individuais (configurao) Podem ser adaptados s necessidades da aplicao Definem a arquitetura geral So usados sem nenhuma modificao em todas as instncias do framework

Pontos fixos (frozen spots)


Explicando melhor Framework

Pense em um framework como um engine (mecanismo eltrico, motor)


Um engine necessita de eletricidade para funcionar

Diferente de um motor tradicional, um framework um motor que tem muitos pontos de ligao (cabos). Cada ponto de ligao um hot spot (tomada) do framework. Cada hot spot deve ser energizada (implementada) para o motor (framework) trabalhar. Os geradores de energia so o cdigo especfico de cada aplicao que ligada a estes hot spots. O cdigo da aplicao dever usar o cdigo bsico (kernel) do framework. O motor/mecanismo do framework no ir funcionar se os mdulos (cdigos) da aplicao no forem conectados ao framework.
10

Explicando melhor Framework

11

Classificao de Frameworks

Os framework podem ser classificados: Considerando a forma de reuso:


Caixa branca Caixa cinza Caixa preta De Infra-estrutura do sistema De Integrao (middleware) De aplicao

Considerando o escopo da aplicao:


12

Conceitos: Herana x Composio

Antes de detalhar os tipos de frameworks, importante identificar as diferenas entre usar herana e composio. Herana pura

Reutilizao dos mtodos e atributos da superclasse.

13

Herana com extenso

o uso da herana com acrscimos (extenses) de funcionalidades (novos mtodos).

14

Composio

A composio permite reutilizar e acrescentar funcionalidades, com mais flexibilidade A herana uma reutilizao em tempo de compilao A composio em tempo de execuo (reuso dinmico) O reuso por composio deve ser a escolha preferencial

15

Composio em Java

Objetos podem ser inicializados no construtor


Flexibilidade Pode trocar objetos durante a execuo!

O Relacionamento deve ser lido com a expresso

"TEM UM"
class NovaClasse { Um um = new Um(); Dois dois = new Dois(); Tres tres = new Tres(); } 16

Herana em Java

17

Herana em Java

Assinatura do mtodo tem que ser igual ou sobreposio no ocorrer (poder ocorrer sobrecarga no desejada)

18

Composio e Herana

Composio e herana no so mutuamente exclusivas

As tcnicas podem ser usadas em conjunto para obter os melhores resultados de cada uma No desenvolvimento, composio a tcnica predominante Herana geralmente ocorre mais no criao de tipos (enumerao e classificadores, por exemplo)

19

Framework Caixa Branca

Reuso atravs de herana


Usurio deve criar subclasses das classes abstratas contidas no framework Usurio deve entender detalhes de como framework funciona

Exemplo: JUNIT Framework de testes

Classe do usurio (estendendo de TestCase de JUnit) 20

Framework Caixa Preta

Reuso atravs de composio

Usurio combina classes concretas para obter aplicao Usurio deve entender apenas a interface para utiliz-lo

21

Framework Caixa Cinza


Meio termo entre caixa branca e preta Reuso por herana e/ou por composio

22

Comparao Formas de reuso

Caixa branca mais fcil de projetar

No necessrio prever todas as alternativas possveis Basta escolher a implementao desejada

Caixa preta mais fcil de usar

Caixa cinza tenta tirar vantagem dos dois anteriores

Atual tendncia (Yassin e Fayad, 2000) Branca > Cinza >>>>>> Preta

Ciclo de vida tradicional de um framework

23

Concluses

Frameworks visam reuso e vem sendo muito utilizados em aplicaes de domnios especficos Muitas metodologias vm sendo propostas Incio comum: definir os pontos variveis do framework a fim de iniciar a fase de projeto

Pontos de configurao para atender necessidades individuais das aplicaes (instncias) Geralmente esses pontos so obtidos a partir das funcionalidades desejadas
24

Referncias (Frameworks)

http://www.acm.org/crossroads/xrds7-4/frameworks.html
Johnson, R. E.; Russo, V. Reusing object-oriented designs. Rel. Tc. UIUCDCS 91-1696, University of Illinois, 1991. Johnson, R.; Foote, B. Designing reusable classes. Journal of Object Oriented Programming, v. 1, n. 2, p. 2235, 1988. Pree, W. Design patterns for object-oriented software development. Addison-Wesley, 1995. Pree, W. Hot-spot-driven development in M. Fayad, R. Johnson, D. Schmidt. Building Application Frameworks: Object-Oriented Foundations of Framework Design, John Willey and Sons, p. 379-393, 1999.
25

2 - Utilizando o framework JUnit para testes unitrios


Verso 4.x (disponvel em http://www.junit.org)

26

Testes de Unidade
Testam

a aplicao em seus menores componentes, isoladamente Testam unidades lgicas


Mtodos Objetos/Classes

27

Testes de Unidade

Testes de Unidade visam


Identificar maior nmero de erros possvel Corrigir erros aps a identificao A cada ciclo de novas funcionalidades, todos os testes devem ser repetidos e novos testes devem ser includos

Devem ser executados continuamente

28

Junit
O

JUnit um framework open-source, criado por Eric Gamma e Kent Beck, com suporte criao de testes automatizados na linguagem de programao Java.

29

Junit

Possibilita a criao das classes de testes Tem como objetivo facilitar a criao de casos de teste Permitir escrever testes que retenham seu valor ao longo do tempo, ou seja, que possam ser reutilizveis.

30

Download da Ferramenta

At Abril/2009 (verso 4.6de 2009-04-14 02:31) Em http://www.junit.org/ (escolha Download JUnit )

31

Exemplo: Calculadora
public class Calculadora { public float soma(int a, int b) { return a + b; } public float subtrai(int a, int b) { return a - b; } public float divide(int a, int b) { return a / b; } public float multiplica(int a, int b) { return a * b; } } import junit.framework.TestCase; public class CalculadoraTest extends TestCase { @Test public void testSoma() { assertEquals(4f, new Calculadora().soma(1,4)); } public void testSubtrai() {fail("Ainda no implementado!");} public void testDivide() {fail("Ainda no implementado!");} public void testMultiplica() {fail("Ainda no implementado!"); } } 32

JUnit (verses anteriores a 4.x)


import junit.framework.TestCase; public class CalculadoraTest extends TestCase { public void testSoma() { assertEquals(4f, new Calculadora().soma(1,4)); } public void testSubtrai() {fail("Ainda no implementado!");} public void testDivide() {fail("Ainda no implementado!");} mtodos da classe TestCase public void testMultiplica() {fail("Ainda no implementado!"); } } 1. Para cada classe definido uma classe de testes NomeDaClasseTest. 2. Para cada mtodo da classeTest definido um mtodo denominado testNomeMtodoNaClasse. 33

reflexo

Principais asseres
assertEquals(objEsperado, objRecebido); assertTrue(expBooleana); assertNull(obj); assertNotNull(obj) assertSame(obj1, obj2); fail(mensagem);

34

Velho JUnit (verses anteriores a 4.x)


import junit.framework.TestCase; public class private

CalculadoraTest extends TestCase { Calculadora calc;

public void setUp() { calc = new Calculadora(); } public void tearDown() { calc = null; } }
35

Junit 4.x
Todos os testes so anotados com @Test

import junit.framework.TestCase; public class CalculadoraTeste4 {

@Test
public void testSoma() { assertEquals(4f, new Calculadora().soma(1,4)); } }

A classe de testes pode ter qualquer nome. No necessrio estender (herdar) de TestCase 36

JUnit verso 4.x

Verso de teste para a classe Calculadora:

... import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; public class MeuPrimeiroTeste { @Test public void somar() { Calculadora calc = new Calculadora(); assertTrue( calc.soma(3,45) == 48 ); assertEquals( 9, calc.divide(18,2) ); } ... @Test public void ... }
37

37

JUnit 4.x

Outras anotaes que tambm podem ser utilizadas em um mtodo de teste:


@Before @After @BeforeClass @AfterClass @Test (expected=Exception.class) @Test (timeout=int) @Ignore

38

Executando os testes

Importar a biblioteca junit-4.x.jar (atualmente na verso junit-4.5.jar, em set/2008)


A maioria dos ambientes de desenvolvimento ainda no suportam Junit 4.

No Eclipse (3.x) suporta o JUnit 3.x JUnit4Adapter permite rodar testes do JUnit 4 nesses ambientes, usando o mtodo suite()

39

Executando o JUnit 4.x (console)

Usando linha de comando:

java -cp junit-4.5.jar;. junit.swingui.Test MeuTest

40

40

JUnit

Como rodamos um teste?

Precisamos executar o TestRunner


executa todos os mtodos que possuem a anotao @Test se existir um mtodo com a anotao @Before/@After, ele ser executado antes/depois de cada teste se existir um mtodo com a anotao @BeforeClass/@AfterClass, ele ser executado no incio/final do teste (s ser executado uma vez)
41
41

import import import import

Antes e Depois de Cada Teste


org.junit.After; org.junit.Before; org.junit.Test; static org.junit.Assert.assertEquals;

public class LogMensagensNovoTest { private ArquivoDeLogMensagenss LogMensagenss; @Before public void rodaAntesDeCadaTeste() { LogMensagenss = new ArquivoDeLogMensagenss(); } @After public void rodaDepoisDeCadaTeste() { LogMensagenss = null; } @Test public void testLogMensagensExiste() { assertEquals("Arquivo deve possuir Mensagens", true, LogMensagenss.possuiLogMensagens(ERROMensagem1")); } }

42

Antes e Depois de Cada Teste

possvel ter quantos mtodos @Before e @After quiser Mtodos @Before e @After so herdados das superclasses. Mtodos @Before das superclasses so executados antes dos mtodos @Before da subclasse. Mtodos @After das superclasses so executados depois. Objetivo: agrupar cdigo comum a vrios testes

43

Antes e Depois da Classe de Testes

@BeforeClass public void rodaAntesDeTodosOsTestes() { LogMensagenss = new ArquivoDeLogMensagens(); LogMensagenss.carregaDadosDaRede(); } Processamento pesado! @AfterClass public void rodaDepoisDeTodosOsTestes() { LogMensagenss = null; }

Somente um mtodo por classe Bom para inicializaes demoradas


44

Exemplo2: Antes e Depois da Classe de Testes


... @Test(expected=DivisaoPorZeroException.class) public void dividirPorZero() { int n = 2 / 0; } @Before public void zerarConta() { conta = new Conta(); } @After public void fecharConexao() { conexao.close(); } ...

45

Excees Esperadas
@Test public void testDivisaoPorZero() { try { int n = 2 / 0; ANTES fail("Dividiu por zero!"); } catch (ArithmeticException success) { assertNotNull(success.getMessage()); } } @Test(expected=ArithmeticException.class) JUnit public void testDivisaoPorZero () { int n = 2 / 0; }

Se exceo no for gerada, teste falha


46

Teste de tempo
@Test(timeout=500) public void buscaTodasAsLogMensagens(){ LogMensagens.buscaTodas(); }

Teste falha se demorar mais do que timeout til para testes de redes e conexes com bancos de dados Detalhe: @After no executado caso falhe!
47

Teste de Tempo

Aplicaes modernas existem tempo de resposta mximo. O tempo de resposta pode mudar na medida em que o sistema evolui Testes de tempo garantem que o tempo de resposta mximo seja satisfeito, mesmo que o sistema se torne mais complexo O sistema cresce em funcionalidades sem perder performance!
48

Outras Funcionalidades

@Ignore Para desabilitar temporariamente um teste assertEquals(Object[] expected, Object[] actual) compara elemento a elemento

49

Test Suite
Composio

de testes (testes de integrao)

public static Test suite() { TestSuite suite = new TestSuite(); suite.addTest(new ContaTest("testGetSaldo")); suite.addTest(new ContaTest("testCreditar")); return suite; }

Um

TestSuite usado pelo TestRunner para saber quais mtodos devem ser executados como testes.

50

Test Suite
Para

executar mais de um teste de uma vez e/ou reusar testes de outras classes
TestSuite suite = new TestSuite(); suite.addTest(new ContaTest("testSaldoConta")); suite.addTest(new ContaTest("testCredito")); suite.addTest(Poupanca.suite()); return suite;

public static Test suite() {

51

Resumo JUnit 4.x


Precisa do JDK 5 para rodar Classes de teste no so subclasses de TestCase Mtodos no comeam com test Mtodos de assero de classe @Test para anotar um teste @Before e @After para rodar antes e depois de cada teste. @Test recebe parmetro de timeout

52

Resumo

@Test recebe parmetro de exceo esperada JUnit4Adapter permite rodar JUnit 4 nos runners antigos. Testes do JUnit antigo rodam normalmente no JUnit 4 @Test recebe parmentro de excesso esperada JUnit4Adapter permite rodar JUnit 4 nos runners antigos. Testes do JUnit antigo rodam normalmente no JUnit 4

53

Outros Arcabouos Unit

DBUnit para testes com acesso a banco de dados ( http://www.dbunit.org). Cactus para testes em Servlets (http://jakarta.apache.org/cactus/) SQLUnit testes para Stored Procedures ( http://sqlunit.sourceforge.net/) JPDFUnit testa documentos PDF gerados dinamicamente ( http://jpdfunit.sourceforge.net/) XMLUnit teste para arquivos XML (http://xmlunit.sourceforge.net/) Watij teste de aplicaes Web em java ( http://watij.xwiki.com/xwiki/bin/view/Main/WebHome)

54

Exerccio1

Usando o JUnit, crie testes para os mtodos a seguir. Implemente o cdigo.


class Utilitario() { // retorna true se c1 igual a c2 public boolean comparaIguais (String c1, c2) { }
// calcula o resto da diviso inteira entre n1 e n2

public int restoDivisaoInteira(int n1, n2) { } }

//

usar o mtodo assertTrue (metodoTestar==valorVerd); 55

Referncias (JUnit)

Cdigo Existente. Porto Alegre: Bookman. Test Driven Development, Kent Beck, Addison Wesley, 2002 JUnit - http://www.junit.org/ http://www.testing.com/

56