SlideShare ist ein Scribd-Unternehmen logo
1 von 30
Downloaden Sie, um offline zu lesen
1/30
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO
Plugin
pytest-doctest-custom
v1.0.0
Hackeando doctests com o plugin (ementa):
https://gist.github.com/danilobellini/b76a36c4fcc946ecb1d6cb92987f30d3
Plugin:
https://github.com/danilobellini/pytest-doctest-custom
PyPI:
https://pypi.python.org/pypi/pytest-doctest-custom
Plugin
pytest-doctest-custom
v1.0.0
Hackeando doctests com o plugin (ementa):
https://gist.github.com/danilobellini/b76a36c4fcc946ecb1d6cb92987f30d3
Plugin:
https://github.com/danilobellini/pytest-doctest-custom
PyPI:
https://pypi.python.org/pypi/pytest-doctest-custom
2/30
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO
Testes – Por quê?Testes – Por quê?
“[...], perhaps the most important
benefit of unit tests is not that it
ensures that your code works - it's that
it ensures that it stays working, that is,
that a future change doesn't cause a
regression.”
https://www.wiki.wxpython.org/Unit%20Testing%20with%20wxPython
“[...], perhaps the most important
benefit of unit tests is not that it
ensures that your code works - it's that
it ensures that it stays working, that is,
that a future change doesn't cause a
regression.”
https://www.wiki.wxpython.org/Unit%20Testing%20with%20wxPython
3/30
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO
doctest
documentation + tests
standard library
doctest
documentation + tests
standard library
4/30
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO
docstringsdocstrings
● Documentação inserida no próprio código
● Acessada pela função help() do Python e pelo
“?” no IPython
● Armazenada no atributo “__doc__”
● Pode constar em:
– Funções
– Métodos
– Classes
– Módulos/pacotes
● Documentação inserida no próprio código
● Acessada pela função help() do Python e pelo
“?” no IPython
● Armazenada no atributo “__doc__”
● Pode constar em:
– Funções
– Métodos
– Classes
– Módulos/pacotes
def snake2ucamel(value):
"""Converte snake_case em UpperCamelCase."""
return "".join(el.capitalize()
for el in value.split("_"))
def snake2ucamel(value):
"""Converte snake_case em UpperCamelCase."""
return "".join(el.capitalize()
for el in value.split("_"))
docstring
5/30
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO
doctestdoctest
● Documentação pode conter exemplos
– Por que não testar os exemplos?
● Consistência
● Standard library e pronto para usar:
python -m doctest nome_arquivo
● Procura por exemplos como no REPL do Python:
>>> comando
... continuação
resultado
● Compara strings de representação, não valores
– Dependente da ordenação (não serve para sets/dicts)
● Documentação pode conter exemplos
– Por que não testar os exemplos?
● Consistência
● Standard library e pronto para usar:
python -m doctest nome_arquivo
● Procura por exemplos como no REPL do Python:
>>> comando
... continuação
resultado
● Compara strings de representação, não valores
– Dependente da ordenação (não serve para sets/dicts)
6/30
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO
def snake2ucamel(value):
"""
Converte snake_case em UpperCamelCase.
Exemplo:
>>> snake2ucamel("teste")
'Teste'
>>> snake2ucamel("um_nome_muito_longo")
'UmNomeMuitoLongo'
"""
return "".join(el.capitalize() for el in value.split("_"))
def snake2ucamel(value):
"""
Converte snake_case em UpperCamelCase.
Exemplo:
>>> snake2ucamel("teste")
'Teste'
>>> snake2ucamel("um_nome_muito_longo")
'UmNomeMuitoLongo'
"""
return "".join(el.capitalize() for el in value.split("_"))
$ python -m doctest snake2ucamel.py -v
Trying:
snake2ucamel("teste")
Expecting:
'Teste'
ok
Trying:
snake2ucamel("um_nome_muito_longo")
Expecting:
'UmNomeMuitoLongo'
ok
1 items had no tests:
snake2ucamel
1 items passed all tests:
2 tests in snake2ucamel.snake2ucamel
2 tests in 2 items.
2 passed and 0 failed.
Test passed.
$ python -m doctest snake2ucamel.py -v
Trying:
snake2ucamel("teste")
Expecting:
'Teste'
ok
Trying:
snake2ucamel("um_nome_muito_longo")
Expecting:
'UmNomeMuitoLongo'
ok
1 items had no tests:
snake2ucamel
1 items passed all tests:
2 tests in snake2ucamel.snake2ucamel
2 tests in 2 items.
2 passed and 0 failed.
Test passed.
7/30
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO
py.test
e
tox
py.test
e
tox
8/30
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO
py.testpy.test
● Instalação:
pip install pytest
● Uso sem argumentos:
py.test
ou
python -m pytest
● Instalação:
pip install pytest
● Uso sem argumentos:
py.test
ou
python -m pytest
● Coleta automática pelo
nome:
– Funções/métodos: test*
– Classes: Test*
– Arquivos: test_*.py
● Uso do statement “assert”
● Coleta automática pelo
nome:
– Funções/métodos: test*
– Classes: Test*
– Arquivos: test_*.py
● Uso do statement “assert”
def snake2ucamel(value):
"""Converte snake_case em UpperCamelCase."""
return "".join(el.capitalize() for el in value.split("_"))
def test_empty():
assert snake2ucamel("") == ""
def test_no_under():
assert snake2ucamel("maxsize") == "Maxsize"
assert snake2ucamel("abigname") == "Abigname"
def test_has_under():
assert snake2ucamel("max_size") == "MaxSize"
assert snake2ucamel("a_big_name") == "ABigName"
def snake2ucamel(value):
"""Converte snake_case em UpperCamelCase."""
return "".join(el.capitalize() for el in value.split("_"))
def test_empty():
assert snake2ucamel("") == ""
def test_no_under():
assert snake2ucamel("maxsize") == "Maxsize"
assert snake2ucamel("abigname") == "Abigname"
def test_has_under():
assert snake2ucamel("max_size") == "MaxSize"
assert snake2ucamel("a_big_name") == "ABigName"
9/30
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO
def snake2ucamel(value):
"""Converte snake_case em UpperCamelCase."""
return "".join(el.capitalize() for el in value.split("_"))
def test_empty():
assert snake2ucamel("") == ""
def test_no_under():
assert snake2ucamel("maxsize") == "Maxsize"
assert snake2ucamel("abigname") == "Abigname"
def test_has_under():
assert snake2ucamel("max_size") == "MaxSize"
assert snake2ucamel("a_big_name") == "ABigName"
def snake2ucamel(value):
"""Converte snake_case em UpperCamelCase."""
return "".join(el.capitalize() for el in value.split("_"))
def test_empty():
assert snake2ucamel("") == ""
def test_no_under():
assert snake2ucamel("maxsize") == "Maxsize"
assert snake2ucamel("abigname") == "Abigname"
def test_has_under():
assert snake2ucamel("max_size") == "MaxSize"
assert snake2ucamel("a_big_name") == "ABigName"
$ py.test
========= test session starts ==========
platform linux -- Python 3.5.2, pytest-
2.9.2, py-1.4.31, pluggy-0.3.1
rootdir:
/home/danilo/Desktop/Grupy_2016-08-
13/Exemplos/pytest, inifile:
plugins: doctest-custom-1.1.0.dev0, cov-
2.3.1, timeout-1.0.0
collected 3 items
test_snake2ucamel.py ...
======= 3 passed in 0.01 seconds =======
$ py.test
========= test session starts ==========
platform linux -- Python 3.5.2, pytest-
2.9.2, py-1.4.31, pluggy-0.3.1
rootdir:
/home/danilo/Desktop/Grupy_2016-08-
13/Exemplos/pytest, inifile:
plugins: doctest-custom-1.1.0.dev0, cov-
2.3.1, timeout-1.0.0
collected 3 items
test_snake2ucamel.py ...
======= 3 passed in 0.01 seconds =======
10/30
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO
py.testpy.test
● Suporte a plugins
+ plugins internos
● Inclui plugins prontos
● Fixtures!
● Testes parametrizados
● FLOSS
– Eu que fiz o plugin interno do py.test
isolar/contar corretamente os doctests
● Não te obriga a usar assertNomesForaDaPEP8
http://pytest.org
● Suporte a plugins
+ plugins internos
● Inclui plugins prontos
● Fixtures!
● Testes parametrizados
● FLOSS
– Eu que fiz o plugin interno do py.test
isolar/contar corretamente os doctests
● Não te obriga a usar assertNomesForaDaPEP8
http://pytest.org
11/30
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO
toxtox
● Gerenciador de
virtualenvs
– Automação
– Testes em vários
ambientes
– Diferentes versões
do Python e/ou de
algum requisito
● Configurável
– tox.ini
● Gerenciador de
virtualenvs
– Automação
– Testes em vários
ambientes
– Diferentes versões
do Python e/ou de
algum requisito
● Configurável
– tox.ini
[tox]
envlist = py{36,35,34,27}
skipsdist = True
[testenv]
deps = pytest
commands = py.test {posargs}
[tox]
envlist = py{36,35,34,27}
skipsdist = True
[testenv]
deps = pytest
commands = py.test {posargs}
$ tox
[...]
py36 runtests: commands[0] | py.test
[...]
py35 runtests: commands[0] | py.test
[...]
py34 runtests: commands[0] | py.test
[...]
py27 runtests: commands[0] | py.test
[...]
_______________ summary
________________
py36: commands succeeded
py35: commands succeeded
py34: commands succeeded
py27: commands succeeded
congratulations :)
$ tox
[...]
py36 runtests: commands[0] | py.test
[...]
py35 runtests: commands[0] | py.test
[...]
py34 runtests: commands[0] | py.test
[...]
py27 runtests: commands[0] | py.test
[...]
_______________ summary
________________
py36: commands succeeded
py35: commands succeeded
py34: commands succeeded
py27: commands succeeded
congratulations :)
12/30
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO
[tox]
envlist = py{36,35,34,27}
skipsdist = True
[testenv]
deps = pytest
commands = py.test {posargs}
[pytest]
addopts = --doctest-modules
[tox]
envlist = py{36,35,34,27}
skipsdist = True
[testenv]
deps = pytest
commands = py.test {posargs}
[pytest]
addopts = --doctest-modules
Misturando
tudo!
Misturando
tudo!
from snake2ucamel import snake2ucamel
def test_empty():
assert snake2ucamel("") == ""
def test_no_under():
assert snake2ucamel("maxsize") == "Maxsize"
assert snake2ucamel("abigname") == "Abigname"
def test_has_under():
assert snake2ucamel("max_size") == "MaxSize"
assert snake2ucamel("a_big_name") == "ABigName"
from snake2ucamel import snake2ucamel
def test_empty():
assert snake2ucamel("") == ""
def test_no_under():
assert snake2ucamel("maxsize") == "Maxsize"
assert snake2ucamel("abigname") == "Abigname"
def test_has_under():
assert snake2ucamel("max_size") == "MaxSize"
assert snake2ucamel("a_big_name") == "ABigName"
def snake2ucamel(value):
"""
Converte snake_case em UpperCamelCase.
Exemplo:
>>> snake2ucamel("teste")
'Teste'
>>> snake2ucamel("um_nome_muito_longo")
'UmNomeMuitoLongo'
"""
return "".join(el.capitalize() for el in value.split("_"))
def snake2ucamel(value):
"""
Converte snake_case em UpperCamelCase.
Exemplo:
>>> snake2ucamel("teste")
'Teste'
>>> snake2ucamel("um_nome_muito_longo")
'UmNomeMuitoLongo'
"""
return "".join(el.capitalize() for el in value.split("_"))
tox.ini
snake2ucamel.py
test_snake2ucamel.py
doctests com
o py.test
apenas
editando o
tox.ini
$ tox
[...]
py36 runtests: commands[0] | py.test
[… detalhado abaixo ...]
py35 runtests: commands[0] | py.test
[...]
py34 runtests: commands[0] | py.test
[...]
py27 runtests: commands[0] | py.test
[...]
_______________ summary
________________
py36: commands succeeded
py35: commands succeeded
py34: commands succeeded
py27: commands succeeded
congratulations :)
$ tox
[...]
py36 runtests: commands[0] | py.test
[… detalhado abaixo ...]
py35 runtests: commands[0] | py.test
[...]
py34 runtests: commands[0] | py.test
[...]
py27 runtests: commands[0] | py.test
[...]
_______________ summary
________________
py36: commands succeeded
py35: commands succeeded
py34: commands succeeded
py27: commands succeeded
congratulations :)
py36 runtests: commands[0] | py.test
========= test session starts ==========
platform linux -- Python 3.6.0a3+,
pytest-2.9.2, py-1.4.31, pluggy-0.3.1
rootdir:
/home/danilo/Desktop/Grupy_2016-08-
13/Exemplos/ambos, inifile: tox.ini
collected 4 items
snake2ucamel.py .
test_snake2ucamel.py ...
======= 4 passed in 0.03 seconds =======
py36 runtests: commands[0] | py.test
========= test session starts ==========
platform linux -- Python 3.6.0a3+,
pytest-2.9.2, py-1.4.31, pluggy-0.3.1
rootdir:
/home/danilo/Desktop/Grupy_2016-08-
13/Exemplos/ambos, inifile: tox.ini
collected 4 items
snake2ucamel.py .
test_snake2ucamel.py ...
======= 4 passed in 0.03 seconds =======
13/30
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO
Representando objetos
como strings
pprint (stdlib)
e
IPython.lib.pretty
Representando objetos
como strings
pprint (stdlib)
e
IPython.lib.pretty
14/30
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO
Representação em stringsRepresentação em strings
● Representação
– repr
– ascii
– atributo __repr__
– atributo __str__
– pprint.pformat
● Impressão / escrita em stream
– print
– pprint.pprint
– sys.stdout.write
●
● Representação
– repr
– ascii
– atributo __repr__
– atributo __str__
– pprint.pformat
● Impressão / escrita em stream
– print
– pprint.pprint
– sys.stdout.write
●
● Representação mais
legível
– Quebra de linha (list,
dict, etc.)
– Ordenação (set, dict,
etc.)
● Tratamento de recursão
– e.g. lista que contém a
si própria
● Representação mais
legível
– Quebra de linha (list,
dict, etc.)
– Ordenação (set, dict,
etc.)
● Tratamento de recursão
– e.g. lista que contém a
si própria
def impressão(objeto): # Roughly
stream.write(representação(objeto))
def impressão(objeto): # Roughly
stream.write(representação(objeto))
15/30
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO
pprint
Pretty Printer
pprint
Pretty Printer
● Standard Library
● Não é extensível
● Fallback: repr
● Internamente separado em 2
– Resultado em uma linha
– Resultado em múltiplas linhas
● API inclui:
– pprint.PrettyPrinter
– pprint.pformat
– pprint.pprint
● A classe PrettyPrinter permite personalização, mas se associa
ao sys.stdout durante a construção
● Standard Library
● Não é extensível
● Fallback: repr
● Internamente separado em 2
– Resultado em uma linha
– Resultado em múltiplas linhas
● API inclui:
– pprint.PrettyPrinter
– pprint.pformat
– pprint.pprint
● A classe PrettyPrinter permite personalização, mas se associa
ao sys.stdout durante a construção
16/30
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO
IPython.lib.prettyIPython.lib.pretty
● Fork do “pretty” do Armin Ronacher
● Extensível: procura um método “_repr_pretty_”
– Mas possui funções prontas para os tipos básicos e
coleções do Python
● Subpacote do IPython
pip install ipython
● Consistente entre diferentes versões e interpretadores
do Python
● A API inclui:
– IPython.lib.pretty.pretty
– IPython.lib.pretty.pprint
● Fork do “pretty” do Armin Ronacher
● Extensível: procura um método “_repr_pretty_”
– Mas possui funções prontas para os tipos básicos e
coleções do Python
● Subpacote do IPython
pip install ipython
● Consistente entre diferentes versões e interpretadores
do Python
● A API inclui:
– IPython.lib.pretty.pretty
– IPython.lib.pretty.pprint
17/30
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO
Unindo mundos:
pytest-doctest-custom
Unindo mundos:
pytest-doctest-custom
18/30
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO
Pytest-doctest-customPytest-doctest-custom
● Plugin para o py.test
● Ativado/controlado através de um único argumento no py.test:
--doctest-repr=MODULO:OBJETO
● Selecione a função que quiser para representar a saída de doctests, e.g.:
py.test --doctest-modules --doctest-repr=IPython.lib.pretty:pretty
● Tanto funções de representação como impressão podem ser usadas
● É o fim dos problemas com a ordenação ao fazer o seu doctest
● Plugin para o py.test
● Ativado/controlado através de um único argumento no py.test:
--doctest-repr=MODULO:OBJETO
● Selecione a função que quiser para representar a saída de doctests, e.g.:
py.test --doctest-modules --doctest-repr=IPython.lib.pretty:pretty
● Tanto funções de representação como impressão podem ser usadas
● É o fim dos problemas com a ordenação ao fazer o seu doctest
$ py.test --doctest-modules
========================= test session starts ==========================
platform linux -- Python 3.5.2, pytest-2.9.2, py-1.4.31, pluggy-0.3.1
rootdir: /home/danilo/Desktop/Grupy_2016-08-13/Exemplos/setdict,
inifile:
plugins: doctest-custom-1.1.0.dev0, cov-2.3.1, timeout-1.0.0
collected 1 items
test_setdict.py F
=============================== FAILURES ===============================
________________________ [doctest] test_setdict ________________________
002 >>> set("qwertyuiop")
Expected:
{'e', 'i', 'o', 'p', 'q', 'r', 't', 'u', 'w', 'y'}
Got:
{'r', 'e', 'q', 'w', 'y', 't', 'p', 'u', 'o', 'i'}
/home/danilo/Desktop/Grupy_2016-08-
13/Exemplos/setdict/test_setdict.py:2: DocTestFailure
======================= 1 failed in 0.02 seconds =======================
$ py.test --doctest-modules
========================= test session starts ==========================
platform linux -- Python 3.5.2, pytest-2.9.2, py-1.4.31, pluggy-0.3.1
rootdir: /home/danilo/Desktop/Grupy_2016-08-13/Exemplos/setdict,
inifile:
plugins: doctest-custom-1.1.0.dev0, cov-2.3.1, timeout-1.0.0
collected 1 items
test_setdict.py F
=============================== FAILURES ===============================
________________________ [doctest] test_setdict ________________________
002 >>> set("qwertyuiop")
Expected:
{'e', 'i', 'o', 'p', 'q', 'r', 't', 'u', 'w', 'y'}
Got:
{'r', 'e', 'q', 'w', 'y', 't', 'p', 'u', 'o', 'i'}
/home/danilo/Desktop/Grupy_2016-08-
13/Exemplos/setdict/test_setdict.py:2: DocTestFailure
======================= 1 failed in 0.02 seconds =======================
19/30
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO
$ py.test --doctest-modules --doctest-repr=IPython.lib.pretty:pretty
========================= test session starts ==========================
platform linux -- Python 3.5.2, pytest-2.9.2, py-1.4.31, pluggy-0.3.1
rootdir: /home/danilo/Desktop/Grupy_2016-08-13/Exemplos/setdict,
inifile:
plugins: doctest-custom-1.1.0.dev0, cov-2.3.1, timeout-1.0.0
collected 1 items
test_setdict.py .
======================= 1 passed in 0.01 seconds =======================
$ py.test --doctest-modules --doctest-repr=IPython.lib.pretty:pretty
========================= test session starts ==========================
platform linux -- Python 3.5.2, pytest-2.9.2, py-1.4.31, pluggy-0.3.1
rootdir: /home/danilo/Desktop/Grupy_2016-08-13/Exemplos/setdict,
inifile:
plugins: doctest-custom-1.1.0.dev0, cov-2.3.1, timeout-1.0.0
collected 1 items
test_setdict.py .
======================= 1 passed in 0.01 seconds =======================
$ py.test --doctest-modules
========================= test session starts ==========================
platform linux -- Python 3.5.2, pytest-2.9.2, py-1.4.31, pluggy-0.3.1
rootdir: /home/danilo/Desktop/Grupy_2016-08-13/Exemplos/setdict,
inifile:
plugins: doctest-custom-1.1.0.dev0, cov-2.3.1, timeout-1.0.0
collected 1 items
test_setdict.py F
=============================== FAILURES ===============================
________________________ [doctest] test_setdict ________________________
002 >>> set("qwertyuiop")
Expected:
{'e', 'i', 'o', 'p', 'q', 'r', 't', 'u', 'w', 'y'}
Got:
{'r', 'e', 'q', 'w', 'y', 't', 'p', 'u', 'o', 'i'}
/home/danilo/Desktop/Grupy_2016-08-
13/Exemplos/setdict/test_setdict.py:2: DocTestFailure
======================= 1 failed in 0.02 seconds =======================
$ py.test --doctest-modules
========================= test session starts ==========================
platform linux -- Python 3.5.2, pytest-2.9.2, py-1.4.31, pluggy-0.3.1
rootdir: /home/danilo/Desktop/Grupy_2016-08-13/Exemplos/setdict,
inifile:
plugins: doctest-custom-1.1.0.dev0, cov-2.3.1, timeout-1.0.0
collected 1 items
test_setdict.py F
=============================== FAILURES ===============================
________________________ [doctest] test_setdict ________________________
002 >>> set("qwertyuiop")
Expected:
{'e', 'i', 'o', 'p', 'q', 'r', 't', 'u', 'w', 'y'}
Got:
{'r', 'e', 'q', 'w', 'y', 't', 'p', 'u', 'o', 'i'}
/home/danilo/Desktop/Grupy_2016-08-
13/Exemplos/setdict/test_setdict.py:2: DocTestFailure
======================= 1 failed in 0.02 seconds =======================
"""
>>> set("qwertyuiop")
{'e', 'i', 'o', 'p', 'q', 'r', 't', 'u', 'w', 'y'}
>>> d = {}
>>> d["Uma primeira chave beeeem longa... "] = 1
>>> d["Outra primeira chave beeeem longa!"] = 2
>>> d
{'Outra primeira chave beeeem longa!': 2,
'Uma primeira chave beeeem longa... ': 1}
"""
"""
>>> set("qwertyuiop")
{'e', 'i', 'o', 'p', 'q', 'r', 't', 'u', 'w', 'y'}
>>> d = {}
>>> d["Uma primeira chave beeeem longa... "] = 1
>>> d["Outra primeira chave beeeem longa!"] = 2
>>> d
{'Outra primeira chave beeeem longa!': 2,
'Uma primeira chave beeeem longa... ': 1}
"""
20/30
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO
pytest-doctest-custom
dependências, testes, cobertura
pytest-doctest-custom
dependências, testes, cobertura
● Requer py.test 2.1+
● Compatível com os interpretadores
– CPython 2.6, 2.7
– CPython 3.2, 3.3., 3.4, 3.5, 3.6 (dev)
– PyPy 2.x, 4.x, 5.x
– PyPy3 2.x, 5.x
– Jython 2.7 (py.test 2.2.4+)
● Testado em todas as versões de py.test em cada um dos
interpretadores
– 337 ambientes no tox.ini
– 84 jobs no Travis CI (py.test 2.8.5+)
● Cobertura de código de 100% no módulo do plugin
● Requer py.test 2.1+
● Compatível com os interpretadores
– CPython 2.6, 2.7
– CPython 3.2, 3.3., 3.4, 3.5, 3.6 (dev)
– PyPy 2.x, 4.x, 5.x
– PyPy3 2.x, 5.x
– Jython 2.7 (py.test 2.2.4+)
● Testado em todas as versões de py.test em cada um dos
interpretadores
– 337 ambientes no tox.ini
– 84 jobs no Travis CI (py.test 2.8.5+)
● Cobertura de código de 100% no módulo do plugin
21/30
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO
pytest-doctest-custom
stream proxy
pytest-doctest-custom
stream proxy
"""
>>> set("qwertyuiop")
{'e',
'i',
'o',
'p',
'q',
'r',
't',
'u',
'w',
'y'}
"""
"""
>>> set("qwertyuiop")
{'e',
'i',
'o',
'p',
'q',
'r',
't',
'u',
'w',
'y'}
"""
● Proxies no
– pytest_doctest_custom.stdout_proxy
– pytest_doctest_custom.stderr_proxy
● Caso sua função seja de impressão em um stream que é fixado no
instante da criação, use um desses proxies
● Pode-se usar no conftest.py no mesmo diretório do projeto, por
exemplo:
● Proxies no
– pytest_doctest_custom.stdout_proxy
– pytest_doctest_custom.stderr_proxy
● Caso sua função seja de impressão em um stream que é fixado no
instante da criação, use um desses proxies
● Pode-se usar no conftest.py no mesmo diretório do projeto, por
exemplo:
$ py.test --doctest-modules --doctest-repr=conftest:doctest_pretty
========================= test session starts ==========================
platform linux -- Python 3.5.2, pytest-2.9.2, py-1.4.31, pluggy-0.3.1
rootdir: /home/danilo/Desktop/Grupy_2016-08-13/Exemplos/conftest,
inifile:
plugins: doctest-custom-1.1.0.dev0, cov-2.3.1, timeout-1.0.0
collected 1 items
test_set.py .
======================= 1 passed in 0.01 seconds =======================
$ py.test --doctest-modules --doctest-repr=conftest:doctest_pretty
========================= test session starts ==========================
platform linux -- Python 3.5.2, pytest-2.9.2, py-1.4.31, pluggy-0.3.1
rootdir: /home/danilo/Desktop/Grupy_2016-08-13/Exemplos/conftest,
inifile:
plugins: doctest-custom-1.1.0.dev0, cov-2.3.1, timeout-1.0.0
collected 1 items
test_set.py .
======================= 1 passed in 0.01 seconds =======================
# conftest.py
from IPython.lib.pretty import pretty
def doctest_pretty(value):
return pretty(value, max_width=5)
# conftest.py
from IPython.lib.pretty import pretty
def doctest_pretty(value):
return pretty(value, max_width=5)
22/30
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO
pytest-doctest-custom
internalidades
pytest-doctest-custom
internalidades
● doctest.DocTestRunner.run
– Modifica sys.stdout e sys.stderr
– Troca sys.displayhook pelo dunder
● doctest.DocTestRunner._DocTestRunner__run
– Utiliza sys.displayhook para a impressão
dos resultados dos doctests
● O plugin altera o método run para
temporariamente trocar o sys.__displayhook__
por uma função personalizada de impressão
● doctest.DocTestRunner.run
– Modifica sys.stdout e sys.stderr
– Troca sys.displayhook pelo dunder
● doctest.DocTestRunner._DocTestRunner__run
– Utiliza sys.displayhook para a impressão
dos resultados dos doctests
● O plugin altera o método run para
temporariamente trocar o sys.__displayhook__
por uma função personalizada de impressão
23/30
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO
CPython 2.x, 3.x
PyPy 2.x, 4.x, 5.x
PyPy3 2.x, 5.x
Jython 2.7
Diferentes
interpretadores
representam objetos da
mesma forma?
CPython 2.x, 3.x
PyPy 2.x, 4.x, 5.x
PyPy3 2.x, 5.x
Jython 2.7
Diferentes
interpretadores
representam objetos da
mesma forma?
24/30
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO
IPythonIPython
● Python 2.6/3.2: usar o IPython 1.2.1
– Verificado na instalação
● Até o IPython 5.0.0
– Trata todo dict do PyPy como types.DictProxyType
(bug)
– Formatação de types.DictProxyType completamente
diferente das demais
– Não formata types.MappingProxyType
– Já corrigi isso para o IPython 5.1 (PR aceito)
● Pretty printer extremamente consistente em todas as
versões do CPython/PyPy (a menos do dict)
● Incompatível com Jython
● Python 2.6/3.2: usar o IPython 1.2.1
– Verificado na instalação
● Até o IPython 5.0.0
– Trata todo dict do PyPy como types.DictProxyType
(bug)
– Formatação de types.DictProxyType completamente
diferente das demais
– Não formata types.MappingProxyType
– Já corrigi isso para o IPython 5.1 (PR aceito)
● Pretty printer extremamente consistente em todas as
versões do CPython/PyPy (a menos do dict)
● Incompatível com Jython
25/30
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO
pprintpprint
● set()
– set() # CPython 2.6, 3.x; PyPy3; Jython 2.7
– set([]) # CPython 2.7; PyPy
● set(range(5))
– {0, 1, 2, 3, 4} # CPython 3.x; PyPy3
– set([0, 1, 2, 3, 4]) # CPython 2.x; PyPy ; Jython 2.7
● Ordenação
– CPython 2.6+: sets sempre ordenados
– CPython 3.2+: sets ordenados apenas se a representação não couber
em uma linha
● Módulo collections
– Rotinas de formatação inseridas no pprint somente no Python 3.5
– Mesmo problema que ocorre com sets (até o momento)
● set()
– set() # CPython 2.6, 3.x; PyPy3; Jython 2.7
– set([]) # CPython 2.7; PyPy
● set(range(5))
– {0, 1, 2, 3, 4} # CPython 3.x; PyPy3
– set([0, 1, 2, 3, 4]) # CPython 2.x; PyPy ; Jython 2.7
● Ordenação
– CPython 2.6+: sets sempre ordenados
– CPython 3.2+: sets ordenados apenas se a representação não couber
em uma linha
● Módulo collections
– Rotinas de formatação inseridas no pprint somente no Python 3.5
– Mesmo problema que ocorre com sets (até o momento)
26/30
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO
PyPyPyPy
● Nem tudo tem como ser representado adequadamente em
versões antigas do PyPy
– e.g. “super(…).__thisclass__”
● dict is types.DictProxyType
– Isso fazia o IPython perder a rotina de formatação de
dicts
– Instâncias dict_proxy somente via ctypes (o tipo não
possui construtor), e essa classe inexiste no Python 3
– Python 3.3+ (PyPy3 5.2.0-alpha1) possui
types.MappingProxyType (com construtor)
● As rotinas do pretty printer do IPython for a preparadas
para ter o mesmo comportamento no CPython 2.7,
CPython 3.3+ e PyPy 5.3+
● Nem tudo tem como ser representado adequadamente em
versões antigas do PyPy
– e.g. “super(…).__thisclass__”
● dict is types.DictProxyType
– Isso fazia o IPython perder a rotina de formatação de
dicts
– Instâncias dict_proxy somente via ctypes (o tipo não
possui construtor), e essa classe inexiste no Python 3
– Python 3.3+ (PyPy3 5.2.0-alpha1) possui
types.MappingProxyType (com construtor)
● As rotinas do pretty printer do IPython for a preparadas
para ter o mesmo comportamento no CPython 2.7,
CPython 3.3+ e PyPy 5.3+
27/30
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO
Outros
assuntos
Outros
assuntos
28/30
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO
SympySympy
● CAS (Computer Algebra System) em Python
● Possui a própria função “pprint”:
– >>> from sympy import pprint, exp, pi
– >>> pprint(exp(1) + pi)
– ℯ + π
● Com o plugin, os exemplos ficariam mais diretos na
documentação (usando --doctest-repr=sympy.pprint e
admitindo exp e pi já importados no módulo com o
teste):
– >>> exp(1) + pi
– ℯ + π
● CAS (Computer Algebra System) em Python
● Possui a própria função “pprint”:
– >>> from sympy import pprint, exp, pi
– >>> pprint(exp(1) + pi)
– ℯ + π
● Com o plugin, os exemplos ficariam mais diretos na
documentação (usando --doctest-repr=sympy.pprint e
admitindo exp e pi já importados no módulo com o
teste):
– >>> exp(1) + pi
– ℯ + π
29/30
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO
ContextoContexto
● O plugin foi criado para facilitar os testes do
projeto PyScanPrev, atualmente testado apenas
com doctests
– https://github.com/danilobellini/pyscanprev
● Uma ideia similar surgiu durante os sprints da
Python Brasil [9] (Brasília-DF, 2013): um plugin
para modificar o “>>>” e trocar pelo “In [#]” do
IPython, em que o # é um número e a saída
possui um prefixo “Out [#]” correspondente.
Essa ideia de mudar o PS1 foi abandonada, mas
a ideia de um plugin que possibilitasse doctests
ao estilo do IPython não.
● O plugin foi criado para facilitar os testes do
projeto PyScanPrev, atualmente testado apenas
com doctests
– https://github.com/danilobellini/pyscanprev
● Uma ideia similar surgiu durante os sprints da
Python Brasil [9] (Brasília-DF, 2013): um plugin
para modificar o “>>>” e trocar pelo “In [#]” do
IPython, em que o # é um número e a saída
possui um prefixo “Out [#]” correspondente.
Essa ideia de mudar o PS1 foi abandonada, mas
a ideia de um plugin que possibilitasse doctests
ao estilo do IPython não.
30/30
Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini
Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO
FimFim

Weitere ähnliche Inhalte

Was ist angesagt?

Colaboração em Projetos FLOSS: CakePHP
Colaboração em Projetos FLOSS: CakePHPColaboração em Projetos FLOSS: CakePHP
Colaboração em Projetos FLOSS: CakePHPThiago Colares
 
Python para programadores Ruby
Python para programadores RubyPython para programadores Ruby
Python para programadores RubyEric Hideki
 
Cake php selecaodeprojetos-apres-em-modelo
Cake php selecaodeprojetos-apres-em-modeloCake php selecaodeprojetos-apres-em-modelo
Cake php selecaodeprojetos-apres-em-modeloCBA2012
 
Github - Escrevendo código e compartilhando conhecimento
Github - Escrevendo código e compartilhando conhecimentoGithub - Escrevendo código e compartilhando conhecimento
Github - Escrevendo código e compartilhando conhecimentoHélio Medeiros
 
Git that like a boss - Colaborando com GITHUB
Git that like a boss - Colaborando com GITHUBGit that like a boss - Colaborando com GITHUB
Git that like a boss - Colaborando com GITHUBHélio Medeiros
 
Colaboração em Projetos FLOSS: CakePHP
Colaboração em Projetos FLOSS: CakePHPColaboração em Projetos FLOSS: CakePHP
Colaboração em Projetos FLOSS: CakePHPCBA2012
 
Use o git e perca o medo de errar
Use o git e perca o medo de errarUse o git e perca o medo de errar
Use o git e perca o medo de errarBruno Calheira
 
Desvendando Git e Github - WoMakersCode Bootcamp @ SPTW
Desvendando Git e Github - WoMakersCode Bootcamp @ SPTWDesvendando Git e Github - WoMakersCode Bootcamp @ SPTW
Desvendando Git e Github - WoMakersCode Bootcamp @ SPTWMorganna Giovanelli de Souza
 
Google app engine para lean startups: the good, the bad and the ugly
Google app engine para lean startups: the good, the bad and the uglyGoogle app engine para lean startups: the good, the bad and the ugly
Google app engine para lean startups: the good, the bad and the uglyPET Computação
 
Automação de Aplicativos: Scripting com Python
Automação de Aplicativos: Scripting com PythonAutomação de Aplicativos: Scripting com Python
Automação de Aplicativos: Scripting com PythonFabio Spanhol
 
Ferramentas Essenciais para Desenvolvedores de Plugins WordPress
Ferramentas Essenciais para Desenvolvedores de Plugins WordPressFerramentas Essenciais para Desenvolvedores de Plugins WordPress
Ferramentas Essenciais para Desenvolvedores de Plugins WordPressTiago Hillebrandt
 
EIIFRO2014 - Desenvolvimento Colaborativo de Software
EIIFRO2014 - Desenvolvimento Colaborativo de SoftwareEIIFRO2014 - Desenvolvimento Colaborativo de Software
EIIFRO2014 - Desenvolvimento Colaborativo de SoftwareAldson Diego
 

Was ist angesagt? (20)

Colaboração em Projetos FLOSS: CakePHP
Colaboração em Projetos FLOSS: CakePHPColaboração em Projetos FLOSS: CakePHP
Colaboração em Projetos FLOSS: CakePHP
 
Git Overview: Grupo RBS
Git Overview: Grupo RBSGit Overview: Grupo RBS
Git Overview: Grupo RBS
 
Git e GitHub - Conceitos Básicos
Git e GitHub - Conceitos BásicosGit e GitHub - Conceitos Básicos
Git e GitHub - Conceitos Básicos
 
Python para programadores Ruby
Python para programadores RubyPython para programadores Ruby
Python para programadores Ruby
 
Cake php selecaodeprojetos-apres-em-modelo
Cake php selecaodeprojetos-apres-em-modeloCake php selecaodeprojetos-apres-em-modelo
Cake php selecaodeprojetos-apres-em-modelo
 
Git
GitGit
Git
 
Github - Escrevendo código e compartilhando conhecimento
Github - Escrevendo código e compartilhando conhecimentoGithub - Escrevendo código e compartilhando conhecimento
Github - Escrevendo código e compartilhando conhecimento
 
Git that like a boss - Colaborando com GITHUB
Git that like a boss - Colaborando com GITHUBGit that like a boss - Colaborando com GITHUB
Git that like a boss - Colaborando com GITHUB
 
Colaboração em Projetos FLOSS: CakePHP
Colaboração em Projetos FLOSS: CakePHPColaboração em Projetos FLOSS: CakePHP
Colaboração em Projetos FLOSS: CakePHP
 
My first app django
My first app djangoMy first app django
My first app django
 
Use o git e perca o medo de errar
Use o git e perca o medo de errarUse o git e perca o medo de errar
Use o git e perca o medo de errar
 
Desvendando Git e Github - WoMakersCode Bootcamp @ SPTW
Desvendando Git e Github - WoMakersCode Bootcamp @ SPTWDesvendando Git e Github - WoMakersCode Bootcamp @ SPTW
Desvendando Git e Github - WoMakersCode Bootcamp @ SPTW
 
Google app engine para lean startups: the good, the bad and the ugly
Google app engine para lean startups: the good, the bad and the uglyGoogle app engine para lean startups: the good, the bad and the ugly
Google app engine para lean startups: the good, the bad and the ugly
 
Python WTFAQ?
Python WTFAQ?Python WTFAQ?
Python WTFAQ?
 
Pyramid - BDD em Python
Pyramid - BDD em PythonPyramid - BDD em Python
Pyramid - BDD em Python
 
Automação de Aplicativos: Scripting com Python
Automação de Aplicativos: Scripting com PythonAutomação de Aplicativos: Scripting com Python
Automação de Aplicativos: Scripting com Python
 
Controle de versão e colaboração com Git
Controle de versão e colaboração com GitControle de versão e colaboração com Git
Controle de versão e colaboração com Git
 
Ferramentas Essenciais para Desenvolvedores de Plugins WordPress
Ferramentas Essenciais para Desenvolvedores de Plugins WordPressFerramentas Essenciais para Desenvolvedores de Plugins WordPress
Ferramentas Essenciais para Desenvolvedores de Plugins WordPress
 
Git & GitHub for beginners
Git & GitHub for beginnersGit & GitHub for beginners
Git & GitHub for beginners
 
EIIFRO2014 - Desenvolvimento Colaborativo de Software
EIIFRO2014 - Desenvolvimento Colaborativo de SoftwareEIIFRO2014 - Desenvolvimento Colaborativo de Software
EIIFRO2014 - Desenvolvimento Colaborativo de Software
 

Ähnlich wie (2016-08-13) [Grupy-SP] Plugin pytest-doctest-custom v1.0.0

Tutorial poke-tool
Tutorial poke-toolTutorial poke-tool
Tutorial poke-toolunifesptk
 
O Prazer De Trabalhar Com Python
O Prazer De Trabalhar Com PythonO Prazer De Trabalhar Com Python
O Prazer De Trabalhar Com PythonMarinho Brandão
 
PL/Python: Programando em Python no PostgreSQL
PL/Python: Programando em Python no PostgreSQLPL/Python: Programando em Python no PostgreSQL
PL/Python: Programando em Python no PostgreSQLJuliano Atanazio
 
Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012Fabrízio Mello
 
Desenvolvimento web com python e django
Desenvolvimento web com python e djangoDesenvolvimento web com python e django
Desenvolvimento web com python e djangoIgor Sobreira
 
Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitDiego Tremper
 
Automação no ambientAutomação no ambiente de desenvolvimento com Maven e ANT
Automação no ambientAutomação no ambiente de desenvolvimento com Maven e ANTAutomação no ambientAutomação no ambiente de desenvolvimento com Maven e ANT
Automação no ambientAutomação no ambiente de desenvolvimento com Maven e ANTelliando dias
 
Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem PythonLuciano Ramalho
 
Técnicas para preparação e desenvolvimento de sites em django
Técnicas para preparação e desenvolvimento de sites em djangoTécnicas para preparação e desenvolvimento de sites em django
Técnicas para preparação e desenvolvimento de sites em djangoMario Chaves
 
TDC 2014 SP - Visual Regression Testing com PhantomCSS
TDC 2014 SP - Visual Regression Testing com PhantomCSSTDC 2014 SP - Visual Regression Testing com PhantomCSS
TDC 2014 SP - Visual Regression Testing com PhantomCSSStefan Teixeira
 
Teste de Integração - Unidade III
Teste de Integração - Unidade IIITeste de Integração - Unidade III
Teste de Integração - Unidade IIIJoão Lourenço
 
Django Object factory
Django Object factoryDjango Object factory
Django Object factoryitalomaia
 
Ciência de Dados na Linha de Comando
Ciência de Dados na Linha de ComandoCiência de Dados na Linha de Comando
Ciência de Dados na Linha de ComandoÁlvaro Justen
 
Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010Fabrízio Mello
 

Ähnlich wie (2016-08-13) [Grupy-SP] Plugin pytest-doctest-custom v1.0.0 (20)

Tutorial poke-tool
Tutorial poke-toolTutorial poke-tool
Tutorial poke-tool
 
O Prazer De Trabalhar Com Python
O Prazer De Trabalhar Com PythonO Prazer De Trabalhar Com Python
O Prazer De Trabalhar Com Python
 
Cp2011 python agil-ramiroluz
Cp2011 python agil-ramiroluzCp2011 python agil-ramiroluz
Cp2011 python agil-ramiroluz
 
PL/Python: Programando em Python no PostgreSQL
PL/Python: Programando em Python no PostgreSQLPL/Python: Programando em Python no PostgreSQL
PL/Python: Programando em Python no PostgreSQL
 
Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012
 
Desenvolvimento web com python e django
Desenvolvimento web com python e djangoDesenvolvimento web com python e django
Desenvolvimento web com python e django
 
Pep8 pylint
Pep8 pylintPep8 pylint
Pep8 pylint
 
Nossa experiência com TDD
Nossa experiência com TDDNossa experiência com TDD
Nossa experiência com TDD
 
Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnit
 
Trabalhando com Módulos no Puppet
Trabalhando com Módulos no PuppetTrabalhando com Módulos no Puppet
Trabalhando com Módulos no Puppet
 
Automação no ambientAutomação no ambiente de desenvolvimento com Maven e ANT
Automação no ambientAutomação no ambiente de desenvolvimento com Maven e ANTAutomação no ambientAutomação no ambiente de desenvolvimento com Maven e ANT
Automação no ambientAutomação no ambiente de desenvolvimento com Maven e ANT
 
Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem Python
 
Dominando o customizer
Dominando o customizerDominando o customizer
Dominando o customizer
 
Técnicas para preparação e desenvolvimento de sites em django
Técnicas para preparação e desenvolvimento de sites em djangoTécnicas para preparação e desenvolvimento de sites em django
Técnicas para preparação e desenvolvimento de sites em django
 
TDC 2014 SP - Visual Regression Testing com PhantomCSS
TDC 2014 SP - Visual Regression Testing com PhantomCSSTDC 2014 SP - Visual Regression Testing com PhantomCSS
TDC 2014 SP - Visual Regression Testing com PhantomCSS
 
Google apps script - Parte - 1
Google apps script - Parte - 1Google apps script - Parte - 1
Google apps script - Parte - 1
 
Teste de Integração - Unidade III
Teste de Integração - Unidade IIITeste de Integração - Unidade III
Teste de Integração - Unidade III
 
Django Object factory
Django Object factoryDjango Object factory
Django Object factory
 
Ciência de Dados na Linha de Comando
Ciência de Dados na Linha de ComandoCiência de Dados na Linha de Comando
Ciência de Dados na Linha de Comando
 
Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010
 

Mehr von Danilo J. S. Bellini

(2018-10-18) [ETEC Uirapuru] Segurança da Informação
(2018-10-18) [ETEC Uirapuru] Segurança da Informação(2018-10-18) [ETEC Uirapuru] Segurança da Informação
(2018-10-18) [ETEC Uirapuru] Segurança da InformaçãoDanilo J. S. Bellini
 
(2018-08-25) [Flask Conf] Introdução ao Sanic - O Flask Assíncrono
(2018-08-25) [Flask Conf] Introdução ao Sanic - O Flask Assíncrono(2018-08-25) [Flask Conf] Introdução ao Sanic - O Flask Assíncrono
(2018-08-25) [Flask Conf] Introdução ao Sanic - O Flask AssíncronoDanilo J. S. Bellini
 
(2018-07-14) [Just Python] Números no Python!
(2018-07-14) [Just Python] Números no Python!(2018-07-14) [Just Python] Números no Python!
(2018-07-14) [Just Python] Números no Python!Danilo J. S. Bellini
 
(2017-08-12) [GruPy-SP] AudioLazy no GruPy! (+LV2)
(2017-08-12) [GruPy-SP] AudioLazy no GruPy! (+LV2)(2017-08-12) [GruPy-SP] AudioLazy no GruPy! (+LV2)
(2017-08-12) [GruPy-SP] AudioLazy no GruPy! (+LV2)Danilo J. S. Bellini
 
(2017-07-22) [TDC] Audiolazy em 2017!
(2017-07-22) [TDC] Audiolazy em 2017!(2017-07-22) [TDC] Audiolazy em 2017!
(2017-07-22) [TDC] Audiolazy em 2017!Danilo J. S. Bellini
 
(2017-05-27) [Grupy-SP] Polígonos, pontos e outras geometrias no Shapely (GIS)
(2017-05-27) [Grupy-SP] Polígonos, pontos e outras geometrias no Shapely (GIS)(2017-05-27) [Grupy-SP] Polígonos, pontos e outras geometrias no Shapely (GIS)
(2017-05-27) [Grupy-SP] Polígonos, pontos e outras geometrias no Shapely (GIS)Danilo J. S. Bellini
 
(2015-01-29/30) [WTA2015] Adaptatividade em Python (Tutorial)
(2015-01-29/30) [WTA2015] Adaptatividade em Python (Tutorial)(2015-01-29/30) [WTA2015] Adaptatividade em Python (Tutorial)
(2015-01-29/30) [WTA2015] Adaptatividade em Python (Tutorial)Danilo J. S. Bellini
 
(2014-11-05) [PythonBrasil] Testando com py.test e tox
(2014-11-05) [PythonBrasil] Testando com py.test e tox(2014-11-05) [PythonBrasil] Testando com py.test e tox
(2014-11-05) [PythonBrasil] Testando com py.test e toxDanilo J. S. Bellini
 
(2014-10-27) [SETI-UFLA-MG] AudioLazy
(2014-10-27) [SETI-UFLA-MG] AudioLazy(2014-10-27) [SETI-UFLA-MG] AudioLazy
(2014-10-27) [SETI-UFLA-MG] AudioLazyDanilo J. S. Bellini
 
(2014-08-09) [TDC] AudioLazy 0.6 will robotize you!
(2014-08-09) [TDC] AudioLazy 0.6 will robotize you!(2014-08-09) [TDC] AudioLazy 0.6 will robotize you!
(2014-08-09) [TDC] AudioLazy 0.6 will robotize you!Danilo J. S. Bellini
 
(2014-05-24) [Taubaté Perl Mongers] AudioLazy Python DSP (Digital Signal Proc...
(2014-05-24) [Taubaté Perl Mongers] AudioLazy Python DSP (Digital Signal Proc...(2014-05-24) [Taubaté Perl Mongers] AudioLazy Python DSP (Digital Signal Proc...
(2014-05-24) [Taubaté Perl Mongers] AudioLazy Python DSP (Digital Signal Proc...Danilo J. S. Bellini
 
(2013-11-29) [RuPy] AudioLazy Python DSP (Digital Signal Processing)
(2013-11-29) [RuPy] AudioLazy Python DSP (Digital Signal Processing)(2013-11-29) [RuPy] AudioLazy Python DSP (Digital Signal Processing)
(2013-11-29) [RuPy] AudioLazy Python DSP (Digital Signal Processing)Danilo J. S. Bellini
 
(2013-10-16) [LatinoWare] Processamento de sinais em Python
(2013-10-16) [LatinoWare] Processamento de sinais em Python(2013-10-16) [LatinoWare] Processamento de sinais em Python
(2013-10-16) [LatinoWare] Processamento de sinais em PythonDanilo J. S. Bellini
 
(2013-10-03) [PythonBrasil] AudioLazy, processamento de sinais para música, j...
(2013-10-03) [PythonBrasil] AudioLazy, processamento de sinais para música, j...(2013-10-03) [PythonBrasil] AudioLazy, processamento de sinais para música, j...
(2013-10-03) [PythonBrasil] AudioLazy, processamento de sinais para música, j...Danilo J. S. Bellini
 
(2013-09-30) [PythonBrasil] Síntese em tempo real com a AudioLazy
(2013-09-30) [PythonBrasil] Síntese em tempo real com a AudioLazy(2013-09-30) [PythonBrasil] Síntese em tempo real com a AudioLazy
(2013-09-30) [PythonBrasil] Síntese em tempo real com a AudioLazyDanilo J. S. Bellini
 
(2013-10-17) [LatinoWare] Automatizando o GIMP com Python
(2013-10-17) [LatinoWare] Automatizando o GIMP com Python(2013-10-17) [LatinoWare] Automatizando o GIMP com Python
(2013-10-17) [LatinoWare] Automatizando o GIMP com PythonDanilo J. S. Bellini
 
(2013-10-02) [PythonBrasil] Compatibilidade entre Python 2 e 3
(2013-10-02) [PythonBrasil] Compatibilidade entre Python 2 e 3(2013-10-02) [PythonBrasil] Compatibilidade entre Python 2 e 3
(2013-10-02) [PythonBrasil] Compatibilidade entre Python 2 e 3Danilo J. S. Bellini
 

Mehr von Danilo J. S. Bellini (20)

(2018-10-18) [ETEC Uirapuru] Segurança da Informação
(2018-10-18) [ETEC Uirapuru] Segurança da Informação(2018-10-18) [ETEC Uirapuru] Segurança da Informação
(2018-10-18) [ETEC Uirapuru] Segurança da Informação
 
(2018-08-25) [Flask Conf] Introdução ao Sanic - O Flask Assíncrono
(2018-08-25) [Flask Conf] Introdução ao Sanic - O Flask Assíncrono(2018-08-25) [Flask Conf] Introdução ao Sanic - O Flask Assíncrono
(2018-08-25) [Flask Conf] Introdução ao Sanic - O Flask Assíncrono
 
(2018-07-14) [Just Python] Números no Python!
(2018-07-14) [Just Python] Números no Python!(2018-07-14) [Just Python] Números no Python!
(2018-07-14) [Just Python] Números no Python!
 
(2017-08-12) [GruPy-SP] AudioLazy no GruPy! (+LV2)
(2017-08-12) [GruPy-SP] AudioLazy no GruPy! (+LV2)(2017-08-12) [GruPy-SP] AudioLazy no GruPy! (+LV2)
(2017-08-12) [GruPy-SP] AudioLazy no GruPy! (+LV2)
 
(2017-07-22) [TDC] Audiolazy em 2017!
(2017-07-22) [TDC] Audiolazy em 2017!(2017-07-22) [TDC] Audiolazy em 2017!
(2017-07-22) [TDC] Audiolazy em 2017!
 
(2017-05-27) [Grupy-SP] Polígonos, pontos e outras geometrias no Shapely (GIS)
(2017-05-27) [Grupy-SP] Polígonos, pontos e outras geometrias no Shapely (GIS)(2017-05-27) [Grupy-SP] Polígonos, pontos e outras geometrias no Shapely (GIS)
(2017-05-27) [Grupy-SP] Polígonos, pontos e outras geometrias no Shapely (GIS)
 
(2015-01-29/30) [WTA2015] Adaptatividade em Python (Tutorial)
(2015-01-29/30) [WTA2015] Adaptatividade em Python (Tutorial)(2015-01-29/30) [WTA2015] Adaptatividade em Python (Tutorial)
(2015-01-29/30) [WTA2015] Adaptatividade em Python (Tutorial)
 
(2014-11-05) [PythonBrasil] Testando com py.test e tox
(2014-11-05) [PythonBrasil] Testando com py.test e tox(2014-11-05) [PythonBrasil] Testando com py.test e tox
(2014-11-05) [PythonBrasil] Testando com py.test e tox
 
(2014-10-27) [SETI-UFLA-MG] AudioLazy
(2014-10-27) [SETI-UFLA-MG] AudioLazy(2014-10-27) [SETI-UFLA-MG] AudioLazy
(2014-10-27) [SETI-UFLA-MG] AudioLazy
 
(2014-08-09) [TDC] AudioLazy 0.6 will robotize you!
(2014-08-09) [TDC] AudioLazy 0.6 will robotize you!(2014-08-09) [TDC] AudioLazy 0.6 will robotize you!
(2014-08-09) [TDC] AudioLazy 0.6 will robotize you!
 
(2014-05-24) [Taubaté Perl Mongers] AudioLazy Python DSP (Digital Signal Proc...
(2014-05-24) [Taubaté Perl Mongers] AudioLazy Python DSP (Digital Signal Proc...(2014-05-24) [Taubaté Perl Mongers] AudioLazy Python DSP (Digital Signal Proc...
(2014-05-24) [Taubaté Perl Mongers] AudioLazy Python DSP (Digital Signal Proc...
 
(2014-04-16) [Garoa HC] Strategy
(2014-04-16) [Garoa HC] Strategy(2014-04-16) [Garoa HC] Strategy
(2014-04-16) [Garoa HC] Strategy
 
(2013-12-18) [Garoa HC] AudioLazy
(2013-12-18) [Garoa HC] AudioLazy(2013-12-18) [Garoa HC] AudioLazy
(2013-12-18) [Garoa HC] AudioLazy
 
(2014-03-26) [7masters] AudioLazy
(2014-03-26) [7masters] AudioLazy(2014-03-26) [7masters] AudioLazy
(2014-03-26) [7masters] AudioLazy
 
(2013-11-29) [RuPy] AudioLazy Python DSP (Digital Signal Processing)
(2013-11-29) [RuPy] AudioLazy Python DSP (Digital Signal Processing)(2013-11-29) [RuPy] AudioLazy Python DSP (Digital Signal Processing)
(2013-11-29) [RuPy] AudioLazy Python DSP (Digital Signal Processing)
 
(2013-10-16) [LatinoWare] Processamento de sinais em Python
(2013-10-16) [LatinoWare] Processamento de sinais em Python(2013-10-16) [LatinoWare] Processamento de sinais em Python
(2013-10-16) [LatinoWare] Processamento de sinais em Python
 
(2013-10-03) [PythonBrasil] AudioLazy, processamento de sinais para música, j...
(2013-10-03) [PythonBrasil] AudioLazy, processamento de sinais para música, j...(2013-10-03) [PythonBrasil] AudioLazy, processamento de sinais para música, j...
(2013-10-03) [PythonBrasil] AudioLazy, processamento de sinais para música, j...
 
(2013-09-30) [PythonBrasil] Síntese em tempo real com a AudioLazy
(2013-09-30) [PythonBrasil] Síntese em tempo real com a AudioLazy(2013-09-30) [PythonBrasil] Síntese em tempo real com a AudioLazy
(2013-09-30) [PythonBrasil] Síntese em tempo real com a AudioLazy
 
(2013-10-17) [LatinoWare] Automatizando o GIMP com Python
(2013-10-17) [LatinoWare] Automatizando o GIMP com Python(2013-10-17) [LatinoWare] Automatizando o GIMP com Python
(2013-10-17) [LatinoWare] Automatizando o GIMP com Python
 
(2013-10-02) [PythonBrasil] Compatibilidade entre Python 2 e 3
(2013-10-02) [PythonBrasil] Compatibilidade entre Python 2 e 3(2013-10-02) [PythonBrasil] Compatibilidade entre Python 2 e 3
(2013-10-02) [PythonBrasil] Compatibilidade entre Python 2 e 3
 

(2016-08-13) [Grupy-SP] Plugin pytest-doctest-custom v1.0.0

  • 1. 1/30 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO Plugin pytest-doctest-custom v1.0.0 Hackeando doctests com o plugin (ementa): https://gist.github.com/danilobellini/b76a36c4fcc946ecb1d6cb92987f30d3 Plugin: https://github.com/danilobellini/pytest-doctest-custom PyPI: https://pypi.python.org/pypi/pytest-doctest-custom Plugin pytest-doctest-custom v1.0.0 Hackeando doctests com o plugin (ementa): https://gist.github.com/danilobellini/b76a36c4fcc946ecb1d6cb92987f30d3 Plugin: https://github.com/danilobellini/pytest-doctest-custom PyPI: https://pypi.python.org/pypi/pytest-doctest-custom
  • 2. 2/30 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO Testes – Por quê?Testes – Por quê? “[...], perhaps the most important benefit of unit tests is not that it ensures that your code works - it's that it ensures that it stays working, that is, that a future change doesn't cause a regression.” https://www.wiki.wxpython.org/Unit%20Testing%20with%20wxPython “[...], perhaps the most important benefit of unit tests is not that it ensures that your code works - it's that it ensures that it stays working, that is, that a future change doesn't cause a regression.” https://www.wiki.wxpython.org/Unit%20Testing%20with%20wxPython
  • 3. 3/30 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO doctest documentation + tests standard library doctest documentation + tests standard library
  • 4. 4/30 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO docstringsdocstrings ● Documentação inserida no próprio código ● Acessada pela função help() do Python e pelo “?” no IPython ● Armazenada no atributo “__doc__” ● Pode constar em: – Funções – Métodos – Classes – Módulos/pacotes ● Documentação inserida no próprio código ● Acessada pela função help() do Python e pelo “?” no IPython ● Armazenada no atributo “__doc__” ● Pode constar em: – Funções – Métodos – Classes – Módulos/pacotes def snake2ucamel(value): """Converte snake_case em UpperCamelCase.""" return "".join(el.capitalize() for el in value.split("_")) def snake2ucamel(value): """Converte snake_case em UpperCamelCase.""" return "".join(el.capitalize() for el in value.split("_")) docstring
  • 5. 5/30 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO doctestdoctest ● Documentação pode conter exemplos – Por que não testar os exemplos? ● Consistência ● Standard library e pronto para usar: python -m doctest nome_arquivo ● Procura por exemplos como no REPL do Python: >>> comando ... continuação resultado ● Compara strings de representação, não valores – Dependente da ordenação (não serve para sets/dicts) ● Documentação pode conter exemplos – Por que não testar os exemplos? ● Consistência ● Standard library e pronto para usar: python -m doctest nome_arquivo ● Procura por exemplos como no REPL do Python: >>> comando ... continuação resultado ● Compara strings de representação, não valores – Dependente da ordenação (não serve para sets/dicts)
  • 6. 6/30 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO def snake2ucamel(value): """ Converte snake_case em UpperCamelCase. Exemplo: >>> snake2ucamel("teste") 'Teste' >>> snake2ucamel("um_nome_muito_longo") 'UmNomeMuitoLongo' """ return "".join(el.capitalize() for el in value.split("_")) def snake2ucamel(value): """ Converte snake_case em UpperCamelCase. Exemplo: >>> snake2ucamel("teste") 'Teste' >>> snake2ucamel("um_nome_muito_longo") 'UmNomeMuitoLongo' """ return "".join(el.capitalize() for el in value.split("_")) $ python -m doctest snake2ucamel.py -v Trying: snake2ucamel("teste") Expecting: 'Teste' ok Trying: snake2ucamel("um_nome_muito_longo") Expecting: 'UmNomeMuitoLongo' ok 1 items had no tests: snake2ucamel 1 items passed all tests: 2 tests in snake2ucamel.snake2ucamel 2 tests in 2 items. 2 passed and 0 failed. Test passed. $ python -m doctest snake2ucamel.py -v Trying: snake2ucamel("teste") Expecting: 'Teste' ok Trying: snake2ucamel("um_nome_muito_longo") Expecting: 'UmNomeMuitoLongo' ok 1 items had no tests: snake2ucamel 1 items passed all tests: 2 tests in snake2ucamel.snake2ucamel 2 tests in 2 items. 2 passed and 0 failed. Test passed.
  • 7. 7/30 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO py.test e tox py.test e tox
  • 8. 8/30 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO py.testpy.test ● Instalação: pip install pytest ● Uso sem argumentos: py.test ou python -m pytest ● Instalação: pip install pytest ● Uso sem argumentos: py.test ou python -m pytest ● Coleta automática pelo nome: – Funções/métodos: test* – Classes: Test* – Arquivos: test_*.py ● Uso do statement “assert” ● Coleta automática pelo nome: – Funções/métodos: test* – Classes: Test* – Arquivos: test_*.py ● Uso do statement “assert” def snake2ucamel(value): """Converte snake_case em UpperCamelCase.""" return "".join(el.capitalize() for el in value.split("_")) def test_empty(): assert snake2ucamel("") == "" def test_no_under(): assert snake2ucamel("maxsize") == "Maxsize" assert snake2ucamel("abigname") == "Abigname" def test_has_under(): assert snake2ucamel("max_size") == "MaxSize" assert snake2ucamel("a_big_name") == "ABigName" def snake2ucamel(value): """Converte snake_case em UpperCamelCase.""" return "".join(el.capitalize() for el in value.split("_")) def test_empty(): assert snake2ucamel("") == "" def test_no_under(): assert snake2ucamel("maxsize") == "Maxsize" assert snake2ucamel("abigname") == "Abigname" def test_has_under(): assert snake2ucamel("max_size") == "MaxSize" assert snake2ucamel("a_big_name") == "ABigName"
  • 9. 9/30 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO def snake2ucamel(value): """Converte snake_case em UpperCamelCase.""" return "".join(el.capitalize() for el in value.split("_")) def test_empty(): assert snake2ucamel("") == "" def test_no_under(): assert snake2ucamel("maxsize") == "Maxsize" assert snake2ucamel("abigname") == "Abigname" def test_has_under(): assert snake2ucamel("max_size") == "MaxSize" assert snake2ucamel("a_big_name") == "ABigName" def snake2ucamel(value): """Converte snake_case em UpperCamelCase.""" return "".join(el.capitalize() for el in value.split("_")) def test_empty(): assert snake2ucamel("") == "" def test_no_under(): assert snake2ucamel("maxsize") == "Maxsize" assert snake2ucamel("abigname") == "Abigname" def test_has_under(): assert snake2ucamel("max_size") == "MaxSize" assert snake2ucamel("a_big_name") == "ABigName" $ py.test ========= test session starts ========== platform linux -- Python 3.5.2, pytest- 2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: /home/danilo/Desktop/Grupy_2016-08- 13/Exemplos/pytest, inifile: plugins: doctest-custom-1.1.0.dev0, cov- 2.3.1, timeout-1.0.0 collected 3 items test_snake2ucamel.py ... ======= 3 passed in 0.01 seconds ======= $ py.test ========= test session starts ========== platform linux -- Python 3.5.2, pytest- 2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: /home/danilo/Desktop/Grupy_2016-08- 13/Exemplos/pytest, inifile: plugins: doctest-custom-1.1.0.dev0, cov- 2.3.1, timeout-1.0.0 collected 3 items test_snake2ucamel.py ... ======= 3 passed in 0.01 seconds =======
  • 10. 10/30 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO py.testpy.test ● Suporte a plugins + plugins internos ● Inclui plugins prontos ● Fixtures! ● Testes parametrizados ● FLOSS – Eu que fiz o plugin interno do py.test isolar/contar corretamente os doctests ● Não te obriga a usar assertNomesForaDaPEP8 http://pytest.org ● Suporte a plugins + plugins internos ● Inclui plugins prontos ● Fixtures! ● Testes parametrizados ● FLOSS – Eu que fiz o plugin interno do py.test isolar/contar corretamente os doctests ● Não te obriga a usar assertNomesForaDaPEP8 http://pytest.org
  • 11. 11/30 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO toxtox ● Gerenciador de virtualenvs – Automação – Testes em vários ambientes – Diferentes versões do Python e/ou de algum requisito ● Configurável – tox.ini ● Gerenciador de virtualenvs – Automação – Testes em vários ambientes – Diferentes versões do Python e/ou de algum requisito ● Configurável – tox.ini [tox] envlist = py{36,35,34,27} skipsdist = True [testenv] deps = pytest commands = py.test {posargs} [tox] envlist = py{36,35,34,27} skipsdist = True [testenv] deps = pytest commands = py.test {posargs} $ tox [...] py36 runtests: commands[0] | py.test [...] py35 runtests: commands[0] | py.test [...] py34 runtests: commands[0] | py.test [...] py27 runtests: commands[0] | py.test [...] _______________ summary ________________ py36: commands succeeded py35: commands succeeded py34: commands succeeded py27: commands succeeded congratulations :) $ tox [...] py36 runtests: commands[0] | py.test [...] py35 runtests: commands[0] | py.test [...] py34 runtests: commands[0] | py.test [...] py27 runtests: commands[0] | py.test [...] _______________ summary ________________ py36: commands succeeded py35: commands succeeded py34: commands succeeded py27: commands succeeded congratulations :)
  • 12. 12/30 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO [tox] envlist = py{36,35,34,27} skipsdist = True [testenv] deps = pytest commands = py.test {posargs} [pytest] addopts = --doctest-modules [tox] envlist = py{36,35,34,27} skipsdist = True [testenv] deps = pytest commands = py.test {posargs} [pytest] addopts = --doctest-modules Misturando tudo! Misturando tudo! from snake2ucamel import snake2ucamel def test_empty(): assert snake2ucamel("") == "" def test_no_under(): assert snake2ucamel("maxsize") == "Maxsize" assert snake2ucamel("abigname") == "Abigname" def test_has_under(): assert snake2ucamel("max_size") == "MaxSize" assert snake2ucamel("a_big_name") == "ABigName" from snake2ucamel import snake2ucamel def test_empty(): assert snake2ucamel("") == "" def test_no_under(): assert snake2ucamel("maxsize") == "Maxsize" assert snake2ucamel("abigname") == "Abigname" def test_has_under(): assert snake2ucamel("max_size") == "MaxSize" assert snake2ucamel("a_big_name") == "ABigName" def snake2ucamel(value): """ Converte snake_case em UpperCamelCase. Exemplo: >>> snake2ucamel("teste") 'Teste' >>> snake2ucamel("um_nome_muito_longo") 'UmNomeMuitoLongo' """ return "".join(el.capitalize() for el in value.split("_")) def snake2ucamel(value): """ Converte snake_case em UpperCamelCase. Exemplo: >>> snake2ucamel("teste") 'Teste' >>> snake2ucamel("um_nome_muito_longo") 'UmNomeMuitoLongo' """ return "".join(el.capitalize() for el in value.split("_")) tox.ini snake2ucamel.py test_snake2ucamel.py doctests com o py.test apenas editando o tox.ini $ tox [...] py36 runtests: commands[0] | py.test [… detalhado abaixo ...] py35 runtests: commands[0] | py.test [...] py34 runtests: commands[0] | py.test [...] py27 runtests: commands[0] | py.test [...] _______________ summary ________________ py36: commands succeeded py35: commands succeeded py34: commands succeeded py27: commands succeeded congratulations :) $ tox [...] py36 runtests: commands[0] | py.test [… detalhado abaixo ...] py35 runtests: commands[0] | py.test [...] py34 runtests: commands[0] | py.test [...] py27 runtests: commands[0] | py.test [...] _______________ summary ________________ py36: commands succeeded py35: commands succeeded py34: commands succeeded py27: commands succeeded congratulations :) py36 runtests: commands[0] | py.test ========= test session starts ========== platform linux -- Python 3.6.0a3+, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: /home/danilo/Desktop/Grupy_2016-08- 13/Exemplos/ambos, inifile: tox.ini collected 4 items snake2ucamel.py . test_snake2ucamel.py ... ======= 4 passed in 0.03 seconds ======= py36 runtests: commands[0] | py.test ========= test session starts ========== platform linux -- Python 3.6.0a3+, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: /home/danilo/Desktop/Grupy_2016-08- 13/Exemplos/ambos, inifile: tox.ini collected 4 items snake2ucamel.py . test_snake2ucamel.py ... ======= 4 passed in 0.03 seconds =======
  • 13. 13/30 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO Representando objetos como strings pprint (stdlib) e IPython.lib.pretty Representando objetos como strings pprint (stdlib) e IPython.lib.pretty
  • 14. 14/30 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO Representação em stringsRepresentação em strings ● Representação – repr – ascii – atributo __repr__ – atributo __str__ – pprint.pformat ● Impressão / escrita em stream – print – pprint.pprint – sys.stdout.write ● ● Representação – repr – ascii – atributo __repr__ – atributo __str__ – pprint.pformat ● Impressão / escrita em stream – print – pprint.pprint – sys.stdout.write ● ● Representação mais legível – Quebra de linha (list, dict, etc.) – Ordenação (set, dict, etc.) ● Tratamento de recursão – e.g. lista que contém a si própria ● Representação mais legível – Quebra de linha (list, dict, etc.) – Ordenação (set, dict, etc.) ● Tratamento de recursão – e.g. lista que contém a si própria def impressão(objeto): # Roughly stream.write(representação(objeto)) def impressão(objeto): # Roughly stream.write(representação(objeto))
  • 15. 15/30 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO pprint Pretty Printer pprint Pretty Printer ● Standard Library ● Não é extensível ● Fallback: repr ● Internamente separado em 2 – Resultado em uma linha – Resultado em múltiplas linhas ● API inclui: – pprint.PrettyPrinter – pprint.pformat – pprint.pprint ● A classe PrettyPrinter permite personalização, mas se associa ao sys.stdout durante a construção ● Standard Library ● Não é extensível ● Fallback: repr ● Internamente separado em 2 – Resultado em uma linha – Resultado em múltiplas linhas ● API inclui: – pprint.PrettyPrinter – pprint.pformat – pprint.pprint ● A classe PrettyPrinter permite personalização, mas se associa ao sys.stdout durante a construção
  • 16. 16/30 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO IPython.lib.prettyIPython.lib.pretty ● Fork do “pretty” do Armin Ronacher ● Extensível: procura um método “_repr_pretty_” – Mas possui funções prontas para os tipos básicos e coleções do Python ● Subpacote do IPython pip install ipython ● Consistente entre diferentes versões e interpretadores do Python ● A API inclui: – IPython.lib.pretty.pretty – IPython.lib.pretty.pprint ● Fork do “pretty” do Armin Ronacher ● Extensível: procura um método “_repr_pretty_” – Mas possui funções prontas para os tipos básicos e coleções do Python ● Subpacote do IPython pip install ipython ● Consistente entre diferentes versões e interpretadores do Python ● A API inclui: – IPython.lib.pretty.pretty – IPython.lib.pretty.pprint
  • 17. 17/30 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO Unindo mundos: pytest-doctest-custom Unindo mundos: pytest-doctest-custom
  • 18. 18/30 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO Pytest-doctest-customPytest-doctest-custom ● Plugin para o py.test ● Ativado/controlado através de um único argumento no py.test: --doctest-repr=MODULO:OBJETO ● Selecione a função que quiser para representar a saída de doctests, e.g.: py.test --doctest-modules --doctest-repr=IPython.lib.pretty:pretty ● Tanto funções de representação como impressão podem ser usadas ● É o fim dos problemas com a ordenação ao fazer o seu doctest ● Plugin para o py.test ● Ativado/controlado através de um único argumento no py.test: --doctest-repr=MODULO:OBJETO ● Selecione a função que quiser para representar a saída de doctests, e.g.: py.test --doctest-modules --doctest-repr=IPython.lib.pretty:pretty ● Tanto funções de representação como impressão podem ser usadas ● É o fim dos problemas com a ordenação ao fazer o seu doctest $ py.test --doctest-modules ========================= test session starts ========================== platform linux -- Python 3.5.2, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: /home/danilo/Desktop/Grupy_2016-08-13/Exemplos/setdict, inifile: plugins: doctest-custom-1.1.0.dev0, cov-2.3.1, timeout-1.0.0 collected 1 items test_setdict.py F =============================== FAILURES =============================== ________________________ [doctest] test_setdict ________________________ 002 >>> set("qwertyuiop") Expected: {'e', 'i', 'o', 'p', 'q', 'r', 't', 'u', 'w', 'y'} Got: {'r', 'e', 'q', 'w', 'y', 't', 'p', 'u', 'o', 'i'} /home/danilo/Desktop/Grupy_2016-08- 13/Exemplos/setdict/test_setdict.py:2: DocTestFailure ======================= 1 failed in 0.02 seconds ======================= $ py.test --doctest-modules ========================= test session starts ========================== platform linux -- Python 3.5.2, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: /home/danilo/Desktop/Grupy_2016-08-13/Exemplos/setdict, inifile: plugins: doctest-custom-1.1.0.dev0, cov-2.3.1, timeout-1.0.0 collected 1 items test_setdict.py F =============================== FAILURES =============================== ________________________ [doctest] test_setdict ________________________ 002 >>> set("qwertyuiop") Expected: {'e', 'i', 'o', 'p', 'q', 'r', 't', 'u', 'w', 'y'} Got: {'r', 'e', 'q', 'w', 'y', 't', 'p', 'u', 'o', 'i'} /home/danilo/Desktop/Grupy_2016-08- 13/Exemplos/setdict/test_setdict.py:2: DocTestFailure ======================= 1 failed in 0.02 seconds =======================
  • 19. 19/30 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO $ py.test --doctest-modules --doctest-repr=IPython.lib.pretty:pretty ========================= test session starts ========================== platform linux -- Python 3.5.2, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: /home/danilo/Desktop/Grupy_2016-08-13/Exemplos/setdict, inifile: plugins: doctest-custom-1.1.0.dev0, cov-2.3.1, timeout-1.0.0 collected 1 items test_setdict.py . ======================= 1 passed in 0.01 seconds ======================= $ py.test --doctest-modules --doctest-repr=IPython.lib.pretty:pretty ========================= test session starts ========================== platform linux -- Python 3.5.2, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: /home/danilo/Desktop/Grupy_2016-08-13/Exemplos/setdict, inifile: plugins: doctest-custom-1.1.0.dev0, cov-2.3.1, timeout-1.0.0 collected 1 items test_setdict.py . ======================= 1 passed in 0.01 seconds ======================= $ py.test --doctest-modules ========================= test session starts ========================== platform linux -- Python 3.5.2, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: /home/danilo/Desktop/Grupy_2016-08-13/Exemplos/setdict, inifile: plugins: doctest-custom-1.1.0.dev0, cov-2.3.1, timeout-1.0.0 collected 1 items test_setdict.py F =============================== FAILURES =============================== ________________________ [doctest] test_setdict ________________________ 002 >>> set("qwertyuiop") Expected: {'e', 'i', 'o', 'p', 'q', 'r', 't', 'u', 'w', 'y'} Got: {'r', 'e', 'q', 'w', 'y', 't', 'p', 'u', 'o', 'i'} /home/danilo/Desktop/Grupy_2016-08- 13/Exemplos/setdict/test_setdict.py:2: DocTestFailure ======================= 1 failed in 0.02 seconds ======================= $ py.test --doctest-modules ========================= test session starts ========================== platform linux -- Python 3.5.2, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: /home/danilo/Desktop/Grupy_2016-08-13/Exemplos/setdict, inifile: plugins: doctest-custom-1.1.0.dev0, cov-2.3.1, timeout-1.0.0 collected 1 items test_setdict.py F =============================== FAILURES =============================== ________________________ [doctest] test_setdict ________________________ 002 >>> set("qwertyuiop") Expected: {'e', 'i', 'o', 'p', 'q', 'r', 't', 'u', 'w', 'y'} Got: {'r', 'e', 'q', 'w', 'y', 't', 'p', 'u', 'o', 'i'} /home/danilo/Desktop/Grupy_2016-08- 13/Exemplos/setdict/test_setdict.py:2: DocTestFailure ======================= 1 failed in 0.02 seconds ======================= """ >>> set("qwertyuiop") {'e', 'i', 'o', 'p', 'q', 'r', 't', 'u', 'w', 'y'} >>> d = {} >>> d["Uma primeira chave beeeem longa... "] = 1 >>> d["Outra primeira chave beeeem longa!"] = 2 >>> d {'Outra primeira chave beeeem longa!': 2, 'Uma primeira chave beeeem longa... ': 1} """ """ >>> set("qwertyuiop") {'e', 'i', 'o', 'p', 'q', 'r', 't', 'u', 'w', 'y'} >>> d = {} >>> d["Uma primeira chave beeeem longa... "] = 1 >>> d["Outra primeira chave beeeem longa!"] = 2 >>> d {'Outra primeira chave beeeem longa!': 2, 'Uma primeira chave beeeem longa... ': 1} """
  • 20. 20/30 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO pytest-doctest-custom dependências, testes, cobertura pytest-doctest-custom dependências, testes, cobertura ● Requer py.test 2.1+ ● Compatível com os interpretadores – CPython 2.6, 2.7 – CPython 3.2, 3.3., 3.4, 3.5, 3.6 (dev) – PyPy 2.x, 4.x, 5.x – PyPy3 2.x, 5.x – Jython 2.7 (py.test 2.2.4+) ● Testado em todas as versões de py.test em cada um dos interpretadores – 337 ambientes no tox.ini – 84 jobs no Travis CI (py.test 2.8.5+) ● Cobertura de código de 100% no módulo do plugin ● Requer py.test 2.1+ ● Compatível com os interpretadores – CPython 2.6, 2.7 – CPython 3.2, 3.3., 3.4, 3.5, 3.6 (dev) – PyPy 2.x, 4.x, 5.x – PyPy3 2.x, 5.x – Jython 2.7 (py.test 2.2.4+) ● Testado em todas as versões de py.test em cada um dos interpretadores – 337 ambientes no tox.ini – 84 jobs no Travis CI (py.test 2.8.5+) ● Cobertura de código de 100% no módulo do plugin
  • 21. 21/30 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO pytest-doctest-custom stream proxy pytest-doctest-custom stream proxy """ >>> set("qwertyuiop") {'e', 'i', 'o', 'p', 'q', 'r', 't', 'u', 'w', 'y'} """ """ >>> set("qwertyuiop") {'e', 'i', 'o', 'p', 'q', 'r', 't', 'u', 'w', 'y'} """ ● Proxies no – pytest_doctest_custom.stdout_proxy – pytest_doctest_custom.stderr_proxy ● Caso sua função seja de impressão em um stream que é fixado no instante da criação, use um desses proxies ● Pode-se usar no conftest.py no mesmo diretório do projeto, por exemplo: ● Proxies no – pytest_doctest_custom.stdout_proxy – pytest_doctest_custom.stderr_proxy ● Caso sua função seja de impressão em um stream que é fixado no instante da criação, use um desses proxies ● Pode-se usar no conftest.py no mesmo diretório do projeto, por exemplo: $ py.test --doctest-modules --doctest-repr=conftest:doctest_pretty ========================= test session starts ========================== platform linux -- Python 3.5.2, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: /home/danilo/Desktop/Grupy_2016-08-13/Exemplos/conftest, inifile: plugins: doctest-custom-1.1.0.dev0, cov-2.3.1, timeout-1.0.0 collected 1 items test_set.py . ======================= 1 passed in 0.01 seconds ======================= $ py.test --doctest-modules --doctest-repr=conftest:doctest_pretty ========================= test session starts ========================== platform linux -- Python 3.5.2, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: /home/danilo/Desktop/Grupy_2016-08-13/Exemplos/conftest, inifile: plugins: doctest-custom-1.1.0.dev0, cov-2.3.1, timeout-1.0.0 collected 1 items test_set.py . ======================= 1 passed in 0.01 seconds ======================= # conftest.py from IPython.lib.pretty import pretty def doctest_pretty(value): return pretty(value, max_width=5) # conftest.py from IPython.lib.pretty import pretty def doctest_pretty(value): return pretty(value, max_width=5)
  • 22. 22/30 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO pytest-doctest-custom internalidades pytest-doctest-custom internalidades ● doctest.DocTestRunner.run – Modifica sys.stdout e sys.stderr – Troca sys.displayhook pelo dunder ● doctest.DocTestRunner._DocTestRunner__run – Utiliza sys.displayhook para a impressão dos resultados dos doctests ● O plugin altera o método run para temporariamente trocar o sys.__displayhook__ por uma função personalizada de impressão ● doctest.DocTestRunner.run – Modifica sys.stdout e sys.stderr – Troca sys.displayhook pelo dunder ● doctest.DocTestRunner._DocTestRunner__run – Utiliza sys.displayhook para a impressão dos resultados dos doctests ● O plugin altera o método run para temporariamente trocar o sys.__displayhook__ por uma função personalizada de impressão
  • 23. 23/30 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO CPython 2.x, 3.x PyPy 2.x, 4.x, 5.x PyPy3 2.x, 5.x Jython 2.7 Diferentes interpretadores representam objetos da mesma forma? CPython 2.x, 3.x PyPy 2.x, 4.x, 5.x PyPy3 2.x, 5.x Jython 2.7 Diferentes interpretadores representam objetos da mesma forma?
  • 24. 24/30 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO IPythonIPython ● Python 2.6/3.2: usar o IPython 1.2.1 – Verificado na instalação ● Até o IPython 5.0.0 – Trata todo dict do PyPy como types.DictProxyType (bug) – Formatação de types.DictProxyType completamente diferente das demais – Não formata types.MappingProxyType – Já corrigi isso para o IPython 5.1 (PR aceito) ● Pretty printer extremamente consistente em todas as versões do CPython/PyPy (a menos do dict) ● Incompatível com Jython ● Python 2.6/3.2: usar o IPython 1.2.1 – Verificado na instalação ● Até o IPython 5.0.0 – Trata todo dict do PyPy como types.DictProxyType (bug) – Formatação de types.DictProxyType completamente diferente das demais – Não formata types.MappingProxyType – Já corrigi isso para o IPython 5.1 (PR aceito) ● Pretty printer extremamente consistente em todas as versões do CPython/PyPy (a menos do dict) ● Incompatível com Jython
  • 25. 25/30 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO pprintpprint ● set() – set() # CPython 2.6, 3.x; PyPy3; Jython 2.7 – set([]) # CPython 2.7; PyPy ● set(range(5)) – {0, 1, 2, 3, 4} # CPython 3.x; PyPy3 – set([0, 1, 2, 3, 4]) # CPython 2.x; PyPy ; Jython 2.7 ● Ordenação – CPython 2.6+: sets sempre ordenados – CPython 3.2+: sets ordenados apenas se a representação não couber em uma linha ● Módulo collections – Rotinas de formatação inseridas no pprint somente no Python 3.5 – Mesmo problema que ocorre com sets (até o momento) ● set() – set() # CPython 2.6, 3.x; PyPy3; Jython 2.7 – set([]) # CPython 2.7; PyPy ● set(range(5)) – {0, 1, 2, 3, 4} # CPython 3.x; PyPy3 – set([0, 1, 2, 3, 4]) # CPython 2.x; PyPy ; Jython 2.7 ● Ordenação – CPython 2.6+: sets sempre ordenados – CPython 3.2+: sets ordenados apenas se a representação não couber em uma linha ● Módulo collections – Rotinas de formatação inseridas no pprint somente no Python 3.5 – Mesmo problema que ocorre com sets (até o momento)
  • 26. 26/30 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO PyPyPyPy ● Nem tudo tem como ser representado adequadamente em versões antigas do PyPy – e.g. “super(…).__thisclass__” ● dict is types.DictProxyType – Isso fazia o IPython perder a rotina de formatação de dicts – Instâncias dict_proxy somente via ctypes (o tipo não possui construtor), e essa classe inexiste no Python 3 – Python 3.3+ (PyPy3 5.2.0-alpha1) possui types.MappingProxyType (com construtor) ● As rotinas do pretty printer do IPython for a preparadas para ter o mesmo comportamento no CPython 2.7, CPython 3.3+ e PyPy 5.3+ ● Nem tudo tem como ser representado adequadamente em versões antigas do PyPy – e.g. “super(…).__thisclass__” ● dict is types.DictProxyType – Isso fazia o IPython perder a rotina de formatação de dicts – Instâncias dict_proxy somente via ctypes (o tipo não possui construtor), e essa classe inexiste no Python 3 – Python 3.3+ (PyPy3 5.2.0-alpha1) possui types.MappingProxyType (com construtor) ● As rotinas do pretty printer do IPython for a preparadas para ter o mesmo comportamento no CPython 2.7, CPython 3.3+ e PyPy 5.3+
  • 27. 27/30 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO Outros assuntos Outros assuntos
  • 28. 28/30 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO SympySympy ● CAS (Computer Algebra System) em Python ● Possui a própria função “pprint”: – >>> from sympy import pprint, exp, pi – >>> pprint(exp(1) + pi) – ℯ + π ● Com o plugin, os exemplos ficariam mais diretos na documentação (usando --doctest-repr=sympy.pprint e admitindo exp e pi já importados no módulo com o teste): – >>> exp(1) + pi – ℯ + π ● CAS (Computer Algebra System) em Python ● Possui a própria função “pprint”: – >>> from sympy import pprint, exp, pi – >>> pprint(exp(1) + pi) – ℯ + π ● Com o plugin, os exemplos ficariam mais diretos na documentação (usando --doctest-repr=sympy.pprint e admitindo exp e pi já importados no módulo com o teste): – >>> exp(1) + pi – ℯ + π
  • 29. 29/30 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO ContextoContexto ● O plugin foi criado para facilitar os testes do projeto PyScanPrev, atualmente testado apenas com doctests – https://github.com/danilobellini/pyscanprev ● Uma ideia similar surgiu durante os sprints da Python Brasil [9] (Brasília-DF, 2013): um plugin para modificar o “>>>” e trocar pelo “In [#]” do IPython, em que o # é um número e a saída possui um prefixo “Out [#]” correspondente. Essa ideia de mudar o PS1 foi abandonada, mas a ideia de um plugin que possibilitasse doctests ao estilo do IPython não. ● O plugin foi criado para facilitar os testes do projeto PyScanPrev, atualmente testado apenas com doctests – https://github.com/danilobellini/pyscanprev ● Uma ideia similar surgiu durante os sprints da Python Brasil [9] (Brasília-DF, 2013): um plugin para modificar o “>>>” e trocar pelo “In [#]” do IPython, em que o # é um número e a saída possui um prefixo “Out [#]” correspondente. Essa ideia de mudar o PS1 foi abandonada, mas a ideia de um plugin que possibilitasse doctests ao estilo do IPython não.
  • 30. 30/30 Danilo de Jesus da Silva Bellini | @danilobellini | facebook.com/djsbellini | github.com/danilobellini Plugin pytest-doctest-custom – 2016-08-13 – GruPy-SP @ SciELO FimFim