Você está na página 1de 27

Teste de Software

FUNDAMENTOS DE TESTE DE SOFTWARE

Departamento de Computação
Bacharelado em Ciência da Computação

Atualizado em Julho de 2022


Conteúdo

Terminologia

Motivação

Contextualização

Testar ou não testar (automaticamente): eis a
questão!

Princípios do teste de software
Princípios

Testar exaustivamente é impossível
Devemos escolher (ou priorizar) o que testar!
Princípios

Testar exaustivamente é impossível

Saber quando parar de testar
Há alguns critérios que podem nos apoiar nesse
sentido (vamos estudá-los)!
Princípios

Testar exaustivamente é impossível

Saber quando parar de testar

Variabilidade é importante (pesticide paradox)
Diferentes técnicas de teste ajudam a revelar
diferentes bugs (o mesmo se afirma sobre testes de
unidade, testes de integração e testes de sistemas)
Combinar as estratégias que vamos estudar é uma
decisão sábia
Princípios

Testar exaustivamente é impossível

Saber quando parar de testar

Variabilidade é importante (pesticide paradox)

Bugs não são uniformemente distribuídos
Vale a pena aprender, continuamente, sobre o
software que desenvolvemos!
Princípios

Testar exaustivamente é impossível

Saber quando parar de testar

Variabilidade é importante (pesticide paradox)

Bugs não são uniformemente distribuídos

Testes dependem de contexto
As técnicas que estudaremos podem ser aplicadas para
qualquer tipo de software
De qualquer modo, para contextos específicos
(aplicações para dispositivos móveis, p. ex.), dedique
tempo para testes específicos
Princípios

Testar exaustivamente é impossível

Saber quando parar de testar

Variabilidade é importante (pesticide paradox)

Bugs não são uniformemente distribuídos

Testes dependem de contexto

Verificação não é validação
Cobertura de código (code coverage) é fácil de medir,
cobertura de requisitos é outra questão!
Estudaremos, principalmente, técnicas de verificação
(dado um requisito, o código deve atendê-lo corretamente)
Princípios

Testar exaustivamente é impossível

Saber quando parar de testar

Variabilidade é importante (pesticide paradox)

Bugs não são uniformemente distribuídos

Testes dependem de contexto

Verificação não é validação

Não importam os testes que efetuemos, eles nunca serão
perfeitos ou suficientes
“Program testing can be used to show the presence of bugs, but
never to show their absence.”
Dijkstra
Conteúdo

Terminologia

Motivação

Contextualização

Testar ou não testar (automaticamente): eis a
questão!

Princípios do teste de software

Fundamentos do teste (efetivo) de software
Workflow (iterativo) para testes
efetivos e sistemáticos

Implemente
uma feature
É mais produtivo focar em uma
etapa por vez!
Efetue os
testes
Workflow (iterativo) para testes
efetivos e sistemáticos

O que você tem?


Implemente
uma feature Requisitos, p. ex., linguagem natural,
casos de uso UML, user stories (ágil)

O que fazer?
Entender os requisitos (i.e., analisá-
los)
Desenvolver o código-fonte (p.ex.,
apoiado por TDD e refactorings)
Atenção1! Requisitos são, frequentemente, complexos; daí, a necessidade
de considerar unidades (classes e métodos) com diferentes contratos para
atender à funcionalidade requisitada
Workflow (iterativo) para testes
efetivos e sistemáticos

O que você tem?


Implemente
uma feature Requisitos, p. ex., linguagem natural,
casos de uso UML, user stories (ágil)

O que fazer?
Entender os requisitos (i.e., analisá-
los)
Desenvolver o código-fonte (p.ex.,
apoiado por TDD e refactorings)
Atenção2! Desenvolver classes com a testabilidade em mente (é
desafiador, mas é essencialmente útil)
Workflow (iterativo) para testes
efetivos e sistemáticos

O que você tem?


Alguma certeza de que os requisitos
foram atendidos

O que fazer?
Efetue os Teste de domínio (domain testing)
testes
Teste de limite (boundary testing)
Teste estrutural (structural testing)

Atenção para os níveis de teste (fundamentais)!


Nìveis de teste (fundamentais)

Fonte: M. T. Valente. Engenharia de Software Moderna. Belo Horizonte: (Independente), 2022


Testes de unidade

Testes que verificam pequenas partes
(unidades) de um código

Teste as
regras de
negócio

Fonte: M. T. Valente. Engenharia de Software Moderna. Belo Horizonte: (Independente), 2022


O que é uma unidade?

Pode ser um método, uma classe ou múltiplas
classes

“A unit test is an automated piece of code that


invokes a unit of work in the system. And a unit of
work can span a single method, a whole class or
multiple classes working together to achieve one
single logical purpose that can be verified.”
Roy Osherove
Nota importante

O que fazer para testar uma classe que depende de outra
classe que, p. ex., depende de um banco de dados?
Simule o banco de dados, através de um stub que agirá
como a classe original, porém é mais simples de usar
durante o teste

Fonte: M. Aniche. Effective Software Testing. A developer’s guide. Manning Publications, 2022
Testes de unidade
Vantagens e desvantagens

Vantagens

Rapidez. Ttipicamente, executam em poucos milisegundos

Controle facilitado. Valores de entrada e resultados esperados são
fáceis de adaptar ou modificar

Implementação facilitada. Tipicamente, uma unidade é coesa e
pequena, simples

Desvantagens

Não representam perfeitamente a execução real do software
(sistemas de software raramente são compostos por uma única
classe)

Alguns tipos de bugs podem não ser detectados (p. ex., em um
código multithreaded, tudo pode funcionar corretamente no nível
de unidade; porém, bugs podem aparecer quando as threads
estiverem executando (no nível de integração)
Testes de integração (ou de serviços)

Testes que verificam uma funcionalidade ou transação
completa de um sistema, considerando diversas classes (de
pacotes distintos)

Testes que podem considerar componentes externos
(bancos de dados, p. ex.)
Teste as
integrações
com os
serviços
externos

Fonte: M. T. Valente. Engenharia de Software Moderna. Belo Horizonte: (Independente), 2022


Testes de integração
Exemplo

Tipicamente, softwares dependem de sistemas de banco de dados

Para a comunicação com o banco de dados, desenvolvedores
frequentemente criam uma classe responsável por integir com o
componente externo (classes Data Access Object (DAO))

Classes DAO podem conter código SQL complicado

Para testar as consultas SQL, um desenvovedor
testa a integração entre a classe DAO
e o banco de dados

Foco nas interações entre os
componentes

Os componentes se comunicam
corretamente?

O que acontece se o componente A
enviar a mensagem X para o
componente B?
Fonte: M. Aniche. Effective Software Testing. A developer’s guide. Manning Publications, 2022
Testes de integração
Vantagens e desvantagens

Testes de integração são mais difíceis de
escrever que testes de unidade

Preparar componentes externos (bancos de
dados, arquivos, web services, ...) demanda
esforço
Nota. Tais componentes exigem uma preparação
específica (p. ex., preparar uma instância isolada
do banco de dados para fins de teste)
Testes de sistema (ou de interface com
o usuário)

Testes que simulam, da forma mais fiel possível,
uma sessão de uso do sistema por um usuário real
Nota. Mínimas alterações nos componentes da
interface podem demandar modificações nesses
testes
Teste os
principais
fluxos da
aplicação

Fonte: M. T. Valente. Engenharia de Software Moderna. Belo Horizonte: (Independente), 2022


Teste de sistema
Exemplo

Note que o objetivo principal dos testes de
sistema é: dada a entrada X, o sistema
fornecerá a saída Y

Fonte: M. Aniche. Effective Software Testing. A developer’s guide. Manning Publications, 2022
Testes de sistema
Vantagens e desvantagens

Vantagens

Quanto mais realistas forem os testes, maior a
confiança no sistema como um todo

Desvantagens

Mais lentos que os testes de unidade

Mais difíceis de escrever (p. ex., conexões,
autenticações, …)

Mais suscetíveis a flakiness (um teste flaky
apresenta comportamento errático – pode passar
ou falhar para a mesma configuração)
Níveis de teste na prática
Recomendação genérica de proporção
Fonte: J. Whittaker, J. Arbon, and J. Carollo. How Google tests software. Addison-
Wesley Professional, April 2012

10%

20%

70%

Fonte: M. T. Valente. Engenharia de Software Moderna. Belo Horizonte: (Independente), 2022


Leitura Recomendada


M. Aniche. Effective Software Testing. A developer’s
guide. Manning Publications, 2022, pp. 1 – 27


M. T. Valente. Engenharia de Software Moderna.
Independente, 2022
Disponível em https://engsoftmoderna.info/cap8.html

Você também pode gostar