• Nenhum resultado encontrado

Aula 21 Testes 3

N/A
N/A
Protected

Academic year: 2022

Share "Aula 21 Testes 3"

Copied!
30
0
0

Texto

(1)

Aula 21 Testes 3

Alessandro Garcia LES/DI/PUC-Rio

2019

(2)

Especificação

• Objetivo dessa aula

– Apresentar 1 critério de seleção de casos de teste caixa aberta:

cobertura de caminhos

• Referência básica:

– Capítulo 15

• Slides adaptados de: Staa, A.v. Notas de Aula em

Programacao Modular; 2008.

(3)

Sumário

• Critério de cobertura de caminhos

• Transformação de casos de teste abstratos em casos de teste úteis

• Instrumento de medição de cobertura

(4)

Cobertura de caminhos

• Um caminho (arco de execução) corresponde a uma seqüência de execução de comandos dentro de um programa

– muitas vezes é restrito ao corpo de uma função

• Depende de

– seleções realizadas (if, switch, throw / catch)

– número de iterações de repetições e de chamadas recursivas – formas de terminar (break, return, throw)

• Um programa que contém repetições admite, de maneira

geral, um número infinito de caminhos

(5)

Cobertura de caminhos: exemplos de caminhos

Intercalar arquivos

Abrir arquivos

Efetuar a

intercalação Fechar

arquivos

Ler 1o. reg de A Ler 1o. reg de B

Intercalar pares regs correntes

Transferir reg Transferir regs

de A para E Transferir reg

{RegA.Chave < RegB.Chave} {RegA.Chave == RegB.Chave} {RegA.Chave > RegB.Chave}

{ enquanto

RegA.Chave < máximo ou RegB.Chave < máximo }

H F C 2

A

B

I D

G E

Caminho:

ABCEFGFIFHD

(6)

Cobertura de caminhos

• O critério cobertura de caminhos seleciona um conjunto de caminhos

– cada caminho é um caso de teste abstrato

– os dados devem ser escolhidos para que se execute exatamente o caminho escolhido

– o conjunto de caminhos forma a massa de testes

• Para manter pequeno o custo do teste deseja-se

– um conjunto pequeno de caminhos curtos – o conjunto de caminhos deve

ser completo  exercitar todo o código

simular a argumentação da corretude auxiliar a argumentação da corretude

utilizar a estrutura do código

(7)

Cobertura de caminhos

• Calcula-se a expressão algébrica dos caminhos do procedimento.

– em um programa estruturado será sempre uma expressão regular

– caminha-se na estrutura do código do início para o fim (se projeto estruturado: em ordem prefixada pela esquerda) – externa-se o rótulo do bloco visitado

– se o bloco for início de controle de repetição externa-se ‘[’

calcula-se o arrasto e externa-se o valor arrasto + 1

ao terminar o controle de repetição e o bloco externa-se ‘]’

– se for início de controle de seleção externa-se ‘(’

ao atingir um else ou else if externa-se ‘|’

ao terminar o controle de repetição externa-se ‘)’

(8)

Cobertura de caminhos

// (A) Intercalar arquivos // (B) Abrir arquivos // (E) Inicializar

// Ler primeiro registro de arquivo A // Ler primeiro registro de arquivo B // (C 2) Intercalar pares de registros

while ( tem registro a processar )

// (G) Transferir registro de A para S

if ( chave buffer A < chave buffer B )

transferir de buffer A para S // (H) Transferir registro de A e B para D

else if ( chave buffer A ==

chave buffer B )

transferir registro de A para D transferir registro de B para D // (I) Transferir registro de B para S

else

transferir de buffer B para S // (D) Fechar arquivos

Expressão de caminhos

A ABE ABEC[3 ABEC[3(G ABEC[3(G|H|I ABEC[3(G|H|I)]D

(9)

Cobertura de caminhos

Expressão de caminhos

AB ABCE ABCE[3F ABCE[3F(G

ABCE[3F(G|H|I)]D

Intercalar arquivos

Abrir arquivos

Efetuar a

intercalação Fechar

arquivos

Ler 1o. reg de A Ler 1o. reg de B

Intercalar pares regs correntes

Transferir reg de A para S

Transferir regs de A para E e de B para E

Transferir reg de B para S

{RegA.Chave < RegB.Chave} {RegA.Chave == RegB.Chave} {RegA.Chave > RegB.Chave}

{ enquanto

RegA.Chave < máximo ou RegB.Chave < máximo }

H F C 2

A

B

I D

G E

(10)

Cobertura de caminhos

• A B C E [

3

F ( G | H | I ) ] D

• Cria-se a lista dos caminhos a testar, usando a expressão como gerador ➔ casos de teste abstratos

0 ciclos (caminhos dos casos especiais)

ABCED

1 ciclo (caminhos da base da indução)

ABCEFGD

ABCEFHD

ABCEFID

3 (== arrasto + 1) ciclos (caminhos do passo de indução)

ABCEFGFGFGD

ABCEFGFGFHD

ABCEFGFGFID

ABCEFGFHFGD

ABCEFGFHFHD

ABCEFGFHFID

. . .

(11)

Cobertura de caminhos: problema

• O número de casos de teste gerados para um determinado algoritmo cresce multiplicativamente em função do número de alternativas em controles (if, while) aninhados ➔ O n

k

• No caso da intercalação:

– 0 iterações ➔ 1 caso 1 – 1 iteração ➔ 3 casos 3

– 3 iterações ➔ 3 * 3 casos 27 total 31 casos

• Solução que em geral dá certo

– particionar os aninhamentos criando diversas funções

 

 

 = es numControl

i

i ole tivasContr numAlterna

1

]

O [

da ordem de

(12)

Transformação em caso de teste úteis

Especificação

Artefato

Casos de teste abstratos Gerar casos

de teste

Determinar significados

Casos de teste semânticos

Selecionar dados e

ações

Casos de teste valorados

Massa de teste Determinar

resultados esperados Padrões

Critério de seleção

Critério de valoração

Determinar critério de

seleção

(13)

Transformação em caso de teste úteis

• Casos de teste abstratos estabelecem as condições a serem satisfeitas pelos casos de teste. Exemplo os caminhos:

– ABCED – ABCEFGD – ABCEFHD – ABCEFID

– ABCEFGFGFGD – ABCEFGFGFHD – ABCEFGFGFID – ABCEFGFHFGD – ABCEFGFHFHD – ABCEFGFHFID – . . .

(14)

Transformação em caso de teste úteis

• Casos de teste semânticos determinam o significado das condições a serem satisfeitas pelos casos de teste

ABCED

Arq A vazio, Arq B vazio ABCEFGD

Arq A com 1, Arq B vazio ABCEFHD

Arq A com 1, Arq B com 1 e chaves de ambos iguais ABCEFID

Arq A vazio, Arq B com 1 ABCEFGFGFGD

Arq A com 3, Arq B vazio ABCEFGFGFHD

Arq A com 3, Arq B com 1, chave em B igual à chave do 3º. em A . . .

(15)

Transformação em caso de teste úteis

• Casos de teste valorados determinam os valores e coman- dos a serem utilizados como dados dos casos de teste

– Criar arquivos A0 = {}, B0 = {}, A1 = { c1 }, B11 = { c1 } , A3 = { c1 , c2 , c3 } , B12 = { c3 } , . . .

– Arq A vazio, Arq B vazio = A0 , B0 – Arq A com 1, Arq B vazio = A1 , B0

– Arq A com 1, Arq B com 1 e chaves de ambos iguais

= A1 , B11 – Arq A vazio, Arq B com 1 = A0 , B11 – Arq A com 3, Arq B vazio = A3 , B0

– Arq A com 3, Arq B com 1, chave em B igual à chave do 3º.

de A = A3 , B12

(16)

Transformação em caso de teste úteis

• Casos de teste úteis estabelecem os resultados esperados em função dos dados

– Criar arquivos S0 = {} , E0 = {} , S1 = { c1 } ,

E11 = { c1 , c1 } , S2 = { c1 , c2 } , S3 = { c1 , c2 , c3 } , E12 = { c3 , c3 } , . . .

– A0 , B0 ➔ S0 , E0 – A1 , B0 ➔ S1 , E0 – A1 , B11 ➔ S0 , E11 – A0 , B11 ➔ S1 , E0 – A3 , B0 ➔ S3 , E0 – A3 , B12 ➔ S2 , E12 – . . .

(17)

Transformação em caso de teste úteis

• Dica para automação

– criar todos os arquivos requeridos

– criar um programa de teste específico que

para cada caso de teste recebe linhas com os nomes dos 4 arquivos

executa a intercalação com os dois primeiros arquivos

compara os arquivos resultantes com os dois últimos

– o programa de intercalação pode ser implementado como uma função que recebe quatro parâmetros

neste caso pode-se utilizar o arcabouço de apoio ao teste

– o programa de intercalação pode ser implementado como um programa principal recebendo 4 parâmetros da linha de comando

neste caso pode-se implementar um batch (.bat)

(18)

Exemplo de roteiro de teste

• Um roteiro de teste estabelece um cenário de teste e

fornece uma série de instruções a serem utilizadas durante os testes manuais ou automatizados:

== Intercalar A e B vazios

=intercalar A0 B0 S0 E0

== Intercalar A contendo 1 registro com B vazio

=intercalar A1 B0 S1 E0

== Intercalar A e B contendo 1 registro, chaves iguais

=intercalar A1 B11 S0 E11

== Intercalar A vazio com B contendo 1 registro

=intercalar B0 A1 S1 E0 . . .

(19)

Instrumentação de medição

• Como saber se um módulo foi testado de forma adequada?

– Uma possível forma: medir a cobertura do código exercitado no conjunto de todos os testes

• O arcabouço de apoio ao teste disponibiliza um módulo para a contagem de passagens CONTA e um interpretador de

comandos de teste de contagem INTRPCNT

• Modo de uso

– devem ser inseridos contadores de passagem no módulo a ser medido (mark up)

– cada vez que a execução passa por um contador, ele é incrementado de um

– ao final verifica-se o estado dos contadores

• Esta função deverá ser inserida em um ou mais pontos do

(20)

Exemplo: medição de cobertura de testes

ARV_tpCondRet ARV_InserirEsquerda( void * ValorParm ) {

tpNoArvore * pCorr ; tpNoArvore * pNo ;

CNT_CONTAR( "Inserir no a esquerda do corrente" ) ; if ( pArvore->pRaiz == NULL )

{

CNT_CONTAR( "Inserir a esquerda em arvore vazia" ) ; return CriarNoRaiz( ValorParm ) ;

}

CNT_CONTAR( "Inserir a esquerda em arvore nao vazia" ) ; pCorr = pArvore->pNoCorr ;

if ( pCorr->pNoEsq == NULL ) {

CNT_CONTAR( "Efetuar a insercao a esquerda" ) ; pNo = CriarNo( ValorParm ) ;

assert( pNo != NULL ) ; pNo->pNoPai = pCorr ; pCorr->pNoEsq = pNo ; pArvore->pNoCorr = pNo ; return ARV_CondRetOK ; } /* if */

CNT_CONTAR( "Nao e folha a esquerda" ) ; return ARV_CondRetNaoFolha ;

} /* Fim função: ARV Adicionar filho à esquerda */

(21)

Exemplo: medição de cobertura de arestas

ARV_tpCondRet ARV_InserirEsquerda( void * ValorParm ) {

tpNoArvore * pCorr ; tpNoArvore * pNo ;

CNT_CONTAR( "Inserir no a esquerda do corrente" ) ; if ( pArvore->pRaiz == NULL )

{

CNT_CONTAR( "Inserir a esquerda em arvore vazia" ) ; return CriarNoRaiz( ValorParm ) ;

}

CNT_CONTAR( "Inserir a esquerda em arvore nao vazia" ) ; pCorr = pArvore->pNoCorr ;

if ( pCorr->pNoEsq == NULL ) {

CNT_CONTAR( "Efetuar a insercao a esquerda" ) ; pNo = CriarNo( ValorParm ) ;

assert( pNo != NULL ) ; pNo->pNoPai = pCorr ; pCorr->pNoEsq = pNo ; pArvore->pNoCorr = pNo ; return ARV_CondRetOK ; } /* if */

CNT_CONTAR( "Nao e folha a esquerda" ) ;

(22)

Contadores: medição da cobertura de testes

• Se, após a execução de todos os casos de teste sobrar

algum contador com valor igual a zero, o respectivo ponto (CNT_CONTA) nunca foi executado, o teste foi insuficiente

• Contadores têm nomes simbólicos ➔ strings

• Contadores utilizados na função ARV_InserirEsquerda

"Inserir no a esquerda do corrente"

"Inserir a esquerda em arvore vazia"

"Inserir a esquerda em arvore nao vazia"

"Efetuar a insercao a esquerda"

"Nao e folha a esquerda"

• Os contadores precisam ser fornecidos antes de medir para

que possamos determinar se algum deles não foi percorrido

no conjunto de todos os testes

(23)

Contadores: medição da cobertura de testes

• No arcabouço, contadores podem ser:

– contador normal: inicializado para 0 – contador opcional: inicializado para –1

exemplo de uso: fragmentos de código de baixo risco

– contador proibido: inicializado para –2

código “impossível” de ser exercitado

• Se, após a execução de todos os casos de teste sobrar

algum contador com valor igual a zero, o respectivo ponto

(CNT_CONTA) nunca foi executado, o teste foi insuficiente

(24)

Contadores: medição da cobertura de testes

• O esquema de contagem deve ser escolhido em acordo com o objetivo do teste, exemplos:

– contar a ativação de cada função

inserir contador antes de cada chamada de função

– contar cada chamada de função

inserir contador em cada início de função

– contar a passagem por todas as arestas de execução

exemplo a ser mostrado

– contar cada condição de retorno

inserir contador antes de cada retorno

(25)

Contadores: controle de caminho

Programa: Intercalar arquivos

while ( ( Arq_A.Buffer.chave < MAX )

&& ( Arq_B.Buffer.chave < MAX )) {

CONTAR( "repete" ) ;

if ( Arq_A.Buffer.chave == Arq_B.Buffer.chave ) {

CONTAR( "chaves iguais" ) ;

TransferirRegistro( &Arq_A , Arq_D ) ; TransferirRegistro( &Arq_B , Arq_D ) ;

} else if ( Arq_A.Buffer.chave < Arq_B.Buffer.chave ) {

CONTAR( "chave Arq_A menor" ) ;

TransferirRegistro( &Arq_A , Arq_S ) ; } else

{

CONTAR( "chave Arq_B menor" ) ;

TransferirRegistro( &Arq_B , Arq_S ) ; }

(26)

Contadores: controle de caminho

== Teste intercalar arquivos vazios

=zerartodoscontadores

=intercala Vazio Vazio Vazio Vazio

=contagemcontador "repete" 0

=contagemcontador "chaves iguais" 0

=contagemcontador "chave Arq_A menor" 0

=contagemcontador "chave Arq_B menor" 0

== Teste intercalar A com dois, B com 1, 1o. A == 1o. B

=zerartodoscontadores

=intercala Com-1-5 Com-1 1 5

=contagemcontador "repete" 2

=contagemcontador "chaves iguais" 1

=contagemcontador "chave Arq_A menor" 1

=contagemcontador "chave Arq_B menor" 0

(27)

Contadores: comandos de teste

=inicializarcontadores <nome arquivo contadores acumulado>

=terminarcontadores

=registraracumulador <nome arquivo contadores acumulado>

=lercontadores <nome arquivo contadores>

=gravarcontadores <nome arquivo contadores acumulado>

=zerartodoscontadores

=zerarcontador <nome do contador>

=iniciarcontagem

=pararcontagem

=verificarcontagens <número de contadores == 0 esperado>

=contagemcontador <nome do contador> <número esperado>

=exibircontagem <nome do contador>

(28)

Contadores: arquivo de contadores

////////////////////////////////////////////////

//

// Exemplo de arquivo de declaração de contadores // Conta módulo Arvore marcado

//

///////////////////////////////////////////////

ARV_InserirEsquerda ARV_InserirDireita ARV_CriarArvore ARV_DestruirArvore ARV_IrPai

ARV_IrNoEsquerda ARV_IrNoDireita ARV_ObterValorCorr

(29)

Contadores: esquema de uso

== Iniciar contagem

=inicializarcontadores ""

=lercontadores "exemplo-conta-arv"

=iniciarcontagem realizar o teste

== Terminar contagem

=pararcontagem

=verificarcontagens 0

== Finalizar

=terminarcontadores

(30)

FIM

Referências

Documentos relacionados

Curvas de rarefação (Coleman) estimadas para amostragens de espécies de morcegos em três ambientes separadamente (A) e agrupados (B), no Parque Estadual da Ilha do Cardoso,

A Tabela 6 identifica as categorias de CI mais empregadas nos estudos investigados. Percebe-se que as categorias empregadas referem-se a categorias que mesclam a

autoincriminação”, designadamente através da indicação de exemplos paradigmáticos. Sem prejuízo da relevância da matéria – traduzida, desde logo, no número e

Tendo em vista todo contexto positivo que as aulas práticas laboratoriais causam no processo de aprendizagem e das muitas dificuldades encontradas para suas

M ux 0 1 Add PC 0 Write data M ux 1 Registers Read data 1 Read data 2 Read register 1 Read register 2 16 Sign extend Write register Write data Read data 1 ALU result M ux ALU Zero

O produto a ser ofertado pela MultiFit Gourmet será um tipo de alimentação voltada para pessoas que fazem musculação, que precisam se alimentar de maneira

Médio Normal Produzidos por linhas de energia, transformadores e outros equipamentos de frequência industrial e suas harmônicas 19 Influências Eletromagnéticas,

O estudo contribuiu com a descrição dos atos comportamentais executados por operária de Atta quando estas são submetidas a odores atrativos e repelentes,