Introdução
Teste
• Conjunto de atividades e técnicas
relacionadas com a procura de erros em
um programa
2
Teste
• Conjunto de atividades e técnicas
relacionadas com a procura de erros em
um programa
Testes procura erros em conjunto de
possíveis execuções do programa.
3
Teste em Perspectiva
• Prova de teorema
– Prova propriedades complexas, mas requer
muito esforço humano.
• Análise estática
– Prova propriedades simples; pode apresentar
alarmes falso. Mas é automático.
• Teste
– Não prova corretude e não é inteiramente
automático!
4
Limitações de Prova de Teorema
• Requer conhecimento de um expert
• Processo manual
– tedioso e passível de erro
5
Limitações de Análise Estática
• Provar propriedades de forma automática
é, em geral, indecidível!
• Eficaz apenas quando
– Propriedades de verificação são simples
• Variáveis não inicializadas, erros de tipo, etc.
– Programas (/ modelos) são simples
• Ausência de loop e recursão, ausência de heap,
etc.
6
Citação de Dijkstra
• “Testing can never demonstrate the
absence of errors in software, only their
presence.” -- E.W.Dijkstra
7
Citação de Dijkstra
• “Testing can never demonstrate the
absence of errors in software, only their
presence.” -- E.W.Dijkstra
Principal limitação de testes é
incompletude: é possível que teste
não encontre um erro latente.
8
Testes é incompleto, porém...
• Rápida implantação
• Documenta intenções e designs
• Capaz de encontrar erros complexos em
programas complexos
– Erros complexos: memory leak, deadlock
– Programas complexos:
9
Definição: Teste (artefato)
• “A set of test inputs, execution conditions,
and expected results developed for a
particular objective, such as to exercise a
particular program path or to verify
compliance with a specific requirement”
[IEEE, do178b]
Definição: Teste (artefato)
• “A set of test inputs, execution conditions,
and expected results developed for a
particular objective, such as to exercise a
particular program path or to verify
compliance with a specific requirement”
[IEEE, do178b]
Exemplo
public class Customer {
String getName() {…}
}
public class Bank{
static Bank createBank() {…}
Customer createCustomer(String name) {…}
}
Exemplo
public class Customer {
String getName() {…}
}
public class Bank{
static Bank createBank() {…}
Customer createCustomer(String name) {…}
}
Bank bank = Bank.createBank();
String name = “customer1“;
Customer cust = bank.createCustomer(name);
Assert.assertEquals(name, cust.getName());
Exemplo
public class Customer {
String getName() {…}
}
public class Bank{
static Bank createBank() {…}
Customer createCustomer(String name) {…}
}
Entrada e resultado esperado:
Bank bank = Bank.createBank();
String name = “customer1“;
Customer cust = bank.createCustomer(name);
Assert.assertEquals(name, cust.getName());
Exemplo
public class Customer {
String getName() {…}
}
public class Bank{
static Bank createBank() {…}
Customer createCustomer(String name) {…}
Customer search(String name) {…}
}
Condições de execução:
Bank bank = Bank.createBank();
String name = “customer1“;
Customer cust = bank.search(name);
if (cust == null) {
Customer cust = bank.createCustomer(name);
Assert.assertEquals(name, cust.getName());
}
Terminologia: Falta e Falha
• IEEE STD. 982.2-1988
(http://standards.ieee.org/)
– Fault (falta, bug ou defeito): problema
– Failure (falha, ou erro): manifestação do
problema
• Mais detalhes…
– Software Metrics and Reliability [Rosenberg
et al., ISSRE’98]
Quiz: Localize falta e falha
// pre condicao: v != null
public static void sort(int[] v) {
for (int i = 0; i <= v.length; i++) {
…v[i] …
}
}
Quiz: Localize falta e falha
// pre condicao: v != null
public static void sort(int[] v) {
for (int i = 0; i <= v.length; i++) {
…v[i] …
}
defeito
}
manifestação do defeito
Teste e Depuração

Teste é atividade de localizar falhas!

Depuração é atividade de localizar faltas!
Teste e Depuração são atividades
complementares
Teste e Depuração

Teste é atividade de localizar falhas!

Depuração é atividade de localizar faltas!

No exemplo anterior:


Atividade de teste localiza erro no uso de
v[i] no corpo do loop de sort.
Depuração localiza o defeito na condição de
parada do loop i <= v.length
Teste de sort
public class SortTest{
public static void main(String[] args) {
sort(new int[]{});
}
}
Terminologia: suíte e regressão
• Suíte de testes é o mesmo que conjunto
de testes
• Regressão é o evento de uma falha em
um teste que costumava passar
Rodar continuamente a suíte de regressão
ajuda a antecipar correção de bugs!
Alguns dados estatísticos (1)
• Beizer [1990] estimou que testes toma
30% a 90% do custo de desenvolvimento
• Santhanan and Hailpern [2002] relata que
de 50 a 75% do custo de desenvolvimento
envolve teste e depuração
23
Alguns dados estatísticos (2)
• O instituto americano de padrões e
tecnologia (NIST) [2002] estima que
$59.2bi é o custo da infra-estrutura
inadequada de teste.
24
Resumo desta aula
• Perspectiva
– Provar corretude ou encontrar erros?
• Alguma terminologia
– Caso de teste, suíte de teste, regressão, falha,
defeitos, depuração, etc.
• Dados estatísticos sobre a área
25
Enquete
•
•
•
•
ant
make
JUnit3
JUnit4
26
Download

01-o-que-eh-testes