Escolar Documentos
Profissional Documentos
Cultura Documentos
NOTA
Muito zelo e técnica foram empregados na edição desta obra. No entanto, podem ocorrer erros
de digitação, impressão ou dúvida conceitual. Em qualquer das hipóteses, solicitamos a
comunicação ao nosso serviço de Atendimento ao Cliente para que possamos esclarecer ou
encaminhar a questão.
Para todos os efeitos legais, nem a editora, nem os autores, nem os editores, nem os
tradutores, nem os revisores ou colaboradores, assumem qualquer responsabilidade por
qualquer efeito danoso e/ou malefício a pessoas ou propriedades envolvendo
responsabilidade, negligência etc. de produtos, ou advindos de qualquer uso ou emprego de
quaisquer métodos, produtos, instruções ou ideias contidos no material aqui publicado.
A Editora
CIP-BRASIL. CATALOGAÇÃO-NA-FONTE
SINDICATO NACIONAL DOS EDITORES DE LIVROS, RJ
I48
Introdução ao teste de software / organização Márcio Eduardo Delamaro, José
Carlos Maldonado, Mario Jino. - [2. ed.] - Rio de Janeiro : Elsevier, 2016. il.; 24 cm.
Inclui bibliografia e índice
978-85-352-8352-5
Software – Testes. I. Delamaro, Márcio Eduardo. II. Maldonado, José Carlos. III.
Jino, Mario.
16-31848 CDD: 005.14
CDU: 004.415.538
31/03/2016 01/04/2016
Prefácio
Elemento fundamental para a manutenção de várias atividades da sociedade contemporânea
(talvez sem exagero de praticamente todas elas, nos próximos anos...), o software se faz presente
nas mais diferentes situações cotidianas, dispositivos e contextos. A ideia do que é um software,
o qual confesso representa uma questão que tenho tentado responder sem muito sucesso,
transcende minha capacidade de abstração e ao mesmo tempo me fascina.
Toda esta reconhecida relevância e importância de um software, ao longo dos anos, tem
motivado a busca por tecnologias que garantam a elaboração e disponibilização de softwares
corretos, seguros, escaláveis, persistentes e ubíquos.
Apesar dos avanços obtidos até então, este elemento ainda apresenta propriedades
desconhecidas para os engenheiros de softwares. Diferentes categorias de softwares (acreditando
ser possível categorizá-los) demandam processos e tecnologias distintas, tornando a tomada de
decisão a respeito de sua engenharia uma tarefa não trivial. Diferentes variáveis de contexto
podem influenciar sua concepção e elaboração. E afetar seu comportamento. Desta forma,
tecnologias que apresentam evidência sobre sua viabilidade, eficiência e eficácia quando
utilizadas no contexto do desenvolvimento e manutenção de um software facilitam o trabalho
dos engenheiros de software. Uma delas, presente em todos os processos de desenvolvimento e
manutenção conhecidos e essencial no ciclo de vida de produtos engenheirados, é o Teste de
Software.
Meus primeiros contatos com atividades chamadas “teste de software” se deram lá pelos anos
1980, ainda na graduação de engenharia elétrica na UFJF. Desenvolvíamos sistemas científicos
para engenharia em Fortran IV, os quais necessitavam realizar cálculos dos mais diversos tipos.
O tal “teste” representava a última chance de verificar um software antes da entrega e implicava
colocá-lo para executar, fornecer dados de entrada que dariam resultados previamente
conhecidos e assim comparar os resultados obtidos com o que se esperava chegando ao
entendimento se algo estaria ou não correto. Encontrava muito “erro”. Sem planejamento
detalhado. Sem qualquer critério de teste que não fossem aquelas funcionalidades “visíveis”. E,
portanto, sem percepção de cobertura e riscos de eventuais problemas adicionais. Tinha alguma
noção do que poderia estar correto. Mas não conseguia ainda perceber o que não estava. Ou o
que deveria fazer para aumentar a capacidade de observação. Felizmente nenhum circuito
elétrico calculado com aqueles softwares colapsou. Talvez hoje definisse aquelas atividades
como teste “ad-hoc”, por delicadeza conceitual...
Lá pelo início dos anos 1990 (final do mestrado e início do doutorado na COPPE/UFRJ) tive a
honra e oportunidade de começar a aprender um pouco mais sobre testes de software com os
grupos de pesquisa representados pelos Professores Mario Jino (DCA/FEC/UNICAMP) e José
Carlos Maldonado (ICMC/USP), atualmente responsáveis por algumas gerações de excelentes
pesquisadores em testes de software no Brasil. Tornei-me um aluno aplicado e usuário do
conhecimento e das tecnologias geradas por eles, fazendo daqueles grupos meu referencial na
área.
Revelar falhas com os testes planejados e a partir daí identificar os defeitos (faltas) no software
passou a ser “lugar comum” em todos os projetos de software dos quais participei. E passou a
representar um tópico importante dentro das disciplinas de engenharia de software que ofereço.
Desde então muita coisa aconteceu e evoluiu. Muito conhecimento tem sido continuamente
produzido e compartilhado. Embora o conhecimento gerado ao longo dos anos ainda não tenha
se propagado totalmente para a indústria, e talvez ainda esteja (em sua forma abrangente)
surpreendentemente distante da maioria dos currículos de graduação, temos hoje um corpo de
conhecimento robusto e baseado em evidência que pode e deve ser utilizado pelos engenheiros
de software na tomada de decisão sobre testes de software e na busca incansável pela eliminação
dos defeitos no software.
Toda esta evolução só foi possível devido à competência e dedicação de grupos de pesquisa
que têm contribuído explicitamente para a evolução do conhecimento sobre Testes de Software.
Neste ponto em particular, devemos destacar e agradecer aos organizadores desta obra
(Professores Mario Jino, José Carlos Maldonado e Márcio Delamaro) juntamente com os vários
autores dos diferentes capítulos (os quais também tive o prazer de conhecer e admirar seu
trabalho) que nos brindam com esta edição revisada e atualizada de Introdução ao Teste de
Software.
O texto apresenta tópicos relevantes ao cenário do teste de software que influenciam seu
planejamento, o projeto de casos de teste, a execução e a análise dos resultados. São 13 capítulos
(independentes e autocontidos) com bibliografia complementar, que oferecem uma discussão
coerente sobre conceitos básicos, teste funcional, teste baseado em modelos, teste estrutural, teste
de mutação, testes orientados a objetos e de componentes, testes de aspectos e teste apoiado por
aspectos, teste de aplicação web, testes de programas concorrentes, testes em dispositivos
móveis, estudos teóricos e experimentais, geração de dados de testes e confiabilidade. A
organização adotada nesta obra torna sua leitura uma atividade amena, permitindo ao leitor
escolher os tópicos adequados à realidade dos projetos e do ensino/aprendizagem na área.
Embora independentes, a leitura do Capítulo 1 (conceitos básicos) é essencial antes da leitura de
quaisquer outros capítulos, pois ele apresenta as bases conceituais para todos os outros.
Continuo em minha trajetória de aprendizado, e ainda não consegui responder à questão básica
do que é um software, mas consigo entender claramente que “a atividade de teste é complexa”,
como bem afirmam os meus Professores Mario Jino, José Carlos Maldonado e Márcio Delamaro
no capítulo inicial deste excelente livro Introdução ao Teste de software. Espero que esta
“complexidade” seja para você, assim como tem sido para mim, um desafio constante e atraente
para justificar a leitura, aplicação e evolução do conhecimento oferecido neste livro nos projetos
de engenharia do software ou no apoio a seus cursos de graduação e pós-graduação.
Boa leitura! Bons testes!
Índice Remissivo
Capítulo 1
Conceitos Básicos
Márcio Eduardo Delamaro (ICMC/USP)
José Carlos Maldonado (ICMC/USP)
Mario Jino (DCA/FEEC/Unicamp)
1.1 Introdução
Para que possamos tratar de um assunto tão vasto quanto o proposto neste livro, é necessário,
primeiro, estabelecer uma linguagem própria. Como acontece em muitas das áreas da
Computação e das ciências em geral, termos comuns adquirem significados particulares quando
usados tecnicamente.
Este capítulo tem o objetivo de estabelecer o escopo no qual o restante do livro se insere, de
apresentar os principais termos do jargão da área e introduzir conceitos que serão úteis durante a
leitura do texto.
1.2 Validação, verificação e teste de software
Definitivamente, a construção de software não é uma tarefa simples. Pelo contrário, pode se
tornar bastante complexa, dependendo das características e dimensões do sistema a ser criado.
Por isso, está sujeita a diversos tipos de problemas que acabam resultando na obtenção de um
produto diferente daquele que se esperava.
Muitos fatores podem ser identificados como causas de tais problemas, mas a maioria deles
tem uma única origem: erro humano. Como a maioria das atividades de engenharia, a construção
de software depende principalmente da habilidade, da interpretação e da execução das pessoas
que o constroem; por isso, erros acabam surgindo, mesmo com a utilização de métodos e
ferramentas de engenharia de software.
Para que tais erros não perdurem, ou seja, para serem descobertos antes de o software ser
liberado para utilização, existe uma série de atividades, coletivamente chamadas de “Validação,
Verificação e Teste”, ou “VV&T”, com a finalidade de garantir que tanto o modo pelo qual o
software está sendo construído quanto o produto em si estejam em conformidade com o
especificado.
Atividades de VV&T não se restringem ao produto final. Ao contrário, podem e devem ser
conduzidas durante todo o processo de desenvolvimento do software, desde a sua concepção, e
englobam diferentes técnicas.
Em geral, dividem-se as atividades de VV&T em estáticas e dinâmicas. As estáticas são as que
não requerem a execução ou mesmo a existência de um programa ou modelo executável para
serem conduzidas. As dinâmicas são as que se baseiam na execução de um programa ou de um
modelo.
O objeto principal deste livro – o teste de software – é uma atividade dinâmica. Seu intuito é
executar o programa ou modelo utilizando algumas entradas em particular e verificar se seu
comportamento está de acordo com o esperado. Caso a execução apresente resultados não
especificados, dizemos que um erro ou defeito (Seção 1.3) foi identificado. Além disso, os dados
de tal execução podem servir como fonte de informação para a localização e a correção de tais
defeitos.
Outras atividades de VV&T não são tratadas neste livro. São atividades importantes e que
permitem a eliminação de erros desde as fases iniciais do processo de desenvolvimento, o que,
em geral, representa uma economia significativa de recursos. Alguns exemplos de tais atividades
são as revisões técnicas e os walkthroughs.
1.3 Alguns termos do jargão
Nesta seção procuramos identificar alguns termos importantes e que ajudarão o leitor a melhor
compreender os textos dos próximos capítulos.
Na seção anterior dissemos que diversos “problemas” podem emergir durante o
desenvolvimento de software e, em seguida, nos referimos a esses como “erros”. A literatura
tradicional estabelece significados específicos para este e outros termos relacionados como:
falha, defeito, erro, engano. Vamos procurar identificar cada um deles.
Definimos “defeito” (do inglês, fault) como sendo um passo, processo ou definição de dados
incorretos, e “engano” (mistake), como a ação humana que produz um defeito. Assim, esses dois
conceitos são estáticos, pois estão associados a um determinado programa ou modelo e não
dependem de uma execução particular.
O estado de um programa ou, mais precisamente, da execução de um programa em
determinado instante, é dado pelo valor da memória (ou das variáveis do programa) e do
apontador de instruções. A existência de um defeito pode ocasionar um “erro” (error) durante
uma execução do programa, que se caracteriza por um estado inconsistente ou inesperado. Tal
estado pode levar a uma “falha” (failure), ou seja, pode fazer com que o resultado produzido pela
execução seja diferente do resultado esperado.
Note-se que essas definições não são seguidas o tempo todo nem são unanimidade entre os
pesquisadores e engenheiros de software, principalmente em situações informais do dia a dia.
Em particular, utiliza-se “erro” de maneira bastante flexível, muitas vezes significando defeito,
erro ou até falha.
O “domínio” de entrada de um programa P, denotado por D(P ), é o conjunto de todos os
possíveis valores que podem ser utilizados para executar P. Por exemplo, vamos tomar um
programa que recebe como parâmetros de entrada dois números inteiros x e y, com y ≥ 0, e
computa o valor de xy , indicando um erro caso os argumentos estejam fora do intervalo
especificado. O domínio de entrada deste programa é formado por todos os possíveis pares de
números inteiros (x, y). Da mesma forma, pode-se estabelecer o domínio de saída do programa,
que é o conjunto de todos os possíveis resultados produzidos pelo programa. No nosso exemplo,
seria o conjunto de números inteiros e mensagens de erro produzidos pelo programa.
Um “dado de teste” para um programa P é um elemento do domínio de entrada de P. Um “caso
de teste” é um par formado por um dado de teste mais o resultado esperado para a execução do
programa com aquele dado de teste. Por exemplo, no programa que computa xy , teríamos os
seguintes casos de teste: (2, 3), 8 , (4, 3), 64 , (3, −1), “Erro” . Ao conjunto de todos os casos
de teste usados durante determinada atividade de teste costuma-se chamar “conjunto de teste” ou
“conjunto de casos de teste”.
A Figura 1.1 mostra um cenário típico da atividade de teste. Definido um conjunto de casos de
teste T, executa-se o programa em teste com T e verifica-se qual é o resultado obtido. Se o
resultado produzido pela execução de P coincide com o resultado esperado, então nenhum erro
foi identificado. Se, para algum caso de teste, o resultado obtido difere do esperado, então um
defeito foi revelado. Como sugere a Figura 1.1, em geral, fica por conta do testador, baseado na
especificação do programa (S(P )) ou em qualquer forma de documento que defina seu
comportamento, a análise sobre a correção de uma execução. Na verdade, o testador na figura
está desempenhando um papel que costumamos chamar de “oráculo”, isto é, aquele instrumento
que decide se a saída obtida de determinada execução coincide com a saída esperada.
A farinha do Brazil
Primeiro foi mandioca,
Milho estalado é pipoca,
O gato todo é subtil:
Tres barris e um barril
Enchem todos uma pipa,
Não se faz casa sem ripa,
Ou vara com seu sipó,
Quem não tem ninguem é só,
Todo o bom cavallo esquipa.
Aguardente é geribita,
...dura é .....,
A ...... é pismam
E todo o listão é fita:
A colera logo irrita,
Ganhamú é caranguejo,
Não é sancto São Serejo,
Mas no ceu moram os sanctos;
Todas as casas têm cantos,
Do leite se faz o queijo.
Nos trunfos ha basto e sota,
Dará cartas quem foi mão,
A mulher tem seu pampam,
Pelo pé se calça a bota:
Quem não tem voto não vota,
O que deu cartas é pé,
O escrivão porta por fé,
Obra grosseira é do Porto,
Todo o defuncto está morto,
Vaza e mais enche a maré.
Almorreimas é quentura,
As redes têm seus cadilhos,
Zebedeu foi pae de filhos,
Quem morreu, já não tem cura:
........................
.......................
Jogo de trez é a espadilha,
Ao de dous lhe chamam zanga,
Camisa tem sua manga,
Não ha navio sem quilha.
É o memento lembrança
Das almas do outro mundo,
A panella tem seu fundo,
E quem herdou teve herança:
É zombar estar de chança,
Muitos filhos tem Antonio
Nunes, do seu matrimonio,
Que dos outros não sabemos;
Aposto que já entendemos
Em que é purga o antimonio.
Os sapatos levam sola,
A carne de boi é vacca,
A ... em criança é caca,
É redonda toda a bola:
Passarinho na gaiola
Está prezo na cadeia,
O gatinho bravo meia,
São frades os franciscanos,
O homem velho já tem annos,
A formosa não é feia.
[2] Lisboa.
O fidalgo de solar
Se dá por envergonhado
De um tostão pedir prestado
Para o ventre sustentar:
Diz que antes o quer furtar,
Por manter a negra honra,
Que passar pela deshonra
De que lh’o neguem talvez:
Mas si o vires nas galés
Com honras de vice-rei,
Esta é a justiça que manda El-Rei.
A donzella embiocada,
Mal trajada, peior comida,
Antes quer na sua vida
Ter saia que ser honrada:
É publica amancebada
Por manter a negra honrinha,
E si lh’o chama a visinha,
E lh’o ouve a clerizia,
Dão com ella na enxovia,
E paga a pena da lei:
Esta é a justiça que manda El-Rei.
Os lettrados peralvilhos,
Citando o mesmo doutor
A favor do réu e auctor,
Comem de ambos os carrilhos:
Si se diz pelos corrilhos
Sua prevaricação,
A desculpa que vos dão
É a honra de seus parentes;
E entonces os requerentes
Fogem d’esta infame grei:
Esta é a justiça que manda El-Rei.
O clerigo julgador,
Que’as causas julga sem pejo,
Não reparando que eu vejo
Que erra a lei e erra o doutor:
Quando vem do monsenhor
A sentença revogada,
Por saber que foi comprada
Pelo gimbo ou pelo abraço,
Responde o padre madraço:
Minha honra é minha lei;
Esta é a justiça que manda El-Rei.
O mercador avarento
Quando a sua conta extende,
No que compra e no que vende
Tira duzentos por cento:
Não é elle tão jumento
Que não saiba que em Lisboa
Se lhe ha de dar na gamboa;
Mas comido já o dinheiro,
Diz que a honra está primeiro,
E que honrado a toda a lei.
Esta é a justiça que manda El-Rei.
A viuva auctorisada,
Que não possue vintem,
Porque o marido de bem
Deixou a casa empenhada:
Alli entra a fradalhada,
Qual formiga em correição,
Dizendo que á casa vão
Manter a honra da casa;
Si a vires arder em brasa,
Que ardeu a honra entendei.
Esta é a justiça que manda El-Rei.
O Adonis da manhãa,
O Cupido em todo o dia,
Que anda correndo a coxia
Com recadinhos á irmãa,
E si lhe cortam a lãa
Diz que anda naquelle andar
Pela honra conservar
Bem tractado e bem vestido;
Eu o verei tão despido,
Que até as costas lhe verei.
Esta é a justiça que manda El-Rei.
ROMANCE
PRECEITO I