SlideShare une entreprise Scribd logo
1  sur  29
Testes de Software
Prof. Rodrigo de Barros Paes
rodrigo@ic.ufal.br
Testes aleatórios
rodrigo@ic.ufal.br 2
Como funciona?
o Basicamente é um teste que utiliza algum tipo de gerador de
números (pseudo) aleatórios para gerar os casos de teste
rodrigo@ic.ufal.br 3
Gerador de números
pseudo aleatórios
Gerador de casos de
teste aleatórios
seed Conhecimento
do domínio
Software sob teste Oráculo
Read
• Lê nbytes e coloca em buf
• Retorna a quantidade de
bytes lida
• -1 caso algo dê errado
• 0 end of file
• Pode retornar um número
menor que nbytes, nesse caso,
significa: “tente de novo”, mas
não significa que deu erro
rodrigo@ic.ufal.br 4
read_all
o Vamos mudar o comportamento padrão do read para evitar
esse retorno que pode ou não retornar o tamanho todo
o A gente vai construir um read_all que usa o read e sempre
retorna a quantidade de bytes lida
o Ou seja, se o read retornar um número menor, a gente tenta de
novo até que ele retorne tudo
rodrigo@ic.ufal.br 5
read_all
ssize_t read_all(int file_desc, void *buff, size_t nbytes)
{
assert(file_desc >=0);
assert(buff);
assert(nbytes>=0);
size_t left = nbytes;
while (1)
{
int res = read(file_desc,buff,nbytes);
printf("%dn",res);
if (res < 1)
{
return res;
}
buff+=res; //desloca o ponteiro de "res" bytes
left -= res;
assert (left >=0);
if (left == 0)
{
return nbytes;
}
printf(“Precisando ler de novo!”);
}
}
rodrigo@ic.ufal.br 6
read_all :: comentários
o Inicialmente, considera que a quantidade de bytes que faltam
ser lidos é o número de bytes que você pediu para ele ler
o size_t left = nbytes;
o A cada chamada ao read, como ele retorna o número de bytes
lidos, a gente subtrai da quantidade de bytes que faltam
oint res = read(file_desc,buff,nbytes);
...
left -= res;
rodrigo@ic.ufal.br 7
main () :: ideias
o Para testar, vamos fazer o seguinte:
oUtilizaremos outra função para ler arquivo, da biblioteca stdio
oIremos ler o arquivo através dela e depois comparar com a nossa
leitura do arquivo
oE vamos fazer isso várias vezes, para tentar fazer com que o read do
read_all de fato não retorne a quantidade de bytes total
oSe ele toda vez retornar a quantidade total de bytes lidos e se o
conteúdo retornado pelo read_all for igual ao retornado pelo fread do
stdio, tudo ok!
rodrigo@ic.ufal.br 8
main()
int main()
{
srand( time(NULL));
// abre o arquivo e obtem um file descriptor
int fd = open("arquivo.txt",O_RDONLY);
assert (fd>=0);
struct stat buf;
// recupera informacoes sobre o arquivo
int res = fstat(fd, &buf);
assert (res==0);
// dentre elas, o tamanho
off_t len = buf.st_size;
// aloca espaço para guardar o conteudo
char *definitive = (char *) malloc(len);
assert(definitive);
// lê e armazena o conteúdo em definitive
FILE *file = fopen("arquivo.txt", "rt");
res = fread(definitive, sizeof(char), len / sizeof(char), file);
assert (res == len);
int i;
// cria outra variavel para guardar o conteudo
char *test = (char *) malloc (len);
for (i=0 ; i<10; i++)
{
res = lseek(fd, 0, SEEK_SET);
assert (res==0);
int j;
// preenche ela com lixo
for (j=0; j<len ; j++)
{
test[j] = rand();
}
// chama a funcao de leitura
res = read_all(fd, test, len);
assert(res==len);
// compara a nossa com a anterior
assert(strncmp(test,definitive,len)==0);
}
printf("fimn");
return 0;
rodrigo@ic.ufal.br 9
Executando
o Veja que ele não deve ter dado nenhum erro
o Mas provavelmente está sempre imprimindo o número total de
bytes do arquivo
oOu seja, não simulamos o cenário onde o read retorna uma quantidade
de bytes menor
oVeja que, provavelmente, ele não executou o comando da função
read_all:
o printf(“Precisando ler de novo!”);
rodrigo@ic.ufal.br 10
Como simular que o read irá retornar menos bytes que
o esperado?
o Não temos nenhum controle sobre a função read()
o Então, como fazer para simular que ela irá retornar menos bytes
em algo que não temos controle?
oFault Injection poderia ser uma alternativa
rodrigo@ic.ufal.br 11
Fault injection
o Vamos simular isso
ssize_t read_fi(int file_desc, void *buff, size_t nbytes)
{
nbytes = (rand() % nbytes)+1;
return read(file_desc,buff,nbytes);
}
rodrigo@ic.ufal.br 12
E mudar a read_all
…
while (1)
{
int res = read_fi(file_desc,buff,nbytes);
printf("%dn",res);
if (res < 1)
…
rodrigo@ic.ufal.br 13
Execute
o E aí, o que achou?
o Você está mais confiante agora que a sua função read_all
funciona bem?
o Como o que acabamos de fazer se “encaixa” no loop que
mostramos no início?
rodrigo@ic.ufal.br 14
Validade da
entrada
rodrigo@ic.ufal.br 15
Como gerar entradas válidas?
o Imagine que vamos testar um browser
o Imagine também que iremos gerar entradas totalmente
aleatórias
rodrigo@ic.ufal.br 16
Entradas aleatórias
o Se a entrada for totalmente aleatória, geraremos pouquíssimas
páginas htmls válidas
rodrigo@ic.ufal.br 17
Entradas aleatórias
rodrigo@ic.ufal.br 18
Vamos colocar a mão na massa
o Você está desenvolvendo um sistema de pagamentos
o Que irá aceitar também o pagamento por cartões de crédito
o Para testar o que você está fazendo, você irá precisar de
números de cartões de créditos válidos e também inválidos
rodrigo@ic.ufal.br 19
(cont.)
o Então, você tem a ideia de gerar números de cartões de crédito
o Mas se você gerar números totalmente aleatórios, muito
dificilmente você gerará um número válido
o Ou seja, seu gerador precisará ser guiado para gerar números
válidos
rodrigo@ic.ufal.br 20
Um cartão de crédito
rodrigo@ic.ufal.br 21
Esse check digit é calculado
Usando o algoritimo de Luhn
O algoritmo de Luhn
rodrigo@ic.ufal.br 22
Caso o número de dígitos seja par
rodrigo@ic.ufal.br 23
o Dobre os índices ímpares, ao invés dos pares
Agora o check digit
o Você receberá o issue identifier
o Gerará o account number de forma aleatória
o Colocar 0 no check digit
o E calcular a check sum (em cima de todos os dígitos, incluindo o
issue identifier)
o Se for 0, beleza, você já tem um número válido
o Senão
o Basta fazer check_digit = 10 - checksum
rodrigo@ic.ufal.br 24
Exemplo
o Issue identifier: 1645
o Suponha um account number de 5 dígitos, gerados aleatoriamente: 83276
o Seu número do cartão até agora: 164583276
o Adicionando o dígito do checksum como 0:
o 1645832760
o Somando:
o (2*6-9) + (2*5-9) + (2*3) + (2*7-9) = 3+1+6+5 = 15
o Checksum = 15%10 = 5, ou seja, não deu zero, logo basta trocaro o checksum por 10-5 = 5
o Número final: 1645832765
rodrigo@ic.ufal.br 25
Missão: implementar o generate
def luhn_checksum(n):
assert(n.isdigit())
result = luhn_sum(n) %10
return result
def is_luhn_valid(n):
return luhn_checksum(n)==0
# size is the total size
def generate(pref,size):
return
rodrigo@ic.ufal.br 26
Usando
rodrigo@ic.ufal.br 27
Oráculo
Reflexões
o Veja que deu um pouco de trabalho construir um gerador de
casos de testes aleatórios que gera valores válidos de entrada
o Vale a pena?
oLembre do gráfico de validade da entrada
o Se você ignorar o problema de validade da entrada,
provavelmente a maioria dos seus testes irá falhar e será inútil
rodrigo@ic.ufal.br 28
Testar a Fila
rodrigo@ic.ufal.br 29

Contenu connexe

Tendances

Exercícios da Aula de LAB 01
Exercícios da Aula de LAB 01Exercícios da Aula de LAB 01
Exercícios da Aula de LAB 01thomasdacosta
 
Php Test Fest PHPMS, Maio 2008
Php Test Fest PHPMS, Maio 2008Php Test Fest PHPMS, Maio 2008
Php Test Fest PHPMS, Maio 2008zehzinho
 
Oficina de shell script
Oficina de shell scriptOficina de shell script
Oficina de shell scriptbrunobione
 
Apostila de Introdução aos Algoritmos - usando o Visualg
Apostila de Introdução aos Algoritmos - usando o VisualgApostila de Introdução aos Algoritmos - usando o Visualg
Apostila de Introdução aos Algoritmos - usando o VisualgRegis Magalhães
 
Introducao ao Shell Script
Introducao ao Shell ScriptIntroducao ao Shell Script
Introducao ao Shell ScriptHugo Maia Vieira
 
Lógica de programação com visu alg
Lógica de programação com visu algLógica de programação com visu alg
Lógica de programação com visu algLeandro Santos
 
Programação Estruturada 2 - Curso Completo
Programação Estruturada 2 - Curso CompletoProgramação Estruturada 2 - Curso Completo
Programação Estruturada 2 - Curso Completothomasdacosta
 
PHPUnit e teste de software
PHPUnit e teste de softwarePHPUnit e teste de software
PHPUnit e teste de softwarericardophp
 
Programação Estruturada 2 - Aula 06
Programação Estruturada 2 - Aula 06Programação Estruturada 2 - Aula 06
Programação Estruturada 2 - Aula 06thomasdacosta
 
Programação Estruturada 2 - Aula 01 - Código Fonte
Programação Estruturada 2 - Aula 01 - Código FonteProgramação Estruturada 2 - Aula 01 - Código Fonte
Programação Estruturada 2 - Aula 01 - Código Fontethomasdacosta
 
Conceitos e técnicas de programação aula 2
Conceitos e técnicas de programação aula 2Conceitos e técnicas de programação aula 2
Conceitos e técnicas de programação aula 2Robson Ferreira
 
Lógica de programação pascal
Lógica de programação   pascalLógica de programação   pascal
Lógica de programação pascalJocelma Rios
 
Conceitos e técnicas de programação aula 1
Conceitos e técnicas de programação aula 1Conceitos e técnicas de programação aula 1
Conceitos e técnicas de programação aula 1Robson Ferreira
 
Aula 5 - Programação 1
Aula 5 - Programação 1Aula 5 - Programação 1
Aula 5 - Programação 1Isaac Barros
 

Tendances (20)

Exercícios da Aula de LAB 01
Exercícios da Aula de LAB 01Exercícios da Aula de LAB 01
Exercícios da Aula de LAB 01
 
Brasiliatestfest
BrasiliatestfestBrasiliatestfest
Brasiliatestfest
 
Php Test Fest PHPMS, Maio 2008
Php Test Fest PHPMS, Maio 2008Php Test Fest PHPMS, Maio 2008
Php Test Fest PHPMS, Maio 2008
 
Oficina de shell script
Oficina de shell scriptOficina de shell script
Oficina de shell script
 
Apostila de Introdução aos Algoritmos - usando o Visualg
Apostila de Introdução aos Algoritmos - usando o VisualgApostila de Introdução aos Algoritmos - usando o Visualg
Apostila de Introdução aos Algoritmos - usando o Visualg
 
Introducao ao Shell Script
Introducao ao Shell ScriptIntroducao ao Shell Script
Introducao ao Shell Script
 
Lógica de programação com visu alg
Lógica de programação com visu algLógica de programação com visu alg
Lógica de programação com visu alg
 
Programação Estruturada 2 - Curso Completo
Programação Estruturada 2 - Curso CompletoProgramação Estruturada 2 - Curso Completo
Programação Estruturada 2 - Curso Completo
 
Curso Gratuito de Shell Script
Curso Gratuito de Shell ScriptCurso Gratuito de Shell Script
Curso Gratuito de Shell Script
 
PHPUnit e teste de software
PHPUnit e teste de softwarePHPUnit e teste de software
PHPUnit e teste de software
 
Programação Estruturada 2 - Aula 06
Programação Estruturada 2 - Aula 06Programação Estruturada 2 - Aula 06
Programação Estruturada 2 - Aula 06
 
Programação Estruturada 2 - Aula 01 - Código Fonte
Programação Estruturada 2 - Aula 01 - Código FonteProgramação Estruturada 2 - Aula 01 - Código Fonte
Programação Estruturada 2 - Aula 01 - Código Fonte
 
Curso shell
Curso shellCurso shell
Curso shell
 
Conceitos e técnicas de programação aula 2
Conceitos e técnicas de programação aula 2Conceitos e técnicas de programação aula 2
Conceitos e técnicas de programação aula 2
 
Shell Script v0
Shell Script v0Shell Script v0
Shell Script v0
 
Lógica de programação pascal
Lógica de programação   pascalLógica de programação   pascal
Lógica de programação pascal
 
Java - Primeiros passos
Java - Primeiros passosJava - Primeiros passos
Java - Primeiros passos
 
Conceitos e técnicas de programação aula 1
Conceitos e técnicas de programação aula 1Conceitos e técnicas de programação aula 1
Conceitos e técnicas de programação aula 1
 
Comandos em python
Comandos em pythonComandos em python
Comandos em python
 
Aula 5 - Programação 1
Aula 5 - Programação 1Aula 5 - Programação 1
Aula 5 - Programação 1
 

Similaire à Testes de Software - Módulo 3

Expressões idiomáticas do python
Expressões idiomáticas do pythonExpressões idiomáticas do python
Expressões idiomáticas do pythonFilipe Ximenes
 
Curso python
Curso pythonCurso python
Curso pythonTiago
 
Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a TestesGregorio Melo
 
Curso de python capítulo 1 - introdução
Curso de python   capítulo 1 - introduçãoCurso de python   capítulo 1 - introdução
Curso de python capítulo 1 - introduçãoRicardo Fahham
 
Aula 1 - Programação 1
Aula 1 - Programação 1Aula 1 - Programação 1
Aula 1 - Programação 1Isaac Barros
 
Curso C e C++ - Teoria PDF.pdf
Curso C e C++ - Teoria PDF.pdfCurso C e C++ - Teoria PDF.pdf
Curso C e C++ - Teoria PDF.pdfJoaoAbadia2
 
Aprenda a programar-luciano_ramalho
Aprenda a programar-luciano_ramalhoAprenda a programar-luciano_ramalho
Aprenda a programar-luciano_ramalhoFelipeDi
 
Aprenda a programar-luciano_ramalho
Aprenda a programar-luciano_ramalhoAprenda a programar-luciano_ramalho
Aprenda a programar-luciano_ramalhoWeldir Fernando Dias
 
Astro Pi - introdução ao Python
Astro Pi - introdução ao PythonAstro Pi - introdução ao Python
Astro Pi - introdução ao PythonAna Carneirinho
 
Pymordida0 Semana de computação da SOCIESC - 2008/10
Pymordida0 Semana de computação da SOCIESC - 2008/10Pymordida0 Semana de computação da SOCIESC - 2008/10
Pymordida0 Semana de computação da SOCIESC - 2008/10Marco Mendes
 
Apostila bnb.2014 informatica_marcio_hunecke
Apostila bnb.2014 informatica_marcio_huneckeApostila bnb.2014 informatica_marcio_hunecke
Apostila bnb.2014 informatica_marcio_huneckeEliene Meira
 
mod5-estruturas-dadosdinamicas
mod5-estruturas-dadosdinamicasmod5-estruturas-dadosdinamicas
mod5-estruturas-dadosdinamicasdiogoa21
 
Aprenda a programar-luciano_ramalho
Aprenda a programar-luciano_ramalhoAprenda a programar-luciano_ramalho
Aprenda a programar-luciano_ramalhoUbirajara Cavaco
 
S2 b desenvolvimento de sistemas [reparado]
S2 b   desenvolvimento de sistemas [reparado]S2 b   desenvolvimento de sistemas [reparado]
S2 b desenvolvimento de sistemas [reparado]Milena Rebouças
 

Similaire à Testes de Software - Módulo 3 (20)

Modulo 2
Modulo 2Modulo 2
Modulo 2
 
Expressões idiomáticas do python
Expressões idiomáticas do pythonExpressões idiomáticas do python
Expressões idiomáticas do python
 
Curso python
Curso pythonCurso python
Curso python
 
Code smell gsw
Code smell   gswCode smell   gsw
Code smell gsw
 
Resumo computação I
Resumo computação IResumo computação I
Resumo computação I
 
Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a Testes
 
03 algoritmos basicos
03 algoritmos basicos03 algoritmos basicos
03 algoritmos basicos
 
Curso de python capítulo 1 - introdução
Curso de python   capítulo 1 - introduçãoCurso de python   capítulo 1 - introdução
Curso de python capítulo 1 - introdução
 
Testes de software de A a Z
Testes de software de A a ZTestes de software de A a Z
Testes de software de A a Z
 
Aula 1 - Programação 1
Aula 1 - Programação 1Aula 1 - Programação 1
Aula 1 - Programação 1
 
Curso C e C++ - Teoria PDF.pdf
Curso C e C++ - Teoria PDF.pdfCurso C e C++ - Teoria PDF.pdf
Curso C e C++ - Teoria PDF.pdf
 
Aprenda a programar-luciano_ramalho
Aprenda a programar-luciano_ramalhoAprenda a programar-luciano_ramalho
Aprenda a programar-luciano_ramalho
 
Aprenda a programar-luciano_ramalho
Aprenda a programar-luciano_ramalhoAprenda a programar-luciano_ramalho
Aprenda a programar-luciano_ramalho
 
Astro Pi - introdução ao Python
Astro Pi - introdução ao PythonAstro Pi - introdução ao Python
Astro Pi - introdução ao Python
 
Pymordida0 Semana de computação da SOCIESC - 2008/10
Pymordida0 Semana de computação da SOCIESC - 2008/10Pymordida0 Semana de computação da SOCIESC - 2008/10
Pymordida0 Semana de computação da SOCIESC - 2008/10
 
Apostila bnb.2014 informatica_marcio_hunecke
Apostila bnb.2014 informatica_marcio_huneckeApostila bnb.2014 informatica_marcio_hunecke
Apostila bnb.2014 informatica_marcio_hunecke
 
mod5-estruturas-dadosdinamicas
mod5-estruturas-dadosdinamicasmod5-estruturas-dadosdinamicas
mod5-estruturas-dadosdinamicas
 
Aprenda a programar-luciano_ramalho
Aprenda a programar-luciano_ramalhoAprenda a programar-luciano_ramalho
Aprenda a programar-luciano_ramalho
 
Bits & Bytes
Bits & BytesBits & Bytes
Bits & Bytes
 
S2 b desenvolvimento de sistemas [reparado]
S2 b   desenvolvimento de sistemas [reparado]S2 b   desenvolvimento de sistemas [reparado]
S2 b desenvolvimento de sistemas [reparado]
 

Testes de Software - Módulo 3

  • 1. Testes de Software Prof. Rodrigo de Barros Paes rodrigo@ic.ufal.br
  • 3. Como funciona? o Basicamente é um teste que utiliza algum tipo de gerador de números (pseudo) aleatórios para gerar os casos de teste rodrigo@ic.ufal.br 3 Gerador de números pseudo aleatórios Gerador de casos de teste aleatórios seed Conhecimento do domínio Software sob teste Oráculo
  • 4. Read • Lê nbytes e coloca em buf • Retorna a quantidade de bytes lida • -1 caso algo dê errado • 0 end of file • Pode retornar um número menor que nbytes, nesse caso, significa: “tente de novo”, mas não significa que deu erro rodrigo@ic.ufal.br 4
  • 5. read_all o Vamos mudar o comportamento padrão do read para evitar esse retorno que pode ou não retornar o tamanho todo o A gente vai construir um read_all que usa o read e sempre retorna a quantidade de bytes lida o Ou seja, se o read retornar um número menor, a gente tenta de novo até que ele retorne tudo rodrigo@ic.ufal.br 5
  • 6. read_all ssize_t read_all(int file_desc, void *buff, size_t nbytes) { assert(file_desc >=0); assert(buff); assert(nbytes>=0); size_t left = nbytes; while (1) { int res = read(file_desc,buff,nbytes); printf("%dn",res); if (res < 1) { return res; } buff+=res; //desloca o ponteiro de "res" bytes left -= res; assert (left >=0); if (left == 0) { return nbytes; } printf(“Precisando ler de novo!”); } } rodrigo@ic.ufal.br 6
  • 7. read_all :: comentários o Inicialmente, considera que a quantidade de bytes que faltam ser lidos é o número de bytes que você pediu para ele ler o size_t left = nbytes; o A cada chamada ao read, como ele retorna o número de bytes lidos, a gente subtrai da quantidade de bytes que faltam oint res = read(file_desc,buff,nbytes); ... left -= res; rodrigo@ic.ufal.br 7
  • 8. main () :: ideias o Para testar, vamos fazer o seguinte: oUtilizaremos outra função para ler arquivo, da biblioteca stdio oIremos ler o arquivo através dela e depois comparar com a nossa leitura do arquivo oE vamos fazer isso várias vezes, para tentar fazer com que o read do read_all de fato não retorne a quantidade de bytes total oSe ele toda vez retornar a quantidade total de bytes lidos e se o conteúdo retornado pelo read_all for igual ao retornado pelo fread do stdio, tudo ok! rodrigo@ic.ufal.br 8
  • 9. main() int main() { srand( time(NULL)); // abre o arquivo e obtem um file descriptor int fd = open("arquivo.txt",O_RDONLY); assert (fd>=0); struct stat buf; // recupera informacoes sobre o arquivo int res = fstat(fd, &buf); assert (res==0); // dentre elas, o tamanho off_t len = buf.st_size; // aloca espaço para guardar o conteudo char *definitive = (char *) malloc(len); assert(definitive); // lê e armazena o conteúdo em definitive FILE *file = fopen("arquivo.txt", "rt"); res = fread(definitive, sizeof(char), len / sizeof(char), file); assert (res == len); int i; // cria outra variavel para guardar o conteudo char *test = (char *) malloc (len); for (i=0 ; i<10; i++) { res = lseek(fd, 0, SEEK_SET); assert (res==0); int j; // preenche ela com lixo for (j=0; j<len ; j++) { test[j] = rand(); } // chama a funcao de leitura res = read_all(fd, test, len); assert(res==len); // compara a nossa com a anterior assert(strncmp(test,definitive,len)==0); } printf("fimn"); return 0; rodrigo@ic.ufal.br 9
  • 10. Executando o Veja que ele não deve ter dado nenhum erro o Mas provavelmente está sempre imprimindo o número total de bytes do arquivo oOu seja, não simulamos o cenário onde o read retorna uma quantidade de bytes menor oVeja que, provavelmente, ele não executou o comando da função read_all: o printf(“Precisando ler de novo!”); rodrigo@ic.ufal.br 10
  • 11. Como simular que o read irá retornar menos bytes que o esperado? o Não temos nenhum controle sobre a função read() o Então, como fazer para simular que ela irá retornar menos bytes em algo que não temos controle? oFault Injection poderia ser uma alternativa rodrigo@ic.ufal.br 11
  • 12. Fault injection o Vamos simular isso ssize_t read_fi(int file_desc, void *buff, size_t nbytes) { nbytes = (rand() % nbytes)+1; return read(file_desc,buff,nbytes); } rodrigo@ic.ufal.br 12
  • 13. E mudar a read_all … while (1) { int res = read_fi(file_desc,buff,nbytes); printf("%dn",res); if (res < 1) … rodrigo@ic.ufal.br 13
  • 14. Execute o E aí, o que achou? o Você está mais confiante agora que a sua função read_all funciona bem? o Como o que acabamos de fazer se “encaixa” no loop que mostramos no início? rodrigo@ic.ufal.br 14
  • 16. Como gerar entradas válidas? o Imagine que vamos testar um browser o Imagine também que iremos gerar entradas totalmente aleatórias rodrigo@ic.ufal.br 16
  • 17. Entradas aleatórias o Se a entrada for totalmente aleatória, geraremos pouquíssimas páginas htmls válidas rodrigo@ic.ufal.br 17
  • 19. Vamos colocar a mão na massa o Você está desenvolvendo um sistema de pagamentos o Que irá aceitar também o pagamento por cartões de crédito o Para testar o que você está fazendo, você irá precisar de números de cartões de créditos válidos e também inválidos rodrigo@ic.ufal.br 19
  • 20. (cont.) o Então, você tem a ideia de gerar números de cartões de crédito o Mas se você gerar números totalmente aleatórios, muito dificilmente você gerará um número válido o Ou seja, seu gerador precisará ser guiado para gerar números válidos rodrigo@ic.ufal.br 20
  • 21. Um cartão de crédito rodrigo@ic.ufal.br 21 Esse check digit é calculado Usando o algoritimo de Luhn
  • 22. O algoritmo de Luhn rodrigo@ic.ufal.br 22
  • 23. Caso o número de dígitos seja par rodrigo@ic.ufal.br 23 o Dobre os índices ímpares, ao invés dos pares
  • 24. Agora o check digit o Você receberá o issue identifier o Gerará o account number de forma aleatória o Colocar 0 no check digit o E calcular a check sum (em cima de todos os dígitos, incluindo o issue identifier) o Se for 0, beleza, você já tem um número válido o Senão o Basta fazer check_digit = 10 - checksum rodrigo@ic.ufal.br 24
  • 25. Exemplo o Issue identifier: 1645 o Suponha um account number de 5 dígitos, gerados aleatoriamente: 83276 o Seu número do cartão até agora: 164583276 o Adicionando o dígito do checksum como 0: o 1645832760 o Somando: o (2*6-9) + (2*5-9) + (2*3) + (2*7-9) = 3+1+6+5 = 15 o Checksum = 15%10 = 5, ou seja, não deu zero, logo basta trocaro o checksum por 10-5 = 5 o Número final: 1645832765 rodrigo@ic.ufal.br 25
  • 26. Missão: implementar o generate def luhn_checksum(n): assert(n.isdigit()) result = luhn_sum(n) %10 return result def is_luhn_valid(n): return luhn_checksum(n)==0 # size is the total size def generate(pref,size): return rodrigo@ic.ufal.br 26
  • 28. Reflexões o Veja que deu um pouco de trabalho construir um gerador de casos de testes aleatórios que gera valores válidos de entrada o Vale a pena? oLembre do gráfico de validade da entrada o Se você ignorar o problema de validade da entrada, provavelmente a maioria dos seus testes irá falhar e será inútil rodrigo@ic.ufal.br 28

Notes de l'éditeur

  1. Olhar : random testing in practice, aula 8