terça-feira, 18 de setembro de 2007

Preparando o Terreno para o Selenium

A importância da realização dos testes em um sistema não é motivo de discussão, mas sem o apoio de ferramenta para automatizar esses testes, essa atividade pode tornar-se um verdadeiro calvário. Ainda mais se houver a necessidade que essa execução ocorra várias vezes ao longo do cilo de vida da aplicação.

Se pensarmos de forma simplista temos duas abordagens para testes:
1 - Dada uma entrada, existe uma saída esperada
2 - Dada uma entrada, observar como será o comportamento do sistema

Nos prendamos a primeira abordagem.

O princípio básico dos testes unitários com o junit se dá através de afirmações (assertions), ou seja, você programa várias afirmações para suas classes através de seus métodos: "dado duas entradas 1 e 1, é esperado que a soma seja 2" e assim por diante.

O Selenium usa esse mesmo princípio realizando testes em função dos resultados respondidos pelo sistema, com o seguinte tempero: Os testes dizem respeito ao sistema como um todo - tipicamente são testes funcionais. Um simples navegar de telas pode reprentar a realização de um cálculo complexo. E é justamente neste ponto que precisamos ter atenção.

Vamos a um exemplo simples: Uma calculadora de Horas extras para profissionais CLT. Dado um volume de horas trabalhadas e seu salário, a calculadora responde quanto você deve receber. Para este simples exemplo temos alguns cenários possíveis:

a) As horas trabalhadas foram durante a semana;
b) As horas trabalhadas foram num feriado;
c) As horas trabalhadas foram de um dia até o outro.

Esse tipo de cálculo prevê uma série de adicionais que devem incidir sobre o cálculo de suas horas, de modo que para este exemplo simples os dados existentes para o sistema acabam ganhando uma importância grande.

Num sistema de maior complexidade o conhecimento prévio desses dados ganha um nível a mais. Dessa forma é muito importante que tenhamos conhecimento prévio dessa massa de dados para os casos de testes que serão executados principalmente porque, dado o automatismo, a possibilidade de repetição é fundamental para um boa produtividade na criação de códigos com qualidade.

Seguindo o princípio K.I.S.S. (Keep It Stupidly Simple), podemos criar facilmente uma classe que carregue o banco de dados a partir de um arquivo .SQL onde cada linha tem um comando SQL:



public class CarregaMassaDados {
   public static void cargaDados(String arquivoSql) {
      String stm = "";
      BufferedReader in = null;
      Connection connection = null;
      Statement stmt = null;
      if ((arquivoSql == null) ("".equals(arquivoSql))) {
         throw new RuntimeException("O Parâmetro arquivoSql deve ser informado");
      }
      try {
         Class.forName("org.postgresql.jdbc3.Jdbc3ConnectionPool");
         connection =
            DriverManager.getConnection(
            "jdbc:postgresql://127.0.0.1:5432/BDAplicacao",
            "LOGIN",
            "SENHA");
         in = new BufferedReader(new FileReader(arquivoSql));
         stmt = connection.createStatement();
         String sql;
         while ((sql = in.readLine()) != null) {
            stmt.executeUpdate(sql);
         }
      } catch (ClassNotFoundException e) {
         throw new RuntimeException("Database driver não encontrado.");
      } catch (SQLException e) {
         throw new RuntimeException("Database não conectado.");
      } catch (IOException e) {
         throw new RuntimeException("Impossivel ler o arquivo.");
      } finally {
         try {
            if (in != null) in.close();
            if (stmt != null) stmt.close();
            if (connection != null) connection.close();
         } catch (IOException e) {
            throw new RuntimeException("Impossivel ler o arquivo.");
         } catch (SQLException e) {
            throw new RuntimeException("Database não conectado.");
         }
      }
   }
}

A chamada a carga de dados pode ser colocada no início dos seus testes, permitindo que a sua massa de dados seja conhecida garantido assim a repetividade de seus testes.

Abraços.

Nenhum comentário: