Exceções e Testes
Programas podem ser mais amigáveis
Exemplo 1 (errado)
1ª Versão:
def ler_int(mensagem, mensagem_de_erro):
entrada = int(input(mensagem))
return entrada
# programa principal
MSG = 'Digite um número inteiro'
MSG_ERRO = 'Número inválido'
x = ler_int(MSG, MSG_ERRO)
y = ler_int(MSG, MSG_ERRO)
print(x + y)
try .. except
try:
commandos que podem causar erro
except ErroConhecido:
commandos que são executados se o erro ocorrer
Exemplo 1: try .. except na prática
2ª Versão:
def ler_int(mensagem, mensagem_de_erro):
while True:
try:
entrada = int(input(mensagem))
return entrada
except:
print(mensagem_de_erro)
# programa principal
MSG = 'Digite um número inteiro'
MSG_ERRO = 'Número inválido'
x = ler_int(MSG, MSG_ERRO)
y = ler_int(MSG, MSG_ERRO)
print(x + y)
Exemplo 2: divisão de inteiros
def divisão(x, y):
try:
return x/y
except ZeroDivisionError:
return None
print(divisão(12, 10))
print(divisão(3, 1))
print(divisão(14, 0))
# Por que testar?
Entradas | Saída | |
x | y | divisão |
12 | 10 | 1.2 |
3 | 1 | 3 |
14 | 0 | None |
Por que TESTAR?
Por que fazer testes?
UEFS - UNIVERSIDADE ESTADUAL DE FEIRA DE SANTANA
8
Por que testar?
Bugs e Testes
Exemplo 2b: Uma maneira mais elegante de testar
def divisão(x, y):
try:
return x/y
except ZeroDivisionError:
return None
assert divisão(12, 10) == 1.2
assert divisão(3, 1) == 3
assert not divisão(14, 0)
print('Todos os testes passando!')
Entradas | Saída | |
x | y | divisão |
12 | 10 | 1.2 |
3 | 1 | 3 |
14 | 0 | None |
assert condição_lógica
Asserções em Python
Desenvolvimento dirigido por testes
Exemplo 3: MMC
def mmc(x, y):
return
assert mmc(12, 10) == 60
assert mmc(3, 9) == 9
assert mmc (14, 15) == 210
print('Todos os testes passando!')
Entradas | Saída | |
x | y | mmc |
12 | 10 | 60 |
3 | 9 | 9 |
14 | 15 | 210 |
Exemplo 3: MMC – passando em um só teste
def mmc(x, y):
return 60
assert mmc(12, 10) == 60
assert mmc(3, 9) == 9
assert mmc (14, 15) == 210
print('Todos os testes passando!')
Entradas | Saída | |
x | y | mmc |
12 | 10 | 60 |
3 | 9 | 9 |
14 | 15 | 210 |
Exemplo 3: MMC – passando em todos os testes
def mmc(x, y):
candidato = x
while not (candidato % x == 0 and candidato % y == 0):
candidato += 1
return candidato
assert mmc(12, 10) == 60
assert mmc(3, 9) == 9
assert mmc (14, 15) == 210
print('Todos os testes passando!')
Entradas | Saída | |
x | y | mmc |
12 | 10 | 60 |
3 | 9 | 9 |
14 | 15 | 210 |
Exemplo 3: MMC – otimizando um pouco
def mmc(x, y):
if x > y:
candidato = x
else:
candidato = y
while not (candidato % x == 0 and candidato % y == 0):
candidato += 1
return candidato
assert mmc(12, 10) == 60
assert mmc(3, 9) == 9
assert mmc (14, 15) == 210
print('Todos os testes passando!')
Entradas | Saída | |
x | y | mmc |
12 | 10 | 60 |
3 | 9 | 9 |
14 | 15 | 210 |
Exemplo 3: MMC – simplificando
def mmc(x, y):
candidato = max(x, y)
while not (candidato % x == 0 and candidato % y == 0):
candidato += 1
return candidato
assert mmc(12, 10) == 60
assert mmc(3, 9) == 9
assert mmc (14, 15) == 210
print('Todos os testes passando!')
Entradas | Saída | |
x | y | mmc |
12 | 10 | 60 |
3 | 9 | 9 |
14 | 15 | 210 |
Exemplo 4: quadrado de inteiro
def ao_quadrado(x):
return x + x
assert ao_quadrado(2) == 4
print('Todos os testes passando!')
Entrada | Saída |
x | ao_quadrado |
2 | 4 |
Quantos testes fazer?
def ao_quadrado(x):
return x * x
assert ao_quadrado(2) == 4
assert ao_quadrado(4) == 16
assert ao_quadrado(-9) == 81
assert ao_quadrado(0) == 0
print('Todos os testes passando!')
Entrada | Saída |
x | ao_quadrado |
2 | 4 |
4 | 16 |
-9 | 81 |
0 | 0 |
Classes de Equivalência
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 |
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
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?
Sobre classes inválidas:
Exercícios
C = (F – 32) / 1.8
F = 1.8 C + 32