Usando Test Table

Tempo de leitura: menos de 1 minuto

Test-keyboard
Test!

E aí pessoal, alguém, um dia, já teve a necessidade de criar teste para uma funcionalidade ou serviço de dedução de códigos? Normalmente nesses serviços a quantidade de parâmetros a serem considerados é grande, gerando muitas combinações.

Nesse caso, um teste unitário para o serviço não é satisfatório, deixando muitos cenários descobertos, podendo gerar bugs na dedução desses códigos. Na empresa onde trabalho, isso ocorre frequentemente, sempre estamos criando serviços desse tipo.

Para aumentar a confiabilidade e qualidade do serviço, uma boa alternativa é usar Test Tables.

Numa Test Table, cada linha da planilha ou arquivo texto, torna se um cenário de teste, facilitando a escrita das tables, podendo ser escrita inclusive pelo funcional/especialista de negócio.

Como o funcional/especialista do negócio cuidará de escrever os cenário, nosso trabalho é fazer com que a aplicação entenda a Test Table,  para que os cenários escritos possam ser validados pela aplicação.

Vejamos um exemplo de uma test Table:

|modeloDof|cfop|cst|tipoOperacao|resultado|
|01|1101|01|1|101|
|01|5102|50|2|501|
|01|1101|03|1|301|
...

Nesse exemplo temos 4 parâmetros e 1 resultado, cada linha dessa tabela é um cenário.

A interface do serviço dedutor de código é a seguinte:

[code language=”java”]
interface DedutorCodigoService {
public String deduzir(String pModeloDof, String pCfop, String pCst, String pTipoOperacao);
}
[/code]

Agora vamos criar o teste para o serviço:

[code language=”java”]
public class DedutorCodigoServiceTest {
@Test
public void testDeduzirCodigo(){
final DedutorCodigoService dedutorService = new DedutorCodigoServiceImpl();
// leio o arquivo texto, e transformo-o em uma lista de strings
final File testTable = new File("/home/…/testTable.txt");
final FileInputStream inputStream = new FileInputStream(testTable);
final List linhasTestTable = IOUtils.readLines(inputStream, ISO88591);
// os erro serão adicionados nessa lista
final List<String> erros = new ArrayList<String>();
for(String linhaTxt : linhasTestTable){
final String[] linha = StringUtils.splitPreserveAllTokens(linhaTxt.substring(1, linhaTxt.length() – 1), ‘|’);

final String modeloDof = linha[0];
final String cfop = linha[1];
final String cst = linha[2];
final String tipoOperacao = linha[3];
final String resultadoEsperado = linha[3];

final String codigoDeduzido = dedutorService.deduzir(modeloDof, cfop, cst, tipoOperacao);

// caso resultado esperado seja diferente do deduzido, adiciono a linha a lista de erros
if(!codigoDeduzido.equals(resultadoEsperado){
erros.add(linhaTxt);
}
}

// se lista de erros contiver algum item, então falho o teste e exibo os erros.
if(!erros.isEmpty()){
Assert.fail("Os Seguintes cenários de teste falharam: \n" + StringUtils.join(erros,"\n"));
}
}
}
[/code]

Nesse teste utilizo da biblioteca Apache Commons, para facilitar a vida na hora de ler o arquivo .txt, e para tratamento de Strings.

A versão original desse teste, foi escrita em Groovy , e era mais extenso, pois tratava alguns Exceptions, rodava mais que uma test table e um registro fake (Nf), era criado, mas resolvi rescrever em Java e resumir para facilitar o entendimento.

Espero que tenham gostado.

Valeu pessoal.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *