Confiabilidade e Segurança MO828 – Eng. Software II Prof Confiabilidade e Segurança MO828 – Eng. Software II Prof.- Eliane Martins Aluna: Flávia Zaroni Camargo RA: 20489
Programa Recovery Blocks Classe Ordenação com os métodos BubbleSort, QuickSort e SelectionSort Classe RecoveryBlocks onde os tipos de Ordenação são chamados Classe AcceptanceTest para verificar se a ordenação foi feita de forma correta Classe SortError para exceção
Confiabilidade Testes com enfoque em confiabilidade; Foi utilizado um modelo independente do tempo, baseado em semeadura de falhas; Para aplicar técnica de mutação devem ser inseridas falhas no código gerando versões mutantes; A mesma entrada é executada na versão original e na versão mutante e os resultados são comparados; O objetivo é “matar” o mutante, reproduzindo o erro esperado; Foco no Recovery Blocks para verificar a recuperação com sucesso de uma versão para outra
Mutante 1 – Selection Sort Foi feita uma mutação no código do Selection Sort (a primeira versão do Recovery Block) para forçar um erro no algoritmo de ordenação e exercitar o AcceptanceTest. DE: if (array[i] < array[index]) PARA: if (array[i] > array[index]) Entrada: int[] a1 = {5,3,2,7,1};
Mutante 1 – Selection Sort Resultado: matou o mutante, mas não foi o resultado esperado totalmente pois foi encontrada uma falha no mecanismo de Acceptance test. A chamada da 2a ordenação estava correta mas foi chamado o 3o sort quando não deveria. Saída gerada pelo programa mutante1: Selection Sort 7 5 3 2 1 Bubble Sort 1 2 3 5 7 Quick Sort 1 2 3 5 7
Mutante 1 – Selection Sort Foi localizado o erro no Acceptance Test e executado o mutante 1 novamente com a entrada 2 na versão corrigida: {5,3,2,7,1,6,4} Na nova versão o comportamento do mutante foi conforme o esperado, podemos considerar que o mutante foi morto; Saída gerada pelo programa mutante1: Selection Sort 7 6 5 4 3 2 1 Bubble Sort 1 2 3 4 5 6 7 Array Sorted
Mutante 2 – Bubble Sort Foi feita uma mutação no código do Bubble Sort para forçar um erro no algoritmo de ordenação e exercitar o AcceptanceTest. DE: if (a[j] > a[j+1]) { PARA: if (a[j] < a[j+1]) { Entrada 1: int[] a1 = {5,3,2,7,1,6,4}; Não matou o mutante2; Não será possível matar o mutante 2 se não colocarmos o mutante1 também pois somente após acusar erro na 1a versão que é ativada a 2a versão.
Mutante 2 – Bubble Sort Solução = mutante1 + mutante2 Matou o mutante2, pois o algoritmo de Bubble Sort não ordenou o vetor. Conforme comportamento esperado, foi invocada a 3a versão de ordenação Quick Sort. Saída gerada pelo programa mutante1: Selection Sort 7 6 5 4 3 2 1 Bubble Sort 7 6 5 4 3 2 1 Quick Sort 1 2 3 4 5 6 7
Mutante 2 – Bubble Sort No teste do mutante2 foi observado mais um erro no código; Faltou fazer mais um teste final da 3a versão do Recovery Block para verificar se o vetor foi ordenado ou não utilizando AcceptanceTest, que deveria ter mostrado a mensagem Array Sorted, que não foi exibida. Após a correção o resultado obtido foi o esperado: Selection Sort 7 6 5 4 3 2 1 Bubble Sort 7 6 5 4 3 2 1 Quick Sort 1 2 3 4 5 6 7 Array Sorted
Mutante 1, 2 e 3 - Resultados Mutante 3: aplicado ao terceiro algoritmo de ordenação similar aos mutantes 1 e 2 Contagem Total: Falhas inerentes encontradas = 2 Mutantes mortos = 3
Segurança Análise de perigos funcionais (FHA – Functional Hazard Assesment) Identificar funções do sistema que contribuem para os perigos identificados, atribuindo-lhes um grau de severidade
Análise de perigos funcionais
Análise de perigos funcionais
Análise de perigos funcionais
Referências A Practical System for Mutation Testing: Help for the Common Programmer, A. Jefferson Offutt Subsumption of Condition Coverage Techniques by Mutation Testing, A. Jefferson Offut, Jeffrey M.Voas
Obrigada! Boas férias!