computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/aula11t.pdf · doctest - testfile os testes não...

39
Computação 2 Aula 11 Teórica professor: Leonardo Carvalho

Upload: truongnhu

Post on 26-Nov-2018

219 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

Computação 2

Aula 11 Teóricaprofessor: Leonardo Carvalho

Page 2: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

SciPy2

Page 3: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

SciPy

3

Conjunto de algoritmos matemáticos usados com frequência por cientistas e engenheiros.

Alguns submódulos:

cluster: algoritmos de clusterização fftpack: cálculo de transformada de Fourierintegrate: integração e soluções de EDOsinterpolate: interpolaçãolinalg: álgebra linearndimage: processamento de imagensoptimize: otimização e cálculo de raizessignal: processamento de sinais

Page 4: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

SciPy - integrate

4

import scipy.integrate as integrate

def f(x):

return 6*x**2-4*x-2

res, err = integrate.quad(f, 0, 5)

print res, err

190.0 2.15410824244e-12

Page 5: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

SciPy - integrate

5

import scipy.integrate as integrate

def f(x, y):

return x*y

def low(y):

return 0

def high(y):

return 1-2*y

res, err = integrate.dblquad(f, 0.0, 0.5, low, high)

print 1.0/96, res, err

0.0104166666667 0.0104166666667 1.15648231732e-16

Page 6: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

SciPy - optimize

6

import scipy.optimize as optimize

from numpy import sin, cos

def f(x):

return x*sin(x*2)*cos(3*x**2)

print optimize.bisect(f, 1, 1.5)

1.25331413732

Page 7: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

SciPy - interpolate

7

from scipy.interpolate import interp1d

import matplotlib.pyplot as plt

import numpy as np

x = np.linspace(0, 10, 5)

y = np.array([3, -2, 1, 0, 2])

f1 = interp1d(x, y)

f2 = interp1d(x, y, kind='cubic')

...

Page 8: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

SciPy - interpolate

8

...

xx = np.linspace(0, 10, 2000)

y1 = f1(xx)

y2 = f2(xx)

plt.xlim(-1, 11)

plt.ylim(-3, 4)

plt.plot(x, y, 'o')

plt.plot(xx, y1, '-')

plt.plot(xx, y2, '--')

plt.show()

Page 9: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

SciPy - interpolate

9

Page 10: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

SciPy - linalg

Tudo que tem no numpy.linalg e mais um pouco!import numpy as np

from scipy import linalg

A = np.matrix([ [4, 3, 2], [7, 2, 5], [8, 0, -1], [9, 7, -3] ])

b = np.matrix([ [2], [1], [0], [4] ])

x, resid, rank, sing_val = linalg.lstsq(A, b)

print x

print resid

print rank

print sing_val

10

Page 11: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

11

Page 12: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

Problema

Sistemas para resolver problemas complexos podem possuir milhares de linhas de código, com muitas classes e funções.

Suponha que precisamos adicionar uma nova funcionalidade a um código existente, ou aperfeiçoar a implementação.

Como ter certeza de que essa funcionalidade não vai "quebrar" o código?

Ou seja, gostaríamos de manter o que funcionava antes funcionando depois.

12

Page 13: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

Testes automáticos

13

Page 14: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

Testes automáticos

Podemos utilizar ferramentas que realizam testes automaticamente em busca de falhas no código.

Exemplos:

doctest, unittest, py.test, nose, tox

14

Page 15: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

doctest

Testes são definidos em docstrings, veja exemplo:

import doctestdef funcao(x, y):

''' Faz uma coisa muito louca.>>> funcao(3, 10)108>>> funcao(8, 23)1232'''s = 0for i in range(1, 100):

if x%i==0 or y%i == 2:s += x*y - x

return s

if __name__ == '__main__':doctest.testmod()

15

Page 16: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

doctest

Saída do programa:

16

Page 17: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

doctest

O programa só gera saída se for encontrado algum erro!

17

Page 18: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

doctest

Testes são definidos em docstrings, veja exemplo:

import doctestdef funcao(x, y):

''' Faz uma coisa muito louca.>>> funcao(3, 10)1080>>> funcao(8, 23)1232'''s = 0for i in range(1, 100):

if x%i==0 or y%i == 2:s += x*y - x

return s

if __name__ == '__main__':doctest.testmod()

18

Page 19: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

doctest

Saída do programa:

**********************************************************************File "aula.py", line 5, in __main__.funcaoFailed example: funcao(3, 10)Expected: 1080Got: 108**********************************************************************1 items had failures: 1 of 2 in __main__.funcao***Test Failed*** 1 failures.

19

Page 20: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

doctest

import doctest

...

def fatorial(n):''' Calcula o fatorial de n>>> fatorial(5)120>>> fatorial(0)1>>> fatorial(2)2'''if n <= 1: return nelse: return n*fatorial(n-1)

if __name__ == '__main__':doctest.testmod() 20

Page 21: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

doctest

Saída do programa:

**********************************************************************File "aula.py", line 20, in __main__.fatorialFailed example: fatorial(0)Expected: 1Got: 0**********************************************************************1 items had failures: 1 of 3 in __main__.fatorial***Test Failed*** 1 failures.

21

Page 22: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

doctest

import doctest

...

def fatorial(n):''' Calcula o fatorial de n>>> fatorial(5)120>>> fatorial(0)1>>> fatorial(2)2'''if n <= 1: return 1else: return n*fatorial(n-1)

if __name__ == '__main__':doctest.testmod() 22

Page 23: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

doctest - testfile

Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo todos os testes que desejar:

Exemplo, arquivo sobre.txt:

Sobre o módulo aula.

Importe o módulo fazendo:>>> from aula import *

Este módulo contém uma função chamada fatorial, que calcula o fatorial de um número (dããã).Exemplo:

>>> fatorial(5)120>>> fatorial(0)1>>> fatorial(2)2

23

Page 24: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

doctest - testfile

Programa para executar os testes:

import doctest

if __name__ == '__main__': doctest.testfile('sobre.txt')

24

Page 25: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

E se...

Se quisermos testar a função fatorial para todos os valores entre 0 e 50?

Colocar tudo na documentação é muito feio...

25

Page 26: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

unittest

Podemos criar objetos cujo único objetivo é fazer testes de código.

import unittest

from aula import fatorial

class Testador(unittest.TestCase):def test_fatorial(self):

self.assertEqual(fatorial(0), 1)self.assertEqual(fatorial(1), 1)self.assertEqual(fatorial(2), 2)self.assertEqual(fatorial(5), 120)

if __name__ == '__main__': unittest.main()

26

Page 27: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

unittest

Saída do programa:

.----------------------------------------------------------------------Ran 1 test in 0.000s

OK

27

Page 28: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

unittest

Saída do programa (caso o programa esteja errado):

F======================================================================FAIL: test_fatorial (__main__.Testador)----------------------------------------------------------------------Traceback (most recent call last): File "tutu.py", line 7, in test_fatorial self.assertEqual(fatorial(0), 1)AssertionError: 0 != 1

----------------------------------------------------------------------Ran 1 test in 0.000s

FAILED (failures=1)

28

Page 29: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

unittest

Aperfeiçoando nosso teste:

import unittestimport math

from aula import fatorial

class Testador(unittest.TestCase):def test_fatorial(self):

for i in range(0, 51):self.assertEqual(fatorial(i), math.factorial(i))

if __name__ == '__main__': unittest.main()

29

Page 30: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

unittest

Adicionando ao programa aula.py:

def primo(n):'''Retorna True se n eh primo.'''if n in (0, 1):

return False

for i in range(2, n):if n%i == 0:

return False

return True

30

Page 31: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

unittest

Outros tipos de teste possíveis no unittest:

import unittestimport math

from aula import *

class Testador(unittest.TestCase):...def test_primo(self):

'''Testa funcao primo.'''self.assertTrue(primo(13))self.assertFalse(primo(0))self.assertFalse(primo(4), msg='Quatro não é primo')

if __name__ == '__main__': unittest.main()

31

Page 32: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

unittest

Saída do programa:..----------------------------------------------------------------------Ran 2 tests in 0.001s

OK

32

Page 33: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

unittest

Outros possíveis assert*

# Verifica se a é diferente de bself.assertNotEqual(a, b)

# Verifica se primo('batata') vai gerar um TypeErrorself.assertRaises(TypeError, primo, 'batata')

# Verifica se valor pertence a Lself.assertIn(valor, L)

# Verifica se a>bself.assertGreater(a, b)

33

Page 34: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

34

Page 35: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

Trabalho35

Page 36: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

Trabalho

36

Individual, em dupla, ou em trio

Prazo de entrega: 2 de março

Objetivo: criar um programa em Python para resolver algum problema mais complexo do que os que fizemos em aula

O programa deve ter:

- Interface gráfica (tkinter)- Classes- Tratamento de exceções- arquivos- numpy

Page 37: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

37

Page 38: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

Provas38

Page 39: Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo

Datas das próximas provas

39

Previsão de datas:

P2: 24/02

P3: 09/03