1 of 14

Mais sobre Testes de Software

2 of 14

  • Identificar conjuntos de testes equivalentes entre si
  • Diferenciar os casos especiais
  • Exemplo: classes para verificar se um número é primo
    • Válida: números primos como 2,3, 5 e 7, para os quais a função é verdadeira
    • Válida: números não primos, como 1, 4, 6, 10, 14, para os quais a função é falsa
    • Inválida: valores que não seja inteiros positivos, como 0, -1, -2, ..., 2.35, 'abc' , etc.
      • Nesta aula, vamos analisar também as classes de valores inválidos que tínhamos ignorado em aula anterior

Revisando Classes de Equivalência

3 of 14

Exemplo 5: números primos

from funções import é_primo

# testes com números primos

assert é_primo(2)

assert é_primo(3)

assert é_primo(11)

# testes com números não primos

assert not é_primo(1)

assert not é_primo(4)

assert not é_primo(81)

print('Todos os testes passando!')

Entrada

Saída

x

é_primo

2

True

3

True

11

True

1

False

4

False

81

False

4 of 14

Este código passa nos testes?

# arquivo funções.py

def é_primo(numero):

for divisor in range(2, numero//2 + 1):

if numero % divisor == 0:

return False

return True

5 of 14

E este aqui?

# arquivo funções.py

def é_primo(numero):

if numero == 1:

return False

else:

for divisor in range(2, numero//2 + 1):

if numero % divisor == 0:

return False

return True

E as classes inválidas?

6 of 14

Testando valores inválidos

from funções import é_primo

# testes com números primos

assert é_primo(2)

assert é_primo(3)

assert é_primo(11)

# testes com números não primos

assert not é_primo(1)

assert not é_primo(4)

assert not é_primo(81)

# que tipo de testes vem aqui?

...

print('Todos os testes passando!')

Entrada

Saída

x

é_primo

2

True

3

True

11

True

1

False

4

False

81

False

0

Exceção

-2

Exceção

2.35

Exceção

'abc'

Exceção

7 of 14

Testando valores inválidos

...

# que tipo de testes vem aqui?

try:

é_primo(0)

raise Exception

except AssertionError: pass

...

try:

é_primo('abc')

raise Exception

except AssertionError: pass

...

print('Todos os testes passando!')

Entrada

Saída

x

é_primo

...

...

0

Exceção

-2

Exceção

2.35

Exceção

'abc'

Exceção

8 of 14

Testando valores inválidos

from funções import é_primo

# testes com números primos

assert é_primo(2)

assert é_primo(3)

assert é_primo(11)

# testes com números não primos

assert not é_primo(1)

assert not é_primo(4)

assert not é_primo(81)

# testes com valores inválidos

try:

é_primo(0)

raise Exception

except AssertionError: pass

try:

é_primo(-2)

raise Exception

except AssertionError: pass

try:

é_primo(2.35)

raise Exception

except AssertionError: pass

try:

é_primo('abc')

raise Exception

except AssertionError: pass

print('Todos os testes passando!')

Entrada

Saída

x

é_primo

2

True

3

True

11

True

1

False

4

False

81

False

0

Exceção

-2

Exceção

2.35

Exceção

'abc'

Exceção

9 of 14

Função com precondições

# arquivo funções.py

def é_primo(numero):

assert isinstance(numero, int) and numero >= 1

if numero == 1:

return False

else:

for divisor in range(2, numero//2 + 1):

if numero % divisor == 0:

return False

return True

10 of 14

  • Exemplo: uma função qualquer deve receber a idade de uma pessoa como argumento
    • Se idade não é inteiro, acusar erro
    • Se idade é negativa, acusar erro
    • Se idade é menor que 18, mostrar ‘menor’
    • Se 18 <= idade < 65, mostrar ‘adulto’
    • Se 65 <= idade <= 120, mostrar ‘idoso’
    • Se idade é maior que 120, acusar erro

Análise de Valor Limítrofe (1)

11 of 14

  • Três classes de equivalência válidas
    1. Menor de idade: de 0 a 17
    2. Adulto: de 18 a 64
    3. Idoso: de 65 a 120
  • Três classes de equivalência inválidas
    • Números negativos: de -∞ até -1
    • Improvável: de 121 até +∞
    • Não inteiros

Análise de Valor Limítrofe (2)

12 of 14

Exemplo 6: Testando a idade

from funções import analisa

# valores não inteiros -inválida

try:

analisa(0.35)

raise Exception

except AssertionError: pass

try:

analisa('abc')

raise Exception

except AssertionError: pass

# inteiros negativos - inválida try:

analisa(-45)

raise Exception

except AssertionError: pass

try:

analisa(-1)

raise Exception

except AssertionError: pass

Entrada

Saída

x

analisa

0.35

Exceção

'abc'

Exceção

-45

Exceção

-1

Exceção

0

'menor'

8

'menor'

17

'menor'

18

'adulto'

56

'adulto'

64

'adulto'

65

'idoso'

80

'idoso'

120

'idoso'

121

Exceção

205

Exceção

# menor de idade - válida

assert analisa(0) == 'menor'

assert analisa(8) == 'menor'

assert analisa(17) == 'menor'

# adulto - válida

assert analisa(18) == 'adulto'

assert analisa(56) == 'adulto'

assert analisa(64) == 'adulto'

# idoso - válida

assert analisa(65) == 'idoso'

assert analisa(80) == 'idoso'

assert analisa(120) == 'idoso'

# improvável - inválida

try:

analisa(121)

raise Exception

except AssertionError: pass

try:

analisa(205)

raise Exception

except AssertionError: pass

print('Todos os testes passando!')

13 of 14

Exemplo 6: análise da idade

# arquivo funções.py

# ...

def analisa(idade):

assert isinstance(idade, int)

assert 0 <= idade <= 120

if idade < 18:

return 'menor'

elif idade < 65:

return 'adulto'

else:

return 'idoso'

14 of 14

Exercícios

(Resolva testando também com valores inválidos)

  1. Revise a função fatorial feita em aula anterior e escreva um programa que teste esta função usando as técnicas vistas neste capítulo. Se o programa falhar nos testes, corrija-o até que passe em todos os testes.
  2. Use TDD para desenvolver uma função que recebe um valor em reais e retorna o menor número possível de notas de 100, 50, 20, 10, 5 e 1 para produzir este valor. Por exemplo, se a função receber o valor 23, deve retornar 4, porque o menor conjunto de notas que forma 23 contém uma nota de 20 e 3 notas de 1.
  3. Use TDD para desenvolver uma função que recebe dois parâmetros: o primeiro é um número inteiro ou float que indica uma temperatura, o segundo é um caractere ‘F’ ou ‘C’ para indicar Fahrenheit ou Celsius. A função deve retornar a temperatura correspondente convertida para a outra escala. A função deve rejeitar temperaturas abaixo do zero absoluto (-273,15 ºC ou -459,67 ºF). As fórmulas de conversão são:

C = (F – 32) / 1.8

F = 1.8 C + 32