\documentclass{beamer}

\usepackage{graphicx}

\mode<presentation>

\usepackage[portuguese]{babel}
\usepackage{pifont}
\usepackage{xspace}
\usepackage{graphicx}
\usepackage{algorithm}
\usepackage{algorithmic}

\title{Metodologias de Teste de {\em Software}}
\author{Fernando Magno Quint\~{a}o Pereira}
\date{\today}

\begin{document}

\begin{frame}
\titlepage
\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{A espiral de testes}
Muitos processos de teste de {\em software} seguem a mesma espiral de
desenvolvimento que vemos em {\em Engenharia de Software}, mas em ordem
inversa.
\begin{enumerate}
\item Testes de unidade $\equiv$ Programa\c{c}\~{a}o/codifica\c{c}\~{a}o.
\item Testes de integra\c{c}\~{a}o $\equiv$ Projeto.
\item Testes de valida\c{c}\~{a}o $\equiv$ Levantamento de requisitos.
\end{enumerate}
\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Quest\~{a}o}
\begin{itemize}
\item Quando podemos come\c{c}ar a testar o {\em software}?
\item Quando podemos parar de test\'{a}-lo?
\item Quem \'{e} respons\'{a}vel por testar o {\em software}?
\item Quais as vantagens e desvantagens de uma companhia contratar um grupo de
testes independente?
\end{itemize}
\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Aprenda a ``ler" os testes}
Um teste de {\em software} fornece muito mais informa\c{c}\~{a}o que
simplesmente: ``o programa funciona/n\~{a}o funciona".

Que informa\c{c}\~{o}es vale a pena guardar dos resultados de um teste de
{\em software}?
\begin{enumerate}
\pause
\item Tempo m\'{e}dio para encontrar uma falha.
\item Tempo m\'{e}dio para reparar um defeito.
\item Varia\c{c}\~{a}o na frequ\^{e}ncia de erros encontrados.
\item N\'{u}mero de horas gastas no preparo de testes.
\end{enumerate}

Que outras informa\c{c}\~{o}es podemos inferir a partir de testes?
\end{frame}



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Testes de unidade}
Testes de unidade testam as menores unidades compil\'{a}veis que comp\~{o}em
um sistema.
Diferentes aspectos de um programa podem ser testados:
\begin{itemize}
\item Sanitiza\c{c}\~{a}o de dados de entrada.
\item Condi\c{c}\~{o}es de contorno.
\item Tratamento de exce\c{c}\~{o}es.
\end{itemize}
\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Quest\~{a}o}
Cite exemplos de erros que s\~{a}o encontrados por testes de unidade.
\begin{itemize}
\item Compara\c{c}\~{a}o entre tipos de dados diferentes.
\item ...
\pause
\item Uso incorreto da preced\^{e}ncia entre operadores l\'{o}gicos.
\item Expectativa de igualdade quando precis\~{a}o pode tornar igualdade
improv\'{a}vel.
\item Compara\c{c}\~{a}o incorreta de vari\'{a}veis.
\item Termina\c{c}\~{a}o inexistente de {\em loop}.
\item Modifica\c{c}\~{a}o incorreta de vari\'{a}vel de indu\c{c}\~{a}o no
interior do {\em loop}.
\end{itemize}
\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Quest\~{a}o}
Testes de unidade em geral s\~{a}o realizados sobre um m\'{o}dulo do
programa, quando o programa inteiro ainda n\~{a}o foi terminado.

\begin{itemize}
\item Como isto \'{e} poss\'{i}vel?
\end{itemize}
\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Testes de Integra\c{c}\~{a}o}
Testes de integra\c{c}\~{a}o s\~{a}o t\'{e}cnicas sistem\'{a}ticas para
construir a arquitetura de {\em software}, ao mesmo tempo em que testes s\~{a}o
realizados para descobrir erros associados aos pontos de jun\c{c}\~{a}o.

\begin{itemize}
\item Tudo bem, todos os componentes do sistema j\'{a} foram testados
individualmente. O que pode dar errado?
\item Mas se colocarmos todos os m\'{o}dulos juntos, de uma vez s\'{o}, e algo
dar errado, como descobrir o erro?
\end{itemize}
\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Integra\c{c}\~{a}o {\em Top Down}}
\begin{itemize}
\item O m\'{o}dulo de controle principal \'{e} usado como um {\em driver} de
testes.
\item {\em Stubs} s\~{a}o substitu\'{i}dos um de cada vez.
\item Novos testes s\~{a}o executados conforme cada novo componente \'{e}
inserido.
\item Findo um teste, um novo {\em stub} \'{e} substitu\'{i}do por um
componente real.
\item Testes de regress\~{a}o s\~{a}o executados ao final, para garantir que
novos erros n\~{a}o foram inseridos durante o processo.
\end{itemize}
\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Integra\c{c}\~{a}o {\em Bottom Up}}
\begin{itemize}
\item Components de baixo n\'{i}vel s\~{a}o combinados em grupos que realizam
fun\c{c}\~{o}es comuns.
\item {\em Drivers} s\~{a}o escritos para coordenar os testes de cada grupo,
regulando a entrada e a sa\'{i}da de dados.
\item {\em Drivers} s\~{a}o removidos, enquanto grupos s\~{a}o combinados,
formando-se grupos maiores.
\end{itemize}
\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Testes de Regress\~{a}o}
{\em Testes de regress\~{a}o} s\~{a}o formados pela re-execu\c{c}\~{a}o de
testes que j\'{a} foram executados, com o fim de garantir que a adi\c{c}\~{a}o
de  novos componentes n\~{a}o foi respons\'{a}vel por novos {\em bugs}.

\begin{itemize}
\item Como estes testes deveriam ser organizados?
\item Ser\'{a} que todos os testes antigos deveriam ser re-executados?
\item Ser\'{a} que novos testes deveriam ser adicionados?
\item Ser\'{a} que alguns testes deveriam ser enfatizados?
\end{itemize}
\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Testes de Valida\c{c}\~{a}o}
{\em Testes de valida\c{c}\~{a}o} procuram descobrir falhas no {\em software}
no contexto em que ele \'{e} usado.
O foco destes testes s\~{a}o nos requisitos, ou seja, na parte do sistema
com a qual o usu\'{a}rio final ir\'{a} interagir.

\begin{itemize}
\item Em suas pr\'{o}prias palavras, quais s\~{a}o as diferen\c{c}as entre
valida\c{c}\~{a}o e verifica\c{c}\~{a}o?
\item Como saber se um programa atende os requisitos que motivaram sua
cria\c{c}\~{a}o?
\item Como testes de valida\c{c}\~{a}o deveriam ser executados?
\end{itemize}
\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Valida\c{c}\~{a}o Alfa e Valida\c{c}\~{a}o Beta}
A valida\c{c}\~{a}o alfa \'{e} executada no pr\'{o}prio local de
desenvolvimento do {\em software}.
Os desenvolvedores acompanham os usu\'{a}rios, enquanto estes utilizam o
programa desenvolvido.

A valida\c{c}\~{a}o beta \'{e} conduzida no local onde o sistema ser\'{a}
usado de fato. Normalmente os desenvolvedores n\~{a}o est\~{a}o
presentes nesta etapa.

\begin{itemize}
\item Testes de unidade, testes de integra\c{c}\~{a}o, testes de
valida\c{c}\~{a}o, $\ldots$. Existe algo mais que ainda precise ser testado?
\end{itemize}
\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Testes de Sistema}
O {\em software} desenvolvido ainda precisa ser testado em face a
situa\c{c}\~{o}es excepcionais ou de tens\~{a}o.
Que situa\c{c}\~{o}es s\~{a}o estas?

\begin{itemize}
\pause
\item Recupera\c{c}\~{a}o ap\'{o}s falhas.
\item Seguran\c{c}a: por exemplo, tentativa de acesso n\~{a}o autorizado.
\item Desempenho.
\item Falta de recursos: exemplos?
\begin{itemize}
\pause
\item Banda de rede muito pequena
\item Velocidade de {\em clock} insuficiente
\item Pouca mem\'{o}ria dispon\'{i}vel
\end{itemize}
\end{itemize}
\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Depura\c{c}\~{a}o}
O teste de {\em software} pode levar \`{a} descoberta de {\em bugs}, os quais
precisam ser depurados.
Porque a depura\c{c}\~{a}o \'{e} uma arte t\~{a}o dif\'{i}cil?

\begin{itemize}
\pause
\item Causas e sintomas podem estar localizados em partes distintas do
c\'{o}digo.
\item Os sintomas podem desaparecer temporariamente enquanto outros erros
s\~{a}o corrigidos.
\item Os sintomas podem ser causados por falhas que n\~{a}o
s\~{a}o necessariamente erros, como arredondamento, por exemplo.
\item Os sintomas podem ser causados por erros humanos, que s\~{a}o
dif\'{i}ceis de tra\c{c}ar.
\item As entradas que causam os erros podem ser dif\'{i}ceis de
reproduzir -- o pesadelo do n\~{a}o determinismo.
\item Os sintomas podem ser intermitentes.
\item Os sintomas podem ser devido a uma conjun\c{c}\~{a}o de eventos que
executam em processadores diferentes.
\end{itemize}
\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{O guia do depurador eficiente}
\begin{itemize}
\item Quais s\~{a}o boas pr\'{a}ticas de depura\c{c}\~{a}o?
\item Algum exemplo da vida real?
\end{itemize}

\begin{enumerate}
\pause
\item For\c{c}a bruta.
\item {\em Backtracking}.
\item Elimina\c{c}\~{a}o de causas.
\end{enumerate}
\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Desenvolvimento voltado \`{a} testes}
\begin{center}
\includegraphics[width=0.85\textwidth]{images/TDD}
\end{center}
\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Quest\~{a}o 1}
Uma forma de produzir bons testes \'{e} encontrar um conjunto de entradas que
exercitem todos os caminhos em um programa.
\begin{enumerate}
\item Quantos caminhos existem?
\item Quantas entradas devem ser criadas para o programa abaixo?
\end{enumerate}
\begin{center}
\includegraphics[width=0.85\textwidth]{images/Base1}
\end{center}
\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Quest\~{a}o 2}
Implemente o tipo abstrato de dados \texttt{Graph}.
Comece pelos testes:
\begin{enumerate}
\item Que opera\c{c}\~{o}es devem ser testadas?
\end{enumerate}

Utilize uma metodologia de desenvolvimento voltada para os testes.
\texttt{junit} pode vir acalhar aqui:
\begin{itemize}
\item \texttt{javac -cp .:junit.jar TestGraph.java}
\item \texttt{java -cp .:junit.jar TestGraph}
\end{itemize}
\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Quest\~{a}o 3}
Como voc\^{e} implementaria cada um destes testes?
\begin{enumerate}
\item Adicionar um nodo ao grafo.
\item Adicionar uma aresta ao grafo.
\end{enumerate}
\end{frame}

\end{document}