Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não...

Post on 26-Nov-2018

219 views 0 download

Transcript of Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula11T.pdf · doctest - testfile Os testes não...

Computação 2

Aula 11 Teóricaprofessor: Leonardo Carvalho

SciPy2

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

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

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

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

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')

...

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()

SciPy - interpolate

9

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

11

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

Testes automáticos

13

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

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

doctest

Saída do programa:

16

doctest

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

17

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

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

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

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

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

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

doctest - testfile

Programa para executar os testes:

import doctest

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

24

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

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

unittest

Saída do programa:

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

OK

27

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

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

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

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

unittest

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

OK

32

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

34

Trabalho35

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

37

Provas38

Datas das próximas provas

39

Previsão de datas:

P2: 24/02

P3: 09/03