Minicurso/tutorial sobre o py.test e o tox apresentado na UFLA (Universidade Federal de Lavras), Minas Gerais, no dia 2014-10-27, durante a SETI (Semana de Tecnologia da Informação).
http://seti.compjunior.com.br/
Descrição do tutorial:
Tutorial para o aprendizado sobre o uso prático do pacote py.test para realização de testes de diversos tipos.
9. py Testando com py..tteesstt ee ttooxx –– DDaanniilloo JJ.. SS.. BBeelllliinnii
@@ddaanniilloobbeelllliinnii –– SSEETTII // UUFFLLAA –– 22001144--1100--2277 –– LLaavvrraass // MMGG
EExxcceeççããoo
● MMooddiiffiiqquuee aa ffuunnççããoo ffaattoorriiaall ppaarraa llaannççaarr uummaa eexxcceeççããoo
VVaalluueeEErrrroorr qquuaannddoo aa eennttrraaddaa ffoorr nneeggaattiivvaa..
if n < 0:
if n < 0:
raise ValueError("Use apenas inteiros positivos")
raise ValueError("Use apenas inteiros positivos")
● CCoommoo tteessttaarr iissssoo?
– GGeerreenncciiaaddoorr ddee ccoonntteexxttoo!!
with pytest.raises(ValueError):
with pytest.raises(ValueError):
# Fazer algo que deveria lançar um ValueError
# Fazer algo que deveria lançar um ValueError
– CCrriiee ppeelloo mmeennooss ddooiiss tteesstteess ccoonntteennddoo eessssee ggeerreenncciiaaddoorr ddee
ccoonntteexxttoo,, uumm nnoo qquuaall aa eexxcceeççããoo ooccoorrrree ee oouuttrroo nnoo qquuaall aa
eexxcceeççããoo nnããoo ooccoorrrree..
● AAllgguumm tteessttee ffaallhhoouu?
02_05
10. py Testando com py..tteesstt ee ttooxx –– DDaanniilloo JJ.. SS.. BBeelllliinnii
@@ddaanniilloobbeelllliinnii –– SSEETTII // UUFFLLAA –– 22001144--1100--2277 –– LLaavvrraass // MMGG
Podemos usar um “xfail” (expected
to fail) no primeiro teste de exceção
realizado que sabíamos que
falharia (um dos 2 testes do 02_05)
inserindo o seguinte decorator na
rotina de testes:
SSkkiipp//xxffaaiill
● HHáá tteesstteess qquuee ppooddeemm ffaazzeerr sseennttiiddoo eemm ssoommeennttee uumm
ddooss aammbbiieenntteess ((ee..gg.. tteessttee qquuee ddeeppeennddee ddoo
iitteerrttoooollss..aaccccuummuullaattee ddoo PPyytthhoonn 33))..
● CCoonnddiicciioonnaall
– ppyytteesstt..mmaarrkk..sskkiippiiff
– ppyytteesstt..mmaarrkk..xxffaaiill
● IImmppeerraattiivvoo ((ccoommaannddooss))
– ppyytteesstt..sskkiipp
– ppyytteesstt..xxffaaiill
@@ppyytteesstt..mmaarrkk..xxffaaiill
Extra!
11. py Testando com py..tteesstt ee ttooxx –– DDaanniilloo JJ.. SS.. BBeelllliinnii
@@ddaanniilloobbeelllliinnii –– SSEETTII // UUFFLLAA –– 22001144--1100--2277 –– LLaavvrraass // MMGG
TTeessttaannddoo aa mmeennssaaggeemm ddee eexxcceeççããoo
● OO bbllooccoo wwiitthh aappeennaass tteessttaa ssee aa eexxcceeççããoo ooccoorrrreeuu..
PPoossssiivveellmmeennttee aa eexxcceeççããoo ppooddeerriiaa tteerr ooccoorrrriiddoo ccoomm uummaa
mmeennssaaggeemm ddiiffeerreennttee ddaa ddeesseejjaaddaa ((ee..gg.. ppoorr eexxiissttiirr mmaaiiss ddee
uummaa ffoorrmmaa ppaarraa oo vvaalloorr ddee eennttrraaddaa eessttaarr ffoorraa ddoo ddoommíínniioo ddee
aapplliiccaabbiilliiddaaddee ddaa ffuunnççããoo))
● FFaaççaa uumm tteessttee uussaannddoo aa eennttrraaddaa ““22jj”” ((oo nnúúmmeerroo iimmaaggiinnáárriioo 22)),,
aa qquuaall llaannççaa uumm TTyyppeeEErrrroorr.. VVeerriiffiiqquuee ssee aa mmeennssaaggeemm ccoonnttéémm
aa ppaallaavvrraa ““ccoommpplleexx””..
02_07
with pytest.raises(TypeError):
with pytest.raises(TypeError):
try:
# Bloco que deveria lançar a exceção
except TypeError as exc:
assert "complex" in str(exc)
raise # Propaga o TypeError
try:
# Bloco que deveria lançar a exceção
except TypeError as exc:
assert "complex" in str(exc)
raise # Propaga o TypeError 02_06
…… ee uussaannddoo oo ppyy..ccooddee..EExxcceeppttiioonnIInnffoo(()) ......
with pytest.raises(TypeError) as excinfo:
with pytest.raises(TypeError) as excinfo:
# Bloco que deveria lançar a exceção
# Bloco que deveria lançar a exceção
assert "complex" in str(excinfo.value)
assert "complex" in str(excinfo.value)
Dica: Troque o nome
“complex” por outro
que não existe na
string, a fim de “testar
o teste” e assegurar
de que ele realmente
está verificando essa
informação.
12. py Testando com py..tteesstt ee ttooxx –– DDaanniilloo JJ.. SS.. BBeelllliinnii
@@ddaanniilloobbeelllliinnii –– SSEETTII // UUFFLLAA –– 22001144--1100--2277 –– LLaavvrraass // MMGG
DDoocctteessttss ((tteesstteess ddee ddooccuummeennttaaççããoo))
● Coommppaarraa tteexxttoo
● IImmpplleemmeennttee aa
ffuunnççããoo aaoo llaaddoo eemm
uumm aarrqquuiivvoo nnoottaa..ppyy
● Chhaammee oo ppyy..tteesstt
ccoomm::
● Coollooqquuee uumm tteessttee
ddee ddooccuummeennttaaççããoo
ccoomm uummaa ssttrriinngg
ccoommoo eennttrraaddaa
def nome_nota(pitch):
def nome_nota(pitch):
"""
Encontra o nome da nota dado o pitch
MIDI (dado em semitons) caso
esteja na pentatonica de Am.
>>> nome_nota(69) # A4 (La central)
'A'
>>> nome_nota(70) # Bb4
Traceback (most recent call last):
"""
Encontra o nome da nota dado o pitch
MIDI (dado em semitons) caso
esteja na pentatonica de Am.
>>> nome_nota(69) # A4 (La central)
'A'
>>> nome_nota(70) # Bb4
Traceback (most recent call last):
...
...
ValueError: Fora da escala!
"""
ans = []
if pitch % 12 == 0:
ValueError: Fora da escala!
"""
ans = []
if pitch % 12 == 0:
return "C"
return "C"
if pitch % 12 == 2:
if pitch % 12 == 2:
return "D"
return "D"
if pitch % 12 == 4:
if pitch % 12 == 4:
return "E"
return "E"
if pitch % 12 == 7:
if pitch % 12 == 7:
return "G"
return "G"
if pitch % 12 == 9:
if pitch % 12 == 9:
return "A"
return "A"
raise ValueError("Fora da escala!")
raise ValueError("Fora da escala!")
03_01
$$ ppyy..tteesstt ----ddoocctteesstt--mmoodduulleess
… (Ellipsis):
Parte do doctest
para “casar com
o que vier”
03_02