1 / 31

Teste de Software 14: Gera ção de teste baseado em modelos: MBT

Teste de Software 14: Gera ção de teste baseado em modelos: MBT. Marcelo d’Amorim damorim@cin.ufpe.br. MBT (1). O que é um modelo? descrição (incompleta) de comportamento de um elemento (usuário, software, indústria, etc.) O que é MBT? Geração de casos de teste a partir de modelo. MBT (2).

trula
Download Presentation

Teste de Software 14: Gera ção de teste baseado em modelos: MBT

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Teste de Software14: Geração de teste baseado em modelos: MBT Marcelo d’Amorim damorim@cin.ufpe.br

  2. MBT (1) • O que é um modelo? • descrição (incompleta) de comportamento de um elemento (usuário, software, indústria, etc.) • O que é MBT? • Geração de casos de teste a partir de modelo

  3. MBT (2) • Vantagens: • Não precisa acessar o código: caixa-branca • Descreve apenas o que o software precisa obedecer • Desvantagens: • Modelo pode ser caro de construir e manter

  4. Um cenário • Usuário constrói modelo • Ferramenta gera testes a partir do modelo • Script executa e classifica testes: sucesso/falha • Script pode minimizar conjunto de testes reportados (seleção). Por exemplo: • Baseado em cobertura • Baseado em falha

  5. Um cenário • Usuário constrói modelo • Ferramenta gera testes a partir do modelo • Script executa e classifica testes: sucesso/falha • Script pode minimizar conjunto de testes reportados (seleção). Por exemplo: • Baseado em cobertura • Baseado em falha Ênfase

  6. Modelo de interação de uso • Representa possíveis interações do usuário com o sistema • Inclui possíveis dados de entrada • Inclui possíveis sequências Geração do teste faz uso destas alternativas!

  7. Exercício • Construa uma máquina de estados para gerar dados e seqüências de operações de depósito e transferência bancária • Ignore oracles

  8. transferencia deposito valor valor num. agencia num. agencia origem num. c.c. num. c.c. origem num. agencia num. cc Opção 1: Máquina de estados Duas fontes de não determinismo: sequência (depósito/transferência) e dados

  9. Quiz • O que representa cada nó do grafo?

  10. Quiz • O que representa cada nó do grafo? • Estado • mental do usuário de um caixa eletrônico • de um programa gerador de casos de teste Note que o estado após um depósito é o estado inicial. Portanto, o estado não corresponde ao estado do sistema.

  11. Modelo de interação • Pode ser útil para encontrar crashes • Modelo do sistema define comportamento • Útil para encontrar erros lógicos (conformidade) • Requer função de abstração

  12. Comparação de estado MODELO SISTEMA executa operação compara (α)

  13. Opção 2: Modelo em código • Construir modelo direto no código • Modelo contém mais detalhes • Pode construir teste simultaneamente a geração • Reduz necessidade de scripts de execução • Facilita definição de pré e pós-condições

  14. Operador de escolha • Ch(E1,…,En) é uma expressão da ling. • Semântica randômica • Retorna valor de Ej para um j sorteado • Semântica exaustiva • Constrói n execuções. Retorna valor de Ei para cada 1<i<n

  15. Operador de escolha • Ch(E1,…,En) é uma expressão da ling. • Semântica randômica • Retorna valor de Ej para um j sorteado • Semântica exaustiva • Constrói n execuções. Retorna valor de Ei para cada 1<i<n Assuma semântica randômica daqui em diante.

  16. Outra versão com mais detalhes void genOneTest() { /* gerador de casos de teste*/ while(seqLen++ < N) { int op = ch(0,1); switch(op) { 0: genDeposito(); break; 1: genTransferencia(); break; default: throw new RuntimeException(); } } } void genTransferencia() { int ag1 = ch(777,888, 999); int cc1 = ch(1023, 54, 85); int ag2 = ch(777,888, 999); int cc2 = ch(1023, 54, 85); int valor = ch(124.2, 300, 9.99); transferencia(ag1,cc1,ag2,cc2, valor); } void genDeposito() { int ag = ch(777,888, 999); int cc = ch(1023, 54, 85); int valor = ch(124.2, 300, 9.99); deposito(ag,cc,valor); }

  17. Quiz 1 • Este código precisa necessariamente ser usado em conjunto com o sistema?

  18. Quiz 1 • Este código precisa necessariamente ser usado em conjunto com o sistema? • Não. É possível construir testes. • As linguagens de descrição do modelo e da aplicação não precisam ser a mesma

  19. Onde está o teste? • Valores de entrada e seqüência de chamadas de depósito e transferência • (Mais sobre oracle adiante.)

  20. Sequência exemplo (N =3) deposito(777,1023,124.2); deposito(888, 54, 300); transferencia(777,85, 888, 54, 300);

  21. Oracles • Como saber se o teste passou? • As sequências omitem o oracle

  22. Oracles void genDeposito() { int ag = ch(777,888, 999); int cc = ch(1023, 54, 85); int valor = ch(124.2, 300, 9.99); int saldo = readSaldo(ag,cc); deposito(ag,cc,valor); Assert.assertEquals(saldo+valor, readSaldo(ag,cc)); } Tipicamente, a construção de oracles é uma atividade manual (parte do modelo)

  23. Pré e Pós condições • É possível que a intenção seja testar apenas combinações válidas de dados e sequência! Necessário declarar pré condiçoes para restringir comportamentos do modelo

  24. Pré-condições map = { // agencia, conta corrente 777 => {1023}, 888 => {54}, 999 => {85} }; valores = {124.2, 300, 9.99}; void genTransferencia() { int ag1 = ch(777,888, 999); int cc1 = ch(map.get(ag1)); int ag2 = ch(map.keys – {ag1}); int cc2 = ch(map.get(ag2)); int saldo = readSaldo(ag1, cc1); int valor = ch({v < saldo| v \in valores}); transferencia(ag1,cc1,ag2,cc2, valor); }

  25. Pré-condições map = { // agencia, conta corrente 777 => {1023}, 888 => {54,99}, 999 => {85} }; valores = {124.2, 300, 9.99}; void genTransferencia() { int ag1 = ch(777,888, 999); int cc1 = ch(map.get(ag1)); int ag2 = ch(map.keys – {ag1}); int cc2 = ch(map.get(ag2)); int saldo = readSaldo(ag1, cc1); int valor = ch({v < saldo| v \in valores}); transferencia(ag1,cc1,ag2,cc2, valor); } Note que se execução violar uma única pre-condição, o teste é inconclusivo! mesmo se falhar!

  26. Pré-condições map = { // agencia, conta corrente 777 => {1023}, 888 => {54,99}, 999 => {85} }; valores = {124.2, 300, 9.99}; void genTransferencia() { int ag1 = ch(777,888, 999); int cc1 = ch(map.get(ag1)); int ag2 = ch(map.keys – {ag1}); int cc2 = ch(map.get(ag2)); int saldo = readSaldo(ag1, cc1); int valor = ch({v < saldo| v \in valores}); transferencia(ag1,cc1,ag2,cc2, valor); } Modelo é aproximado. Perde comportamentos!

  27. Aproximações • Sobre-aproximações • Superconjunto dos comp. do sistema real • Podem construir falso-positivos • viola pre-condições • Sub-aproximações • Subconjunto dos comp. do sistema real • Podem perder erros do sistema • Tipicamente, mais eficientes

  28. Opção 3: Modelos em gramática • Strings de uma linguagem descrita com uma EBNF correspondem a teste

  29. Exemplo • MODELO := OP+; • OP := DEP | TRA • DEP := `deposito(` AG CC VAL `)` • TRA := `transferencia(` AG CC VAL `)` • AG := `777` | `888` | `999` • CC := `1023` | `54` | `85` • VAL := `124.2` | `300` | `9.99`

  30. Teste baseado em gramática • Símbolos não terminais podem detalhar geração de dados • Geno (Lammel e Shulte, 2005) adiciona restrições para restringir o espaço de termos da linguagem (teste)

  31. Limitações • Gramática é livre de contexto • Dificuldade para associar conta 1 com agencia 1 • Não define oracles • Mais usada para encontrar crashes

More Related