A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

GRUPO DATA David, André, Thiago e Alexandre WEBCOMPONENTS.

Apresentações semelhantes


Apresentação em tema: "GRUPO DATA David, André, Thiago e Alexandre WEBCOMPONENTS."— Transcrição da apresentação:

1 GRUPO DATA David, André, Thiago e Alexandre WEBCOMPONENTS

2 Conteúdo: Antes de começar Visão Geral Principais Dependências Externas JAR - Acesso a Dados Pacote dao Pacote memory_dao Pacote jdbc_dao Conexão com JDBC Conexão com JDBC e Spring WAR – Acesso a Dados Log4J Junit DbUnit Selenium Pontos a melhorar no projeto

3 Antes de começar Informações Úteis No repositório do projeto há uma pasta DOC com o presente slide e um passo- a-passo para criar o banco de dados do projeto. O script do banco de dados se encontra dentro do pacote jdbc_dao, no projeto JAR. Seu nome é academicNetDB.sql. Os testes com o Selenium estão configurados para executar (por padrão) com o navegador Google Chrome ( http://www.google.com/chrome )http://www.google.com/chrome Algumas explicações no final do slide, em Pontos a Melhorar no Projeto podem auxiliar a entender alguns pontos do projeto. Esta apresentação possui alguns pontos com explicação evolutiva. Por exemplo, é mostrada a estrutura antes do uso de Spring e depois.

4 Visão Geral

5 Principais Dependências Externas

6 JAR Acesso a Dados

7 Acesso a Dados - Pacote dao IDAOFactory

8 Acesso a dados – IDAOFactory Abstract Factory (GoF)

9 Acesso a dados - IDAOFactory

10 Acesso a dados - JdbcDAOFactory Conexão com o Bando de Dados

11 Conexão com JDBC - JdbcPostgreConnectionFactory public class JdbcPostgreConnectionFactory { public static final String LOCAL_PADRAO = "jdbc:postgresql://localhost:5432/academicNetDB"; public static final String DRIVER_PADRAO = "org.postgresql.Driver"; private static final String USUARIO = "postgres"; private static final String SENHA = "post"; public Connection Create() { Connection conexao = null; try { Class.forName( DRIVER_PADRAO ); conexao = DriverManager.getConnection( LOCAL_PADRAO, USUARIO, SENHA ); } catch (final Exception e) { e.printStackTrace(); return null; } return conexao; }

12 public class SingletonDAOFactory { public static IDAOFactory Get () { return Instance (). _daoFactory ; } public Object clone () throws CloneNotSupportedException { throw new CloneNotSupportedException (); } private static SingletonDAOFactory Instance () { if ( null == _instance ) { _instance = new SingletonDAOFactory (); } return _instance ; } private SingletonDAOFactory () { // Substituir por outro DAO Factory caso desejado //_daoFactory = new MemoryDAOFactory(); daoFactory = new JdbcDAOFactory ( ( new JdbcPostgreeConnectionFactory () ). Create () ); } Privat static SingletonDAOFactory _instance ; private IDAOFactory _daoFactory ; } Escolha do acesso a dados - SingletonDAOFactory Instancia a fábrica desejada Cria a conexão com o BD

13 Parametrizando a conexão JDBC usando Spring Refatorando JdbcPostgreConnection Factory

14 Conexão JDBC e Spring – Refactoring Replace Type Code with Class em JdbcPostgreConnectionFactory criando ParametrosConexao 1

15 Conexão JDBC e Spring – Refactoring 2 Replace Type Code with Class em JdbcPostgreConnectionFactory criando ParametrosConexao Após, Rename em JdbcPostgreConnectionFactory para ConnectionFactory

16 Conexão JDBC e Spring - applicationContext.xml Servirá para instanciar ParametrosConexao com os valores desejados......

17 Conexão JDBC e Spring – IDAOFactoryCreator FactoryMethod (GoF) public interface IDAOFactoryCreator { IDAOFactory create(ParametrosConexao parametros); } public class JdbcDAOFactoryCreator implements IDAOFactoryCreator { public IDAOFactory create(ParametrosConexao parametros) { ConnectionFactory connectionFactory = new ConnectionFactory( parametros ); JdbcDAOFactory daoFactory = new JdbcDAOFactory( connectionFactory.create() ); return ( daoFactory ); }

18 Conexão JDBC e Spring – Carregando os parâmetros Alteração em SingletonDAOFactory public class SingletonDAOFactory {... private SingletonDAOFactory() { ApplicationContext appC = new ClassPathXmlApplicationContext( "applicationContext.xml" ); IDAOFactoryCreator daoFactoryCreator = (IDAOFactoryCreator) appC.getBean( "daoFactoryCreator" ); ParametrosConexao parametros = (ParametrosConexao) appC.getBean( "paramConexao" ); _daoFactory = daoFactoryCreator.create( parametros ); }... }

19 WAR Acesso a Dados

20 Escolhendo a fábrica de DAOs com Spring XML similar. Carregamento agora pelo Servlet (enquanto usamos Servlet). public class MainServlet extends HttpServlet { private IDAOFactory _daoFactory = null; public MainServlet() { super(); loadFactory(); } private void loadFactory() { ApplicationContext appC = new XmlWebApplicationContext(); IDAOFactoryCreator daoFactoryCreator = (IDAOFactoryCreator) appC.getBean( "daoFactoryCreator" ); ParametrosConexao parametros = (ParametrosConexao) appC.getBean( "paramConexao" ); _daoFactory = daoFactoryCreator.create( parametros ); }... }

21 Log4J Configuração e Uso

22 Log4J – Configuração da dependência - pom.xml... log4j 1.2.14 compile

23 Configuração do Log4J por XML - log4j.xml <appender name="myAppender" class="org.apache.log4j.RollingFileAppenderr">

24 Exemplo de Uso do Log4J no projeto public class JdbcAlunoDAO implements IAlunoDAO {... private static Logger logger = Logger.getLogger( JdbcAlunoDAO.class.getName() );... public void Adicionar(Aluno aluno) throws DAOException { try { String sql = "INSERT INTO ALUNO ( NOME, MATRICULA ) VALUES ( ?, ? )"; PreparedStatement pre = _conexao.prepareStatement( sql ); pre.setString( 1, aluno.getNome() ); pre.setString( 2, aluno.getMatricula() ); pre.executeUpdate(); } catch (Exception e) { logger.error( e.getMessage(), e ); throw new DAOException( e.getMessage() ); }... }

25 EMMA, Clover, Cobertura, etc. Configuração

26 org.codehaus.mojo emma-maven-plugin 1.0-alpha-1 true process-classes instrument... EMMA – Configuração do Plugin - pom.xml org.codehaus.mojo emma-maven-plugin 1.0-alpha-1 true...

27 SureFire – Configuração do Plugin - pom.xml org.apache.maven.plugins maven-surefire-plugin true once xml ${project.build.directory}/generated- classes/emma/classes... org.codehaus.mojo surefire-report-maven-plugin true...

28 Clover – Configuração do Plugin - pom.xml com.atlassian.maven.plugins maven-clover2-plugin 50% verify instrument check...

29 Cobertura – Configuração - pom.xml org.codehaus.mojo cobertura-maven-plugin...

30 jUnit, DbUnit, Selenium Testes e Configuração

31 Cobertura – Configuração - pom.xml org.codehaus.mojo cobertura-maven-plugin...

32 @Test public void naoPermiteTurmasIguais() { Turma t1 = new Turma(); t1.setCodigo("1"); t1.setDiaSemana("segunda"); t1.setTurno("manhã"); Turma t2 = new Turma(); t2.setCodigo("2"); t2.setDiaSemana("segunda"); t2.setTurno("manhã"); boolean chamouExcecao = false; try { sala.alocarTurma( t1 ); sala.alocarTurma( t2 ); // Deve falhar ! } catch (Exception e) { chamouExcecao = true; } assertTrue( chamouExcecao ); } JUnit – Exemplo de teste - TesteSala.java

33 org.dbunit dbunit 2.4.5 test DbUnit – Configuração Básica - pom.xml

34 DbUnit – XML com dados de teste - DAOTestData.xml

35 DbUnit – Execução do teste pelo XML - JdbcDAOTest.java public void insertIntoCurrentDataSet() throws DatabaseUnitException, SQLException { DatabaseOperation.INSERT.execute( _testDatabaseConnection, _currentDataSet ); } public void compareTables() throws Exception { ITable actualTable = newTableFromConnection(); ITable expectedTable = newTableFromFile(); ITable filteredTable = DefaultColumnFilter.includedColumnsTable( actualTable, expectedTable.getTableMetaData().getColumns() ); Assertion.assertEquals( expectedTable, filteredTable ); } @Test public void testInsertionFromFile() throws Exception { insertIntoCurrentDataSet(); compareTables(); }

36 public class TesteJdbcEmentaDAO extends JdbcDAOTest { private static final String TABELA_EMENTA = "EMENTA"; private static final String ARQUIVO_EMENTA = "DAOTestData.xml"; public TesteJdbcEmentaDAO() throws Exception { super( TABELA_EMENTA, ARQUIVO_EMENTA ); } DbUnit – Criação simplificada dos testes Classes de teste que herdam de JdbcDAOTest só configuram o nome da tabela e o XML. A classe já faz a execução dos testes, como inserção e remoção e comparação dos valores esperados com base no XML. Assim, as classes terão seu BD testado e necessitam, então, só de testar o acesso via DAO.

37 public void testInsereERecuperaCorretamente() throws Exception { final int ID = 999999; Ementa ementa = novaEmenta( ID ); Ementa ementaGravada = null; IEmentaDAO dao = daoFactory().CriarEmentaDAO(); dao.Adicionar( ementa ); ementaGravada = dao.CarregarPeloID( ID ); assert( ementaGravada != null ); assert( ementa.equals( ementaGravada ) ); } dbUnit – Exemplo de teste - TesteJdbcEmentaDAO.java Exemplo de teste do DAO

38 Selenium – Configuração Básica - pom.xml org.openqa.selenium.server selenium-server 1.0-20081010.060147 test org.seleniumhq.selenium.client-drivers selenium-java-client-driver 1.0.1 test

39 private void entrarEmEmenta() { selenium.click( "name=ementa" ); selenium.waitForPageToLoad( _helper.TEMPO_ESPERA ); } public void testInserir() throws Exception { entrarEmEmenta(); selenium.click( "name=ementaInserir" ); selenium.waitForPageToLoad( _helper.TEMPO_ESPERA ); final String CONTEUDO = "TDD"; selenium.type( "conteudo", CONTEUDO ); selenium.type( "numeroAulas", "20" ); selenium.type( "dataEmenta", "05/10/2008" ); selenium.click( "btnConfirma" ); selenium.waitForPageToLoad( _helper.TEMPO_ESPERA ); entrarEmEmenta(); selenium.click( "name=ementaListar" ); selenium.waitForPageToLoad( _helper.TEMPO_ESPERA ); assertTrue( selenium.isTextPresent( CONTEUDO ) ); } Selenium – Exemplo de Teste - TesteEmentaSelenium.java

40 Pontos a melhorar no projeto DbUnit Atualmente os parâmetros do banco de dados estão sendo carregados com o Spring. O ideal é colocar a configuração no próprio POM, informando o(s) arquivo(s) XML e operações desejadas para execução. Assim, pouparia-se tempo criando testes para novas classes. Porém, no presente trabalho foi criada uma classe JdbcDAOTest que bastando parametrizar o nome da tabela e o arquivo XML ela executa testes sobre o banco de dados, o que elimina o trabalho da reimplementação de testes do mesmo tipo. Por causa do carregamento via Spring, os testes do banco de dados funcionam corretamente quando executados pelo ambiente JUnit. Porém, executando pelo maven test, como a configuração não está no POM, ele não reconhece no processo os parâmetros do Spring, o que faz com que não consiga a conexão com o banco, dando falha no teste. Assim, para verificação atual do BD e dos DAOs, os testes são rodados usando JUnit.

41 Pontos a melhorar no projeto Exemplo de como poderia ser a configuração do DbUnit org.dbunit dbunit 2.4.5 postgresql 8.3-603.jdbc4 org.postgresql.Driver jdbc:postgresql://localhost:5432/academicNetDB postgres post pre-integration-test test-compile --> start-server operation --> CLEAN_INSERT DAOTestData.xml

42 Pontos a melhorar no projeto Selenium Atualmente os parâmetros do site, como url, porta e tempo de carregamento da página estão definidas como constantes na classe SeleniumTestHelper. Poderia-se criar esta configuração usando o próprio Spring, ou no própria configuração do POM. Observação: Com o uso do Jetty como servidor (e não do TomCat, que era o utilizado em trabalhos anteriores) foi notado em alguns momentos que era preciso executar o projeto (maven jetty:run) para iniciar o servidor e, então, iniciar os testes (maven test). Com o Tomcat, era comum se iniciar o servidor pelo próprio Eclipse e então executar os testes. Spring Usou se no projeto o Servlet padrão. Poderia ter sido utilizado o Servlet do Spring, de forma que seria dispensado a criação dos Commands, bastando fazer um mapeamento dados páginas do projeto. A implementação com Commands foi mantida por falta de tempo hábil (assim como ocorreu com os demais pontos).

43


Carregar ppt "GRUPO DATA David, André, Thiago e Alexandre WEBCOMPONENTS."

Apresentações semelhantes


Anúncios Google