Projeto Maven AcademicNet Grupo DGMR Daniel Isidoro Born Guilherme Amaral Márcio Percilio Roberto...
Transcript of Projeto Maven AcademicNet Grupo DGMR Daniel Isidoro Born Guilherme Amaral Márcio Percilio Roberto...
Projeto Maven AcademicNet Grupo DGMR
Daniel Isidoro BornGuilherme Amaral
Márcio PercilioRoberto Rutz
Implementações
• Logging• Script do banco de dados• Arquivo de propriedades com Spring DI• Testes Junit• Teste DBUnit• Teste Selenium• Spring MVC
LoggingArquivo de propriedades: log4j.properties#define o nível do logger raiz e o nome de seu appender (htmlAppender)log4j.rootLogger=INFO, htmlAppender
# define a classe do appenderlog4j.appender.htmlAppender=org.apache.log4j.RollingFileAppender
#nome do arquivo de loglog4j.appender.htmlAppender.File=logging/HTMLLayout.html
# define a classe para formação (layout)log4j.appender.htmlAppender.layout=org.apache.log4j.HTMLLayout
# define que deve ser registrada informação de contextolog4j.appender.htmlAppender.layout.LocationInfo=true
# título do arquivo de loglog4j.appender.htmlAppender.layout.Title=Log gerado pelo Log4j
LoggingEx: Arquivo MensalidadeInserir.javapackage br.com.senac.academicnet.commands;...import br.com.senac.academicnet.business.Mensalidade;import br.com.senac.academicnet.dao.FacadeDAO;import org.apache.log4j.Logger;import org.apache.log4j.PropertyConfigurator;
public class MensalidadeInserir extends AbstractCommand {
Logger logger = Logger.getLogger(MensalidadeInserir.class.getName());
@Overridepublic void processarComando(HttpServletRequest request, HttpServletResponse response, HttpServlet
servlet) {
PropertyConfigurator.configure("log4j.properties");logger.info("Obtendo parâmetros de entrada.");
int idAluno = Integer.parseInt(request.getParameter("idAluno"));String dataParcela = request.getParameter("dataParcela");String dataPagamento = request.getParameter("dataPagamento");double valor = Double.parseDouble(request.getParameter("valor"));...
}...}
LoggingEx: Arquivo de saída: HTMLLayout.html
Script do banco de dadosEx: Arquivo AcademicNetDB.sql---- PostgreSQL database dump--
-- Started on 2009-08-04 20:34:10
SET client_encoding = 'SQL_ASCII';SET standard_conforming_strings = off;SET check_function_bodies = false;SET client_min_messages = warning;SET escape_string_warning = off;...CREATE TABLE mensalidade ( id integer NOT NULL, data_parcela date NOT NULL, data_pagto date NOT NULL, valor numeric(10,2) NOT NULL, id_aluno integer);...ALTER TABLE public.mensalidade OWNER TO postgres;...REVOKE ALL ON SCHEMA public FROM PUBLIC;REVOKE ALL ON SCHEMA public FROM postgres;GRANT ALL ON SCHEMA public TO postgres;GRANT ALL ON SCHEMA public TO PUBLIC;
-- Completed on 2009-08-04 20:34:11
---- PostgreSQL database dump complete--
Arquivo de propriedades com Spring DIEx. applicationContext.xml<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">...<bean id="mensalidadeDao" class="br.com.senac.academicnet.dao.MensalidadeDAO">
<constructor-arg ref="dbConexao" /></bean>
...<bean id="dbConexao" class="br.com.senac.academicnet.util.DBConexao">
<constructor-arg ref="dbConfig" /></bean>...<bean id="dbConfig“
class="br.com.senac.academicnet.util.DBConfig"><property name="configuracao">
<props><prop key="banco.driver">org.postgresql.Driver</prop><prop
key="banco.servidor">jdbc:postgresql://localhost/academicNetDB</prop><prop key="banco.porta">5432</prop><prop key="banco.usuario">postgres</prop><prop key="banco.senha">postpost</prop>
</props></property>
</bean></beans>
Testes JUnitEx: Arquivo TestMensalidade.javapackage br.com.senac.academicnet.junit;import br.com.senac.academicnet.business.*;import org.junit.Before;import org.junit.Test;import static org.junit.Assert.*;
public class TestMensalidade {
Mensalidade m = new Mensalidade();
@Beforepublic void setUp(){
m.setDataPagamento("10/10/2009");m.setDataParcela("20/10/2009");m.setValor(-1);
}
@Testpublic void testDataPagamento(){
assertFalse("Data de Pagamento da mensalidade deve ser igual ou maior que data da parcela.", m.dataPagamentoOK() );
}
@Testpublic void testValor(){
assertFalse("Valor da mensalidade deve ser igual ou maior que zero.", m.valorOK() );}
}
Testes JUnitEx: Arquivo TestAtribuicao.javapackage br.com.senac.academicnet.junit;
import org.junit.Before;import org.junit.Test;import static org.junit.Assert.*;
import br.com.senac.academicnet.business.Atribuicao;
public class TestAtribuicao {Atribuicao a = new Atribuicao();
@Beforepublic void setUp() {
a.setUserid("abc");a.setNome("joaquim");
}
@Testpublic void testUserId() {
assertNotNull("Userid deve ser não null.", a.getUserid());assertTrue("Userid deve conter algum caractere.", a.getUserid().length() > 0);
}
@Testpublic void testNome() {assertNotNull("Nome deve ser não null.", a.getNome());assertTrue("Nome deve conter algum caractere.", a.getNome().length() > 0);
}}
Testes JUnitEx: Arquivo TestFrequencia.javapackage br.com.senac.academicnet.junit;
import org.junit.Before;import org.junit.Test;import static org.junit.Assert.*;import br.com.senac.academicnet.business.Frequencia;
public class TestFrequencia {
Frequencia frq = new Frequencia();
@Beforepublic void setUp() {
frq.setData("26/10/2009");frq.setId_aluno(1);frq.setId_turma(1);
}
@Testpublic void testData() {
assertNotNull("Data nao pode ser nula.", frq.getData());assertTrue("Data deve ser preenchida.", frq.getData().length() > 0);
}
@Testpublic void testAluno() {
assertNotNull("Aluno nao pode ser nulo.", frq.getId_aluno());assertTrue("Aluno deve ser preenchido.", frq.getId_aluno() > 0);
}
@Testpublic void testTurma() {
assertNotNull("Turma nao pode ser nula.", frq.getId_turma());assertTrue("Turma deve ser preenchida.", frq.getId_turma() > 0);
}}
Testes JUnitEx: Arquivo TestInscricao.javapackage br.com.senac.academicnet.junit;
import static org.junit.Assert.*;import org.junit.After;import org.junit.Before;import org.junit.Test;import br.com.senac.academicnet.business.Congresso;import br.com.senac.academicnet.business.Inscricao;
public class TestInscricao {
Inscricao inscricao;Congresso congresso;
@Beforepublic void setUp() throws Exception{
inscricao = new Inscricao();congresso = new Congresso();inscricao.setData("10/01/2000");inscricao.setCusto(200);congresso.setNome("Informática");congresso.setData("11/01/2000");
}
@Testpublic void testDataInscricao(){
assertTrue("A data da inscrição deve ser efetuada antes ou até a data do congresso.", inscricao.Confirmacao(congresso.getData()) );}
@Testpublic void testCustoInscricao(){
assertTrue("O custo da inscrição deve ser maior que zero.", inscricao.CustoInscricao() );}
@Afterpublic void tearDown() throws Exception
{inscricao = null;congresso = null;
}}
Testes JUnitEx: Arquivo TestUsuario.javapackage br.com.senac.academicnet.junit;
import org.junit.Before;import org.junit.Test;import static org.junit.Assert.*;
import br.com.senac.academicnet.business.Usuario;
public class TestUsuario {Usuario u = new Usuario();
@Beforepublic void setUp() {
u.setUserid("abc");u.setSenha("123456");
}
@Testpublic void testUserId() {
assertNotNull("Userid deve ser não null.", u.getUserid());assertTrue("Userid deve conter algum caractere.", u.getUserid().length() > 0);
}
@Testpublic void testSenha() {
assertNotNull("Senha deve ser não null.", u.getSenha());assertTrue("Senha deve conter algum caractere.", u.getSenha().length() > 0);
}}
Teste DBUnitEx: Arquivo TestUsuarioDAO.javapackage br.com.senac.academicnet.dbunit;import static org.junit.Assert.*;import java.io.FileInputStream;import java.io.IOException;import java.util.Properties;import org.junit.Before;import org.junit.Test;import br.com.senac.academicnet.business.Usuario;import br.com.senac.academicnet.dao.UsuarioDAO;import br.com.senac.academicnet.util.DBConexao;import br.com.senac.academicnet.util.DBConfig;
public class TestUsuarioDAO {UsuarioDAO usuarioDAO = null;
@Beforepublic void setUp() throws Exception {
Properties properties = new Properties();try {
properties.load(new FileInputStream("./dbconfig.properties"));} catch (IOException e) {
System.out.println("Arquivo dbconfig.properties não encontrado.");e.printStackTrace();System.exit(1);
}
DBConfig dbConfig = new DBConfig();dbConfig.setConfiguracao(properties);DBConexao db = DBConexao.getInstance(dbConfig);usuarioDAO = DAOTstFactory.getUsuarioDAO(db);
}
Teste DBUnitEx: Arquivo TestUsuarioDAO.java (Cont.)
@Testpublic void testIncluirUsuario() throws Exception {
Usuario u = new Usuario();u.setUserid("abcde");u.setSenha("123456");u.setPerfil("Aluno");String msg = usuarioDAO.adicionarUsuario(u);assertTrue(msg.contains("Usuário cadastrado com sucesso"));
}
@Testpublic void testAlterarUsuario() throws Exception {
Usuario u = usuarioDAO.leUsuarioPorUserid("abcde");u.setSenha("xyz123");String msg = usuarioDAO.atualizaUsuario(u);assertNull(msg);
}
@Testpublic void testExcluirUsuario() throws Exception {
Usuario u = usuarioDAO.leUsuarioPorUserid("abcde");String msg = usuarioDAO.removerUsuario(u.getId());assertNull(msg);
}}
Teste SeleniumEx: Arquivo TestUsuarioDAO.javapackage br.com.senac.academicnet.selenium;import static org.junit.Assert.assertFalse;import static org.junit.Assert.assertTrue;import org.junit.After;import org.junit.AfterClass;import org.junit.Before;import org.junit.BeforeClass;import org.junit.Test;import org.openqa.selenium.server.SeleniumServer;import com.thoughtworks.selenium.DefaultSelenium;import com.thoughtworks.selenium.Selenium;
public class MensalidadeTest {private static final String MAX_WAIT_TIME_IN_MS = "60000";private Selenium selenium = new DefaultSelenium("localhost", 4444,"*iexplore" , baseUrl());private static SeleniumServer seleniumServer;
@BeforeClasspublic static void setUpClass() throws Exception {
seleniumServer = new SeleniumServer();seleniumServer.start();
}
@Beforepublic void setUp() throws Exception {
selenium.start();selenium.windowMaximize();
}
@Afterpublic void tearDown() throws Exception {
selenium.stop();}
@AfterClasspublic static void tearDownClass() throws Exception {
seleniumServer.stop();}
Teste SeleniumEx: Arquivo TestUsuarioDAO.java (cont.)
@Testpublic void testIncluirMensalidade() {
selenium.open(baseUrl());login();selenium.click("link=Adicionar");selenium.waitForPageToLoad(MAX_WAIT_TIME_IN_MS);// Selecionar Alunoselenium.select("idAluno", "2-Maria");// Informar dados da mensalidadeselenium.type("dataParcela", "01/10/2009");selenium.type("dataPagamento", "01/10/2009");selenium.type("valor", "200.0");// Inserir mensalidadeselenium.click("btnInserir");selenium.waitForPageToLoad(MAX_WAIT_TIME_IN_MS);assertTrue(selenium.isTextPresent("Mensalidade Cadastrada com Sucesso"));
} @Test public void testAlterarMensalidade() {
selenium.open(baseUrl());login();selenium.click("link=Consultar");// Selecionar Alunoselenium.select("idAluno", "2-Maria");selenium.click("btnSelecionar");selenium.waitForPageToLoad(MAX_WAIT_TIME_IN_MS);assertFalse(selenium.isTextPresent(" Não existe mensalidade para o aluno selecionado"));selenium.click("link=Alterar");selenium.waitForPageToLoad(MAX_WAIT_TIME_IN_MS);// Informar novos dados da mensalidadeselenium.type("dataPagamento", "01/11/2009");selenium.type("valor", "300.0");// Alterar mensalidadeselenium.click("btnAlterar");selenium.waitForPageToLoad(MAX_WAIT_TIME_IN_MS);assertTrue(selenium.isTextPresent("2-Maria"));assertTrue(selenium.isTextPresent("300.0"));
}
Teste SeleniumEx: Arquivo TestUsuarioDAO.java (cont.)
@Testpublic void testExcluirMensalidade() {
selenium.open(baseUrl());login();selenium.click("link=Consultar");// Selecionar Alunoselenium.select("idAluno", "2-Maria");selenium.click("btnSelecionar");selenium.waitForPageToLoad(MAX_WAIT_TIME_IN_MS);assertFalse(selenium.isTextPresent(" Não existe mensalidade para o aluno selecionado"));selenium.click("link=Excluir");selenium.waitForPageToLoad(MAX_WAIT_TIME_IN_MS);assertTrue(selenium.isTextPresent("2-Maria"));assertFalse(selenium.isTextPresent("300.0"));
}
public String baseUrl(){
return "http://localhost:8080/AcademicNetWar-DGMR/login.jsp"; }
public void login(){
selenium.type("username", "admin");selenium.type("password", "admin");selenium.click("btnEnviar");selenium.waitForPageToLoad(MAX_WAIT_TIME_IN_MS);selenium.click("link=Mensalidades");selenium.waitForPageToLoad(MAX_WAIT_TIME_IN_MS);
}}
Spring MVCEx: Arquivo DGMRServlet-servlet.xml<?xml version="1.0" encoding="UTF-8"?><beans xmlns=http://www.springframework.org/schema/beans xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
....
<bean name="/mensalidadeInserir.htm"class="br.com.senac.academicnet.controllers.MensalidadeInserirController"><property name="mensalidadeDAO">
<ref bean="mensalidadeDao"/></property><property name="dao">
<ref bean="alunoDao"/></property>
</bean>...
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basename"><value>messages</value></property>
</bean>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass"><value>org.springframework.web.servlet.view.JstlView</value></property>
<property name="prefix"><value>/</value></property><property name="suffix"><value>.jsp</value></property>
</bean>...<bean id="mensalidadeDao" class="br.com.senac.academicnet.dao.MensalidadeDAO">
<constructor-arg ref="dbConexao" /></bean><bean id="dbConexao" class="br.com.senac.academicnet.util.DBConexao">
<constructor-arg ref="dbConfig" /></bean><bean id="dbConfig"
class="br.com.senac.academicnet.util.DBConfig"><property name="configuracao">
<props><prop key="banco.driver">org.postgresql.Driver</prop><prop key="banco.servidor">jdbc:postgresql://localhost/AcademicNetDB</prop><prop key="banco.porta">5432</prop><prop key="banco.usuario">postgres</prop><prop key="banco.senha">post</prop>
</props></property>
</bean></beans>
Spring MVCEx: Arquivo MensalidadeInserirController.javapackage br.com.senac.academicnet.controllers;
import java.util.ArrayList;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.util.Map;import java.util.HashMap;import br.com.senac.academicnet.business.Mensalidade;import br.com.senac.academicnet.dao.AlunoDAO;import br.com.senac.academicnet.dao.MensalidadeDAO;import org.apache.log4j.Logger;import org.apache.log4j.PropertyConfigurator;import org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.mvc.AbstractController;
public class MensalidadeInserirController extends AbstractController{private Logger logger = Logger.getLogger(MensalidadeInserirController.class.getName());private MensalidadeDAO mensalidadeDAO;private AlunoDAO dao;
public void setMensalidadeDAO(MensalidadeDAO dao){this.mensalidadeDAO = dao;
}public void setDao(AlunoDAO dao){
this.dao = dao;}@Override@SuppressWarnings("unchecked")protected ModelAndView handleRequestInternal(HttpServletRequest request,
HttpServletResponse response) throws Exception {PropertyConfigurator.configure("log4j.properties");
// Recuperando parâmetros de entradalogger.info("Obtendo parâmetros de entrada.");int idAluno = Integer.parseInt(request.getParameter("idAluno"));String dataParcela = request.getParameter("dataParcela");String dataPagamento = request.getParameter("dataPagamento");double valor = Double.parseDouble(request.getParameter("valor"));
Spring MVCEx: Arquivo MensalidadeInserirController.java (Cont.)
// Criação de um objeto Mensalidadelogger.info("Criando um objeto Mensalidade.");Mensalidade m = new Mensalidade();m.setDataPagamento(dataPagamento);m.setDataParcela(dataParcela);m.setValor(valor);m.setIdAluno(idAluno);
logger.info("Inserindo um objeto mensalidade na tabela.");String msg = mensalidadeDAO.inserir(m);
logger.info("Recuperando a lista de alunos da tabela.");ArrayList lista = dao.listar();
logger.info("Salvando os parâmetros no HashMap");Map modelo = new HashMap();modelo.put("msg", msg);modelo.put("lista", lista);logger.info("Direcionando para a janela Inserir Mensalidade (Visão)");ModelAndView mav = new ModelAndView("mensalidadeInserir", "modelo", modelo);return mav;
}}
Spring MVCEx: Arquivo mensalidadeInserir.jsp<%@include file="_header.jsp" %>
<h1 id="title">Inserir Mensalidade por Aluno</h1><hr/>
<form action="mensalidadeInserir.htm" method="get" name="form" onsubmit="return ValidaInsercao()"><input type="hidden" name="comando" value="MensalidadeInserir" /><table width="80%" border="1" bordercolor="#000000" cellpadding="2" cellspacing="2" style="border-collapse:collapse;font-size:9pt"> <tr> <td>Selecione o aluno:</td> <td>
<select name="idAluno"><c:forEach var="alu" items="${modelo.lista}">
<option value=${alu.id}>${alu.matricula}-${alu.nome}</option></c:forEach>
</select> </td> </tr> <tr> <td>Data da Parcela:</td>
<td><input type="text" name="dataParcela" size="9" maxlength="10" onkeypress="txtBoxFormat(document.form, 'dataParcela', '99/99/9999', event); return SomenteNumero(event)" onblur="verificar_data(this)" title="Formato: dd/mm/aaaa" /></td>
</tr> <tr> <td>Data do Pagamento:</td>
<td><input type="text" name="dataPagamento" size="9" maxlength="10" onkeypress="txtBoxFormat(document.form, 'dataPagamento', '99/99/9999', event); return SomenteNumero(event)" onblur="verificar_data(this)" title="Formato: dd/mm/aaaa" /></td>
</tr> <tr> <td>Valor:</td>
<td><input type="text" name="valor" size="10" maxlength="10" onKeyPress="return(currencyFormat(this,'','.',event))" /></td> </tr> <tr> <td colspan="2"><input type="submit" value="Inserir" id="btnInserir" /></td> </tr></table>
</form>
<c:if test="${modelo.msg != null}"><hr/><h3> <c:out value="${modelo.msg}" /> </h3></c:if><%@include file="_footer.jsp" %>