4
respostas

Duvida - Efetuar teste unitario em uma tela de login e senha

Boa noite a todos, estou com uma pequena dificuldade em executar um teste unitário em uma tela de login e senha que desenvolvi... É uma tela de login e senha normal, mas ele consulta no PostgreSQL se aquele usuário e a senha existe no banco

Não faço a mínima ideia de como efetuar o teste do método logar... Essas são as duas classes criada em meu projeto!

TelaLogin.java

import controle.ControleBD;
import java.sql.*;
import javax.swing.JOptionPane;

/**
 *
 * @author titata
 */
public class TelaLogin extends javax.swing.JFrame {


    Connection conexao = null;
    PreparedStatement pst = null;
    ResultSet rs = null;

        public void logar(){

            /* A linha abaixo vai executa a instrução SQL onde vai pesquisar 
            no banco de dados o usuario e a senha */

        String sql = "select * from usuarios where login=? and senha=?";
            try {

                /* As linhas abaixo preparam a consulta ao banco de dados
                com os valores digitados nas JTextField. O "?" é substituido
                pelo conteudo das variaveis*/

                pst = conexao.prepareStatement(sql);
                pst.setString(1, txtnome.getText());
                pst.setString(2, txtsenha.getText());

                //A linha abaixo executa a query
                rs = pst.executeQuery();

                /* Se existir o usuario e a senha for verdadeiro, abre a proxima
                janela e fecha a janela de login e senha*/

                if(rs.next()){
                  TelaPrincipal principal = new TelaPrincipal();
                  principal.setVisible(true);
                  dispose();
                } else {
                    JOptionPane.showMessageDialog(null, "Usuario e/ou senha invalido!");
                }


            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, e);
            }

    }

    public TelaLogin() {
        initComponents();
        setResizable(false); //Desativando o botão maximizar da janela
        conexao = ControleBD.conector(); //Inicializando o banco

    }



    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        btn_sair = new javax.swing.JButton();
        btn_acessar = new javax.swing.JButton();
        logo_fafram = new javax.swing.JLabel();
        jLabelSenha = new javax.swing.JLabel();
        jLabelUsuario = new javax.swing.JLabel();
        txtnome = new javax.swing.JTextField();
        txtsenha = new javax.swing.JPasswordField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Tela de login e senha");
        setBackground(java.awt.Color.white);
        getContentPane().setLayout(null);

        btn_sair.setText("Sair");
        btn_sair.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn_sairActionPerformed(evt);
            }
        });
        getContentPane().add(btn_sair);
        btn_sair.setBounds(300, 260, 90, 30);

        btn_acessar.setText("Acessar");
        btn_acessar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn_acessarActionPerformed(evt);
            }
        });
        getContentPane().add(btn_acessar);
        btn_acessar.setBounds(180, 260, 90, 30);

        logo_fafram.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagens/teste.png"))); // NOI18N
        getContentPane().add(logo_fafram);
        logo_fafram.setBounds(30, 0, 521, 170);

        jLabelSenha.setFont(new java.awt.Font("Ubuntu", 1, 18)); // NOI18N
        jLabelSenha.setText("Senha:");
        getContentPane().add(jLabelSenha);
        jLabelSenha.setBounds(140, 220, 90, 20);

        jLabelUsuario.setFont(new java.awt.Font("Ubuntu", 1, 18)); // NOI18N
        jLabelUsuario.setText("Usuario:");
        getContentPane().add(jLabelUsuario);
        jLabelUsuario.setBounds(130, 180, 90, 20);
        getContentPane().add(txtnome);
        txtnome.setBounds(210, 180, 180, 30);
        getContentPane().add(txtsenha);
        txtsenha.setBounds(210, 220, 180, 28);

        setSize(new java.awt.Dimension(561, 308));
        setLocationRelativeTo(null);
    }// </editor-fold>                        


    private void btn_sairActionPerformed(java.awt.event.ActionEvent evt) {                                         

        System.exit(0); //Fechar janela

    }                                        

    private void btn_acessarActionPerformed(java.awt.event.ActionEvent evt) {                                            
        if (txtnome.getText().equals("") || txtsenha.getText().equals("")){
            JOptionPane.showMessageDialog(null, "Nome ou senha invalido!");
        } else {
            logar();

        }
    }                                           

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(TelaLogin.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(TelaLogin.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(TelaLogin.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(TelaLogin.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new TelaLogin().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton btn_acessar;
    private javax.swing.JButton btn_sair;
    private javax.swing.JLabel jLabelSenha;
    private javax.swing.JLabel jLabelUsuario;
    private javax.swing.JLabel logo_fafram;
    private javax.swing.JTextField txtnome;
    private javax.swing.JPasswordField txtsenha;
    // End of variables declaration                   
}

ControleDB.java


package controle;

import java.sql.*;
import javax.swing.JOptionPane;

public class ControleBD {
    //Metodo responsavel por estabelecer conexão com o banco!


    public static Connection conector(){

    /* Criando uma variavel conexão e atribui a ela como NULO, 
    ainda não possui conexão com o banco */
    java.sql.Connection conexao = null;

    // A linha abaixo "chamam" o driver
    String driver = "org.postgresql.Driver";
    // Armazenando informações referente o banco e informando o nome do banco
    String caminho = "jdbc:postgresql://localhost:5432/tela_login";
    // Login do seu postgresql
    String usuario = "postgres";
    // Senha do banco
    String senha = "degauss";

    //Estabelecendo a conexão com o banco!
        try {
            Class.forName(driver);
            conexao = DriverManager.getConnection(caminho, usuario, senha);
            return conexao;

    //Caso houver algum error na conexão com o banco, ele informa em uma janela o error     
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex);
            return null;
        }   


}
}
4 respostas

Bruno em um teste como o seu recomendaria a utilização de um mock para simular o retorno do seu banco de dados e os tratamentos que você fez, pesquise sobre o power mockito ou mockito eles permitem que você consiga simular eventos e retornos. Tentarei colocar um exemplo mais pratico quando chegar em casa.

Ok, estarei no aguardo... Valeus!

Alguem????

Olá Bruno,

uma das ideias dos testes de unidade é que ele seja executado rápido. O acesso ao banco de dados acaba quebrando esse requisito e faz com que o teste rode lentamente, além de necessitar de um outro componente estar funcionando (o banco de dados, no caso) para que o teste rode corretamente.

Como o Leandro disse, a prática comum é se utilizar de um objeto "dublê" (mock), que finge ser o outro componente, assim não é necessário chamá-lo de fato e tudo roda rapidamente e sem a utilização de componentes externos.

Existem vários frameworks de teste para Java, como o Mockito e o PowerMock. Para o seu problema em específico, recomendo que dê uma olhada nesse post aqui do blog da Caelum, que usa o Mockito para rodar um teste de unidade utilizando um mock de um banco de dados.

Abraço!