Post on 20-Jan-2019
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
Ferramentas de teste para a linguagemPython
Jose Fonseca
Faculdade de Engenharia da Universidade do Porto
17 Maio 2005, Teste e Qualidade de Software
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
Estrutura da apresentacao
1 Introducao a linguagem Python
2 Ferramentas para testes unitariosdoctestPyUnit
3 Ferramentas para cobertura de codigocoverage.py
4 Ferramentas para profilingPython profiler
5 IDEseric3PyDev
6 Outras ferramentas
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
Python – Breve descricao da linguagem
interpretada
interactiva
orientada por objectos (tudo e um objecto, heranca multipla)
introspectiva
sintaxe elegante (indentacao faz parte da sintaxe)
suporte nativo para alguns tipos de dados de alto nıvel (string,list, dictionary)
biblioteca rica (expressoes regulares, HTTP, XML, . . . )
extensıvel (com modulos compilados em C ou C++)
embebıvel noutra aplicacao (ABAQUS, Blender, Paint Shop Pro8, Vim, . . . )
portavel (Unix, Windows, Mac OS, Nokia S60, . . . )
varios toolkits graficos disponıveis (TK, GTK, QT, wxWidgets,. . . )
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
Python – Exemplo de uma sessao interactiva
$ python
Python 2.3.5 (#2, Mar 27 2005, 09:43:31)
[GCC 3.3.5 (Debian 1:3.3.5 -12)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> tax = 12.5 /100
>>> price = 100.50
>>> price * tax
12.5625
>>> price + _
113.0625
>>> round(_, 2)
113.06
>>>
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
Python – Exemplo de uma funcao
ex func.py
def prime(n):”””Retorna verdadeiro ou falso consoante n e umnumero primo.”””
for i in range(2, n): # ciclo de 2 a n−1if not n % i: # resto da divisao inteira
return Falsereturn True
print prime(10)print prime(11)
$ python ex_func.py
False
True
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
Python – Exemplo de uma classe
ex class.py
class Complex:”””Representacao de um numero complexo.”””
def init (self, real=0.0, imag=0.0):”””Constructor.”””self.real = realself.imag = imag
def mul (self, other):”””Produto de dois numeros complexos.”””return Complex(
self.real∗other.real − self.imag∗other.imag,self.real∗other.imag + self.imag∗other.real)
def conj(self):return Complex(self.real, −self.imag)
def str (self):”””Representacao textual do numero.”””return ”%g+%gi” % (self.real, self.imag) # formatacao
a = Complex(1,2)print aprint a∗a.conj()
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
Python – Exemplo de uma classe
$ python ex_class.py
1+2i
5+0i
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
Python – Mais informacao
Python homepagehttp://www.python.org/
Python Introductionhttp://www.python.org/doc/Introduction.html
Python Tutorialhttp://www.python.org/doc/current/tut/
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
doctest – Descricao
Procura na propria documentacao do codigo a especificacao decasos de teste.
Os casos de teste servem quer para verificacao quer paraexemplificacao do uso.
Pode ser usado em modulos, funcoes, classes e metodos.
Parte da biblioteca standard da linguagem.
Tambem pode ser integrado com a framework PyUnit.
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
doctest – Exemplo
ex doctest.py
def factorial(n):”””Return the factorial of n, an exact integer >= 0.
If the result is small enough to fit in an int, return an int.Else return a long.
>>> [factorial(n) for n in range(6)][1, 1, 2, 6, 24, 120]>>> factorial(30)265252859812191058636308480000000L>>> factorial(−1)Traceback (most recent call last):
...ValueError: n must be >= 0
Factorials of floats are OK, but the float must be an exact integer:>>> factorial(30.1)Traceback (most recent call last):
...ValueError: n must be exact integer
It must also not be ridiculously large:>>> factorial(1e100)Traceback (most recent call last):
...OverflowError: n too large”””
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
doctest – Exemplo
import mathif not n >= 0:
raise ValueError(”n must be >= 0”)if math.floor(n) != n:
raise ValueError(”n must be exact integer”)if n+1 == n: # catch a value like 1e300
raise OverflowError(”n too large”)result = 1factor = 2while factor <= n:
result ∗= factorfactor += 1
return result
if name == ” main ”:import doctestdoctest.testmod()
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
doctest – Exemplo
$ python ex_doctest.py -v
Running __main__.__doc__
0 of 0 examples failed in __main__.__doc__
Running __main__.factorial.__doc__
Trying: [factorial(n) for n in range (6)]
Expecting: [1, 1, 2, 6, 24, 120]
ok
Trying: factorial (30)
Expecting: 265252859812191058636308480000000L
ok
Trying: factorial (-1)
Expecting:
Traceback (most recent call last):
...
ValueError: n must be >= 0
ok
Trying: factorial (30.1)
Expecting:
Traceback (most recent call last):
...
ValueError: n must be exact integer
ok
Trying: factorial (1e100)
Expecting:
Traceback (most recent call last):
...
OverflowError: n too large
ok
0 of 5 examples failed in __main__.factorial.__doc__
1 items had no tests:
__main__
1 items passed all tests:
5 tests in __main__.factorial
5 tests in 2 items.
5 passed and 0 failed.
Test passed.
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
doctest – Mais informacao
Manual de referencia do modulo doctesthttp://docs.python.org/lib/module-doctest.html
Testing frameworks in Pythonhttp://www.ibm.com/developerworks/linux/library/l-cptest.html
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
PyUnit – Descricao
E uma versao em Python da framework JUnit.
Suporta a automacao de testes, a partilha de codigo deinicializacao e finalizacao de testes, a agregacao de testes emcoleccoes, e a separacao entre os testes e a interface com outilizador.
Incluıda na biblioteca standard desde a versao 2.1 da linguagem.
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
PyUnit – Exemplo
ex unittest.py
import random # modulo a testarimport unittest # definicao da classe para casos de teste
class TestSequenceFunctions(unittest.TestCase):
def setUp(self):self.seq = range(10)
def testshuffle(self):# certifica que a sequencia baralhada nao perdeu elementosrandom.shuffle(self.seq)self.seq.sort()self.assertEqual(self.seq, range(10))
def testchoice(self):element = random.choice(self.seq)self.assert (element in self.seq)
def testsample(self):self.assertRaises(ValueError, random.sample, self.seq, 20)for element in random.sample(self.seq, 5):
self.assert (element in self.seq)
if name == ’ main ’:unittest.main()
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
PyUnit – Exemplo
$ python ex_unittest.py -v
testchoice (__main__.TestSequenceFunctions) ... ok
testsample (__main__.TestSequenceFunctions) ... ok
testshuffle (__main__.TestSequenceFunctions) ... ok
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
PyUnit – Mais informacao
Manual de referencia do modulo unittesthttp://docs.python.org/lib/module-unittest.html
PyUnit homepagehttp://pyunit.sf.net/
Testing frameworks in Pythonhttp://www.ibm.com/developerworks/linux/library/l-cptest.html
Dive Into Python: Unit Testinghttp://www.diveintopython.org/unit_testing/
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
coverage.py – Descricao
E um modulo em Python que mede a cobertura de linhas decodigo durante a execucao.
Usa as ferramentas de analise de codigo e as callbacks dedepuracao de codigo fornecidas pela biblioteca standard dalinguagem para determinar quais as linhas executaveis e quaisforam executadas, respectivamente.
Acumula a informacao das instrucoes executadas ao longo devarias execucoes.
Gera relatorios e/ou anota o codigo fonte com as linhascobertas.
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
coverage.py – Exemplo
ex coverage.py
def abs(x):if x < 0:
return −xelse:
return x
print abs(−1)
$ python coverage.py -e
$ python coverage.py -x ex_coverage.py
$ python coverage.py -r -m ex_coverage.py
Name Stmts Exec Cover Missing
-------------------------------------------
ex_coverage 5 4 80% 5
$ python coverage.py -a ex_coverage.py
ex coverage.py anotado
1 > def abs ( x ) :2 > i f x < 0 :3 > r e t u r n −x4 ! e l s e :5 ! r e t u r n x67 > p r i n t abs (−1)
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
coverage.py – Mais informacao
coverage homepagehttp://www.nedbatchelder.com/code/modules/coverage.html
Statement coverage for Pythonhttp://www.garethrees.org/2001/12/04/python-coverage/
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
Python profiler – Descricao
Profiling determinıstico de qualquer programa em Python.
Ferramentas para gerar relatorios de modo a permitir examinaros resultados da operacao de profiling.
Parte integrante da biblioteca nativa da linguagem Python.
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
Python profiler – Estatısticas por funcao
ncalls numero de chamadas
tottime tempo total gasto na funcao (excluindo o tempo gastoem chamadas a sub-funcoes)
percall quociente de tottime por ncalls
cumtime tempo total gasto na funcao e todas as sub-funcoes(desde a invocacao ate ao retorno)
percall quociente de percall por ncalls
filename:lineno(function) referencia a funcao
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
Python profiler – Exemplo 1
ex profile1.py
def ismultiple(n, i):return n % i == 0
def isprime(n):for i in range(2,n):
if ismultiple(n, i):return False
return True
def main():for i in range(2,1000):
if isprime(i):print i,
main()
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
Python profiler – Exemplo 2
ex profile2.py
primes = [] # guardar os primos anteriores
def ismultiple(n, i):return n % i == 0
def isprime(n):import mathglobal primessn = int(math.sqrt(n))for i in primes:
if i > sn: # terminar na raiz quadradabreak
if ismultiple(n, i):return False
primes.append(n)return True
def main():for i in range(2,1000):
if isprime(i):print i,
main()
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
Python profiler – Resultados
$ python -m profile ex_profile1.py
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113
127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233
239 241 251 257 263 269 271 277 281 283 293 307 311 313 317 331 337 347 349 353 359
367 373 379 383 389 397 401 409 419 421 431 433 439 443 449 457 461 463 467 479 487
491 499 503 509 521 523 541 547 557 563 569 571 577 587 593 599 601 607 613 617 619
631 641 643 647 653 659 661 673 677 683 691 701 709 719 727 733 739 743 751 757 761
769 773 787 797 809 811 821 823 827 829 839 853 857 859 863 877 881 883 887 907 911
919 929 937 941 947 953 967 971 977 983 991 997
79023 function calls in 0.530 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.520 0.520 <string >:1(?)
1 0.000 0.000 0.520 0.520 ex_profile1.py:1(?)
78021 0.230 0.000 0.230 0.000 ex_profile1.py:1( ismultiple)
1 0.000 0.000 0.520 0.520 ex_profile1.py:10( main)
998 0.290 0.000 0.520 0.001 ex_profile1.py:4( isprime)
1 0.010 0.010 0.530 0.530 profile :0( execfile(’ex_profile1.py ’))
0 0.000 0.000 profile :0( profiler)
$ python -m profile ex_profile2.py
...
3802 function calls in 0.040 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.020 0.020 <string >:1(?)
1 0.000 0.000 0.020 0.020 ex_profile2.py:1(?)
1 0.000 0.000 0.020 0.020 ex_profile2.py:18( main)
2800 0.000 0.000 0.000 0.000 ex_profile2.py:3( ismultiple)
998 0.020 0.000 0.020 0.000 ex_profile2.py:6( isprime)
1 0.020 0.020 0.040 0.040 profile :0( execfile(’ex_profile2.py ’))
0 0.000 0.000 profile :0( profiler)
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
Python profiler – Mais informacao
Manual de referencia do modulo profilehttp://docs.python.org/lib/profile.html
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
IDEs – eric3
Escrito em Python.
Integra ferramentas de:
debuggingunit testingcode coverageprofiling
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
IDEs – eric3
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
IDEs – eric3
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
IDEs – PyDev
Plug-in para o eclipse (escrito em Java).
Integra ferramentas de:
debuggingcode coveragerefactoring
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
IDEs – PyDev
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
IDEs – PyDev
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
IDEs – Mais informacao
eric3 Python IDEhttp://www.die-offenbachs.de/detlev/eric3.html
PyDev Eclipse pluginhttp://pydev.sf.net/
Integrated Development Environments – PythonInfo Wikihttp://wiki.python.org/moin/IntegratedDevelopmentEnvironments
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
Outras ferramentas
Python debuggerhttp://docs.python.org/lib/module-pdb.html
Pylint – analisa estaticamente codigo python a procura de bugs ou codigode ma qualidadehttp://www.logilab.org/projects/pylint
Ferramentas deteste para alinguagemPython
Jose Fonseca
Introducao
Testes unitarios
doctest
PyUnit
Cobertura decodigo
coverage.py
Profiling
Python profiler
IDEs
eric3
PyDev
Outrasferramentas
Questoes?