Versão ALPHA! Este artigo está em versão 'Alpha' e, portanto, não foi ainda revisado corretamente

Implementando Cache: Testes

Introdução

O que é um cache?

É uma área de armazenamento onde dados ou processos frequentemente utilizados é guardado, para um acesso mais rápido no futuro. Por exemplo, ao entrar em um site pela primeira vez leva-se mais tempo do que nas demais vezes, isso se deve por que na primeira vez é necessário baixar a estrutura básica das páginas, planos de fundo, principais links e diversos outros dados. O cache já armazena este tipo de estrutura, e quando de se entra em um site já visitado os dados são carregados à partir do cache, deixando a navegação mais rápida.

Antes de iniciar

Antes de se fazer um cache, é necessário criar e implementar um buscador, uma vez que, o buscador é utilizado na implementação do cache.

Acesso Rápido

Siga o checklist abaixo: <table class="table table-bordered">

Passo a passo help! Procedimentos help! Criação do teste de cache help!

</table>

Passo a passo

Ao criar o teste:
1. Necessário verificar se está no diretório correto src/test/java.
2. Se está no pacote desejado, para este exemplo foi criado a classe de teste dentro do pacote br.com.objectos.dojo.asilva.

Procedimentos

Escolha do buscador que será implementado o cache.

Apesar do cache aumentar o desempenho na busca de dados, não podemos implementá-lo em todos os buscadores, pois somente as informações que são acessadas frequentemente devem ser armazenadas no cache. No exemplo será criado um cache para de funcionário, e o buscador que será utilizado é o BuscarFuncionario.

IMPORTANTE: A implementação de buscadores que não estão diretamente ligados com o cache faz com que o sistema perca desempenho, já que ele estará armazenando dados que não serão utilizados. Por isso ATENÇÃO MÁXIMA na hora de escolher qual o buscador será utilizado na implementação.

Criação do teste de cache

Primeiramente será criado a classe:

public class TesteDeCacheDeFuncionario {
}

Para criação de um teste de cache pode-se copiar o teste de buscar (desde que o teste de buscar esteja certo) e fazer algumas alterações, como:

  • Colocar as anotações @Test e @Guice com o módulo corresponde ao projeto em que se encontra, se caso não souber qual módulo utilizar, basta abrir um teste qualquer dentro do mesmo projeto;

OBS:. A declaração @Guice bem como o módulo informa ao TestNG qual o módulo que deve ser utilizado para o teste.

  @Test
  @Guice(modules = { DeprecatedModuloDeTesteObjectosDojo.class })
   public class TesteDeCacheDeFuncionario {
   }
  • Modificar o nome da interface Buscar, para Cache, ao copiar certifique-se que em cima da declaração da interface possui a anotação @Inject, pois sem ela o teste não irá funcionar;

    @Inject
    private CacheDeFuncionario cache;

  • Modificar o nome da instância para cache;

Irá aparecer um erro pois a Interface Cache ainda não existe, para resolver isso basta selecionar o cache, apertar Ctrl+1, escolher interface, em seguida abrirá uma janela para confirmação do diretório e pacote onde será salvo a interface, como o diretório é o de teste, será necessário modificá-lo para o diretório de produção, para isso basta apertar Alt+O e em seguida apertar a seta para cima duas vezes e finalizar.

Após a criação da interface voltar ao teste apertando Ctrl+F6, onde haverá um erro de compilação devido a não existência do método cache.porId(), ao apertar Ctrl+1 em cima deste erro, será sugerido que se crie o método na interface.

Optional<Funcionario> porId(int id);

Como o resultado deste teste trará apenas um resultado, na criação do método na interface será necessário mudar a assinatura para optional.

Alterar o teste para que seja retornado o um Optional. O teste de cache será um pouco diferente, a questão de utilizar o optinal se faz pelo fato dele fazer um tratamento para quando não há retorno na busca, se por acaso não tivesse a informação e não fosse utilizado o Optional daria um erro no teste de NullPointerException. O Optional faz um tratamento para valores ausentes, de forma que não retorna um erro.

Note que há uma diferença em relação ao método do TesteDeBuscarFuncionario, para o TesteDeCacheDeFuncionario.

TesteDeBuscar:

  public void busca_por_id() {
    Funcionario funcionario = FuncionariosFalso.FUNCIONARIO_1;
    String prova = new FuncionarioToString().apply(funcionario);

    Integer id = funcionario.getId();
    Funcionario pojo = buscarFuncionario .porId(id);
    String res = new FuncionarioToString().apply(pojo);

    assertThat(res, equalTo(prova));
  }

TesteDeCache:

  public void por_id() {
    Funcionario funcionario = FuncionariosFalso.FUNCIONARIO_1;
    String prova = new FuncionarioToString().apply(funcionario);

    Integer id = funcionario.getId();
    Optional<Funcionario> optional = cache.porId(id);
    Funcionario optional = cache.porId(id);
    Funcionario pojo = optional.get();
    String res = new FuncionarioToString().apply(pojo);

    assertThat(res, equalTo(prova));
  }

OBS.: O método ToString utilizado no cache é o mesmo utilizado no buscador, logo não precisará criá-lo de novo.

Para finalizar, será implementado o um exemplo de um teste que retorna uma lista, que é utilizado quando o resultado da busca traz mais de um elemento.

O teste que iremos implementar é o busca_lista_por_superior.

  public void lista_por_superior() {
    List<Funcionario> contra = FuncionariosFalso.getTodos();
    List<String> prova = transform(contra, new FuncionarioToString());

    Funcionario funcionario = FuncionariosFalso.FUNCIONARIO_1;
    Superior superior = funcionario.getSuperior();
    List<Funcionario> list = cache.porSuperior(superior);
    List<String> res = transform(list, new FuncionarioToString());

    assertThat(res.size(), equalTo(2));
    assertThat(res, equalTo(prova));
  }

Irá aparecer um erro de compilação por que o método ainda não existe na interface, para criá-lo, novamente aperte Ctrl+1, e em seguida ENTER.

Se for comparar o TesteDeCacheDeFuncionario com o TesteDeBuscarFuncionario, irá perceber que são bem parecidos, somente com a alteração buscarFuncionario no lugar do cache.

  public void busca_lista_por_superior() {
    List<Funcionario> contra = FuncionariosFalso.getTodos();
    List<String> prova = transform(contra, new FuncionarioToString());

    Funcionario funcionario = FuncionariosFalso.FUNCIONARIO_1;
    Superior superior = funcionario.getSuperior();
    List<Funcionario> list = buscarFuncionario.porSuperior(superior);
    List<String> res = transform(list, new FuncionarioToString());

    assertThat(res.size(), equalTo(2));
    assertThat(res, equalTo(prova));
  }

 
 

objectos, Fábrica de Software LTDA

  • R. Demóstenes, 627. cj 123
  • 04614-013 - Campo Belo
  • São Paulo - SP - Brasil
  • +55 11 5093-8640
  • +55 11 2359-8699
  • contato@objectos.com.br