Teste de Software 02: Oracles Marcelo d’Amorim [email protected] Resumo • Limitação de oracles • Tipos de oracles • Exemplos Oracle • Função que classifica o comportamento de uma execução (teste) como – correto (teste passa) ou não (teste falha) Oracles parciais • Condição necessária mas insuficiente para detectar um erro • Fonte de incompletude Oracles parciais: Exemplo • Ordenação de um array de inteiros int[] input = new int[]{432, 909, 754, 7, 87}; int[] output = sort(input); Assert.assertTrue(isAscending(output)); assuma que sort() não faz mutação em input Oracles parciais: Exemplo • Ordenação de um array de inteiros int[] input = new int[]{432, 909, 754, 7, 87}; int[] output = sort(input); Assert.assertTrue(isAscending(output)); Assert.assertTrue(isPermutation(input, output)); Limitação • Em geral, é indecidível automatizar a construção de oracles Tipos de oracles • Programas sequenciais – Usam asserção de estado – Usam diferenciação • Programas concorrentes – ... Baseados em asserção • Onde a asserção é declarada? – Programa teste: SUT, subject • Declarado pelo programador • Declarado pelo implementador da linguagem – Teste • Declarado pelo testador Baseados em asserção • Onde a asserção é declarada? – Programa teste: SUT, subject • Declarado pelo programador • Declarado pelo implementador da linguagem – Teste • Declarado pelo testador Baseados em asserção • Onde a asserção é declarada? – Programa teste: SUT, subject • Declarado pelo programador • Declarado pelo implementador da linguagem – Teste • Declarado pelo testador Precioso para o testador! Entretanto, o programador raramente escreve código com asserções. Note também que as asserções da linguagem testam apenas crash. Baseados em asserção • Onde a asserção é declarada? – Programa teste: SUT, subject • Declarado pelo programador • Declarado pelo implementador da linguagem – Teste • Declarado pelo testador Baseados em diferenciação new int[]{432, 909, 754, 7, 87}; sort1(_); array_1 Baseados em diferenciação new int[]{432, 909, 754, 7, 87}; sort1(_); sort2(_); array_1 array_2 Baseados em diferenciação new int[]{432, 909, 754, 7, 87}; sort1(_); sort2(_); array_1 array_2 Assert.assertEquals(array_1, array_2); Formas de diferenciação • Baseado em estado (slide anterior) • Baseado em fluxo de controle • Capture and Replay de tela de GUI Resumo • Limitação de oracles • Tipos de oracles • Exemplos