Agenda
1 - Conceitos Bsicos sobre Framework 2 - Utilizando o framework JUnit para testes unitrios
"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"
"Projeto de alto nvel que representa o contedo intelectual do software, que muito mais difcil de criar ou recriar do que o cdigo"
"Um framework composto por uma coleo de classes abstratas e concretas e a interface entre elas, representando o projeto de um subsistema"
(Pree, 1995)
"Conjuntos de blocos de software prfabricados que programadores podem usar, estender e adaptar para solues computacionais especficas"
(Taligent, 1993)
Framework determina o fluxo de controle do programa e sua estrutura geral No reuso tradicional de componentes (por exemplo, isso cabe ao desenvolvedor)
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
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
11
Classificao de Frameworks
Caixa branca Caixa cinza Caixa preta De Infra-estrutura do sistema De Integrao (middleware) De aplicao
12
Antes de detalhar os tipos de frameworks, importante identificar as diferenas entre usar herana e composio. Herana pura
13
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
"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
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
Usurio deve criar subclasses das classes abstratas contidas no framework Usurio deve entender detalhes de como framework funciona
Usurio combina classes concretas para obter aplicao Usurio deve entender apenas a interface para utiliz-lo
21
Meio termo entre caixa branca e preta Reuso por herana e/ou por composio
22
Atual tendncia (Yassin e Fayad, 2000) Branca > Cinza >>>>>> Preta
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
26
Testes de Unidade
Testam
Mtodos Objetos/Classes
27
Testes de Unidade
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
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
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
reflexo
Principais asseres
assertEquals(objEsperado, objRecebido); assertTrue(expBooleana); assertNull(obj); assertNotNull(obj) assertSame(obj1, obj2); fail(mensagem);
34
public void setUp() { calc = new Calculadora(); } public void tearDown() { calc = null; } }
35
Junit 4.x
Todos os testes so anotados com @Test
@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
... 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
38
Executando os testes
No Eclipse (3.x) suporta o JUnit 3.x JUnit4Adapter permite rodar testes do JUnit 4 nesses ambientes, usando o mtodo suite()
39
40
40
JUnit
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
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
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
@BeforeClass public void rodaAntesDeTodosOsTestes() { LogMensagenss = new ArquivoDeLogMensagens(); LogMensagenss.carregaDadosDaRede(); } Processamento pesado! @AfterClass public void rodaDepoisDeTodosOsTestes() { LogMensagenss = null; }
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; }
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
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;
51
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
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
//
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