Cefet-PA Curso de Tecnologia em Anlise e Desenvolvimento de Sistemas Disciplina: Engenharia de Software da Web
Frameworks para Web1 - Conceitos Bsicos sobre Framework 2 - Utilizando o framework JUnit para testesProf. Cludio Martins1
Agenda
1 - Conceitos Bsicos sobre Framework 2 - Utilizando o framework JUnit para testes unitrios
2
1 - Conceitos Bsicos sobre Framework
3
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
4
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)
5
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)
6
Algumas Definies (3)
"Conjuntos de blocos de software prfabricados que programadores podem usar, estender e adaptar para solues computacionais especficas"
(Taligent, 1993)
7
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
8
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)
9
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 desejadas24
Referncias (Frameworks)
http://www.acm.org/crossroads/xrds7-4/frameworks.htmlJohnson, 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 unitriosVerso 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
JunitO
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: Calculadorapublic 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 asseresassertEquals(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.xTodos os testes so anotados com @Test
import junit.framework.TestCase; public class CalculadoraTeste4 {
@Testpublic 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)4141
import import import import
Antes e Depois de Cada Testeorg.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 demoradas44
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; }
4
Se exceo no for gerada, teste falha46
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 classesTestSuite 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
Top Related