diff --git a/doc/pt-br/Makefile b/doc/pt-br/Makefile new file mode 100644 index 000000000..f2db68912 --- /dev/null +++ b/doc/pt-br/Makefile @@ -0,0 +1,43 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + + +REGENDOC_ARGS := \ + --normalize "/[ \t]+\n/\n/" \ + --normalize "~\$$REGENDOC_TMPDIR~/home/sweet/project~" \ + --normalize "~/path/to/example~/home/sweet/project~" \ + --normalize "/in \d.\d\ds/in 0.12s/" \ + --normalize "@/tmp/pytest-of-.*/pytest-\d+@PYTEST_TMPDIR@" \ + --normalize "@pytest-(\d+)\\.[^ ,]+@pytest-\1.x.y@" \ + --normalize "@py-(\d+)\\.[^ ,]+@py-\1.x.y@" \ + --normalize "@pluggy-(\d+)\\.[.\d,]+@pluggy-\1.x.y@" \ + --normalize "@hypothesis-(\d+)\\.[.\d,]+@hypothesis-\1.x.y@" \ + --normalize "@Python (\d+)\\.[^ ,]+@Python \1.x.y@" + +regen: REGENDOC_FILES:=*.rst */*.rst +regen: +# need to reset cachedir to the non-tox default + PYTHONDONTWRITEBYTECODE=1 \ + PYTEST_ADDOPTS="-pno:hypothesis -p no:hypothesispytest -Wignore::pytest.PytestUnknownMarkWarning -o cache_dir=.pytest_cache" \ + COLUMNS=76 \ + regendoc --update ${REGENDOC_FILES} ${REGENDOC_ARGS} + +.PHONY: regen diff --git a/doc/pt-br/_templates/globaltoc.html b/doc/pt-br/_templates/globaltoc.html new file mode 100644 index 000000000..09d970b64 --- /dev/null +++ b/doc/pt-br/_templates/globaltoc.html @@ -0,0 +1,31 @@ +

Contents

+ + + +

About the project

+ + + +{%- if display_toc %} +
+ {{ toc }} +{%- endif %} + +
diff --git a/doc/pt-br/_templates/layout.html b/doc/pt-br/_templates/layout.html new file mode 100644 index 000000000..f7096eaaa --- /dev/null +++ b/doc/pt-br/_templates/layout.html @@ -0,0 +1,52 @@ +{# + + Copied from: + + https://raw.githubusercontent.com/pallets/pallets-sphinx-themes/b0c6c41849b4e15cbf62cc1d95c05ef2b3e155c8/src/pallets_sphinx_themes/themes/pocoo/layout.html + + And removed the warning version (see #7331). + +#} + +{% extends "basic/layout.html" %} + +{% set metatags %} + {{- metatags }} + +{%- endset %} + +{% block extrahead %} + {%- if page_canonical_url %} + + {%- endif %} + + {{ super() }} +{%- endblock %} + +{% block sidebarlogo %} + {% if pagename != "index" or theme_index_sidebar_logo %} + {{ super() }} + {% endif %} +{% endblock %} + +{% block relbar2 %}{% endblock %} + +{% block sidebar2 %} + + {{- super() }} +{%- endblock %} + +{% block footer %} + {{ super() }} + {%- if READTHEDOCS and not readthedocs_docsearch %} + + {%- endif %} + {{ js_tag("_static/version_warning_offset.js") }} +{% endblock %} diff --git a/doc/pt-br/_templates/links.html b/doc/pt-br/_templates/links.html new file mode 100644 index 000000000..c253ecabf --- /dev/null +++ b/doc/pt-br/_templates/links.html @@ -0,0 +1,7 @@ +

Useful Links

+ diff --git a/doc/pt-br/_templates/relations.html b/doc/pt-br/_templates/relations.html new file mode 100644 index 000000000..3bbcde85b --- /dev/null +++ b/doc/pt-br/_templates/relations.html @@ -0,0 +1,19 @@ +

Related Topics

+ diff --git a/doc/pt-br/_templates/sidebarintro.html b/doc/pt-br/_templates/sidebarintro.html new file mode 100644 index 000000000..ae860c172 --- /dev/null +++ b/doc/pt-br/_templates/sidebarintro.html @@ -0,0 +1,5 @@ +

About pytest

+

+ pytest is a mature full-featured Python testing tool that helps + you write better programs. +

diff --git a/doc/pt-br/_templates/slim_searchbox.html b/doc/pt-br/_templates/slim_searchbox.html new file mode 100644 index 000000000..e98ad4ed9 --- /dev/null +++ b/doc/pt-br/_templates/slim_searchbox.html @@ -0,0 +1,15 @@ +{# + basic/searchbox.html with heading removed. +#} +{%- if pagename != "search" and builder != "singlehtml" %} + + +{%- endif %} diff --git a/doc/pt-br/conf.py b/doc/pt-br/conf.py new file mode 100644 index 000000000..5184ee7b1 --- /dev/null +++ b/doc/pt-br/conf.py @@ -0,0 +1,475 @@ +# +# pytest documentation build configuration file, created by +# sphinx-quickstart on Fri Oct 8 17:54:28 2010. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The full version, including alpha/beta/rc tags. +# The short X.Y version. +import ast +import os +import shutil +import sys +from textwrap import dedent +from typing import List +from typing import TYPE_CHECKING + +from _pytest import __version__ as version + +if TYPE_CHECKING: + import sphinx.application + + +release = ".".join(version.split(".")[:2]) + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# sys.path.insert(0, os.path.abspath('.')) + +autodoc_member_order = "bysource" +autodoc_typehints = "description" +autodoc_typehints_description_target = "documented" +todo_include_todos = 1 + +latex_engine = "lualatex" + +latex_elements = { + "preamble": dedent( + r""" + \directlua{ + luaotfload.add_fallback("fallbacks", { + "Noto Serif CJK SC:style=Regular;", + "Symbola:Style=Regular;" + }) + } + + \setmainfont{FreeSerif}[RawFeature={fallback=fallbacks}] + """ + ) +} + +# -- General configuration ----------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +extensions = [ + "pallets_sphinx_themes", + "pygments_pytest", + "sphinx.ext.autodoc", + "sphinx.ext.autosummary", + "sphinx.ext.extlinks", + "sphinx.ext.intersphinx", + "sphinx.ext.todo", + "sphinx.ext.viewcode", + "sphinx_removed_in", + "sphinxcontrib_trio", +] + +# Building PDF docs on readthedocs requires inkscape for svg to pdf +# conversion. The relevant plugin is not useful for normal HTML builds, but +# it still raises warnings and fails CI if inkscape is not available. So +# only use the plugin if inkscape is actually available. +if shutil.which("inkscape"): + extensions.append("sphinxcontrib.inkscapeconverter") + +# Add any paths that contain templates here, relative to this directory. +templates_path = ["_templates"] + +# The suffix of source filenames. +source_suffix = ".rst" + +# The encoding of source files. +# source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = "contents" + +# General information about the project. +project = "pytest" +copyright = "2015, holger krekel and pytest-dev team" + + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +# today = '' +# Else, today_fmt is used as the format for a strftime call. +# today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = [ + "_build", + "naming20.rst", + "test/*", + "old_*", + "*attic*", + "*/attic*", + "funcargs.rst", + "setup.rst", + "example/remoteinterp.rst", +] + + +# The reST default role (used for this markup: `text`) to use for all documents. +default_role = "literal" + +# If true, '()' will be appended to :func: etc. cross-reference text. +# add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +add_module_names = False + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +# show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = "sphinx" + + +# A list of ignored prefixes for module index sorting. +# modindex_common_prefix = [] + +# A list of regular expressions that match URIs that should not be checked when +# doing a linkcheck. +linkcheck_ignore = [ + "https://blogs.msdn.microsoft.com/bharry/2017/06/28/testing-in-a-cloud-delivery-cadence/", + "http://pythontesting.net/framework/pytest-introduction/", + r"https://github.com/pytest-dev/pytest/issues/\d+", + r"https://github.com/pytest-dev/pytest/pull/\d+", +] + +# The number of worker threads to use when checking links (default=5). +linkcheck_workers = 5 + + +_repo = "https://github.com/pytest-dev/pytest" +extlinks = { + "bpo": ("https://bugs.python.org/issue%s", "bpo-%s"), + "pypi": ("https://pypi.org/project/%s/", "%s"), + "issue": (f"{_repo}/issues/%s", "issue #%s"), + "pull": (f"{_repo}/pull/%s", "pull request #%s"), + "user": ("https://github.com/%s", "@%s"), +} + + +# -- Options for HTML output --------------------------------------------------- + +sys.path.append(os.path.abspath("_themes")) +html_theme_path = ["_themes"] + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = "flask" + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# html_theme_options = {"index_logo": None} + +# Add any paths that contain custom themes here, relative to this directory. +# html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +html_title = "pytest documentation" + +# A shorter title for the navigation bar. Default is the same as html_title. +html_short_title = "pytest-%s" % release + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +html_logo = "img/pytest_logo_curves.svg" + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +html_favicon = "img/favicon.png" + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +# html_static_path = ['_static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +# html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +# html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +# html_sidebars = {} +# html_sidebars = {'index': 'indexsidebar.html'} + +html_sidebars = { + "index": [ + "slim_searchbox.html", + "sidebarintro.html", + "globaltoc.html", + "links.html", + "sourcelink.html", + ], + "**": [ + "slim_searchbox.html", + "globaltoc.html", + "relations.html", + "links.html", + "sourcelink.html", + ], +} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +# html_additional_pages = {} +# html_additional_pages = {'index': 'index.html'} + + +# If false, no module index is generated. +html_domain_indices = True + +# If false, no index is generated. +html_use_index = False + +# If true, the index is split into individual pages for each letter. +# html_split_index = False + +# If true, links to the reST sources are added to the pages. +html_show_sourcelink = False + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +# html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +# html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +# html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +# html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = "pytestdoc" + + +# -- Options for LaTeX output -------------------------------------------------- + +# The paper size ('letter' or 'a4'). +# latex_paper_size = 'letter' + +# The font size ('10pt', '11pt' or '12pt'). +# latex_font_size = '10pt' + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +latex_documents = [ + ( + "contents", + "pytest.tex", + "pytest Documentation", + "holger krekel, trainer and consultant, https://merlinux.eu/", + "manual", + ) +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +latex_logo = "img/pytest1.png" + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +# latex_use_parts = False + +# If true, show page references after internal links. +# latex_show_pagerefs = False + +# If true, show URL addresses after external links. +# latex_show_urls = False + +# Additional stuff for the LaTeX preamble. +# latex_preamble = '' + +# Documents to append as an appendix to all manuals. +# latex_appendices = [] + +# If false, no module index is generated. +latex_domain_indices = False + +# -- Options for manual page output -------------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ("how-to/usage", "pytest", "pytest usage", ["holger krekel at merlinux eu"], 1) +] + + +# -- Options for Epub output --------------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = "pytest" +epub_author = "holger krekel at merlinux eu" +epub_publisher = "holger krekel at merlinux eu" +epub_copyright = "2013, holger krekel et alii" + +# The language of the text. It defaults to the language option +# or en if the language is not set. +# epub_language = '' + +# The scheme of the identifier. Typical schemes are ISBN or URL. +# epub_scheme = '' + +# The unique identifier of the text. This can be a ISBN number +# or the project homepage. +# epub_identifier = '' + +# A unique identification for the text. +# epub_uid = '' + +# HTML files that should be inserted before the pages created by sphinx. +# The format is a list of tuples containing the path and title. +# epub_pre_files = [] + +# HTML files shat should be inserted after the pages created by sphinx. +# The format is a list of tuples containing the path and title. +# epub_post_files = [] + +# A list of files that should not be packed into the epub file. +# epub_exclude_files = [] + +# The depth of the table of contents in toc.ncx. +# epub_tocdepth = 3 + +# Allow duplicate toc entries. +# epub_tocdup = True + + +# -- Options for texinfo output ------------------------------------------------ + +texinfo_documents = [ + ( + master_doc, + "pytest", + "pytest Documentation", + ( + "Holger Krekel@*Benjamin Peterson@*Ronny Pfannschmidt@*" + "Floris Bruynooghe@*others" + ), + "pytest", + "simple powerful testing with Python", + "Programming", + 1, + ) +] + + +intersphinx_mapping = { + "pluggy": ("https://pluggy.readthedocs.io/en/stable", None), + "python": ("https://docs.python.org/3", None), + "numpy": ("https://numpy.org/doc/stable", None), + "pip": ("https://pip.pypa.io/en/stable", None), + "tox": ("https://tox.wiki/en/stable", None), + "virtualenv": ("https://virtualenv.pypa.io/en/stable", None), + "setuptools": ("https://setuptools.pypa.io/en/stable", None), + "packaging": ("https://packaging.python.org/en/latest", None), +} + + +def configure_logging(app: "sphinx.application.Sphinx") -> None: + """Configure Sphinx's WarningHandler to handle (expected) missing include.""" + import sphinx.util.logging + import logging + + class WarnLogFilter(logging.Filter): + def filter(self, record: logging.LogRecord) -> bool: + """Ignore warnings about missing include with "only" directive. + + Ref: https://github.com/sphinx-doc/sphinx/issues/2150.""" + if ( + record.msg.startswith('Problems with "include" directive path:') + and "_changelog_towncrier_draft.rst" in record.msg + ): + return False + return True + + logger = logging.getLogger(sphinx.util.logging.NAMESPACE) + warn_handler = [x for x in logger.handlers if x.level == logging.WARNING] + assert len(warn_handler) == 1, warn_handler + warn_handler[0].filters.insert(0, WarnLogFilter()) + + +def setup(app: "sphinx.application.Sphinx") -> None: + app.add_crossref_type( + "fixture", + "fixture", + objname="built-in fixture", + indextemplate="pair: %s; fixture", + ) + + app.add_object_type( + "confval", + "confval", + objname="configuration value", + indextemplate="pair: %s; configuration value", + ) + + app.add_object_type( + "globalvar", + "globalvar", + objname="global variable interpreted by pytest", + indextemplate="pair: %s; global variable interpreted by pytest", + ) + + app.add_crossref_type( + directivename="hook", + rolename="hook", + objname="pytest hook", + indextemplate="pair: %s; hook", + ) + + configure_logging(app) + + # Make Sphinx mark classes with "final" when decorated with @final. + # We need this because we import final from pytest._compat, not from + # typing (for Python < 3.8 compat), so Sphinx doesn't detect it. + # To keep things simple we accept any `@final` decorator. + # Ref: https://github.com/pytest-dev/pytest/pull/7780 + import sphinx.pycode.ast + import sphinx.pycode.parser + + original_is_final = sphinx.pycode.parser.VariableCommentPicker.is_final + + def patched_is_final(self, decorators: List[ast.expr]) -> bool: + if original_is_final(self, decorators): + return True + return any( + sphinx.pycode.ast.unparse(decorator) == "final" for decorator in decorators + ) + + sphinx.pycode.parser.VariableCommentPicker.is_final = patched_is_final + + # legacypath.py monkey-patches pytest.Testdir in. Import the file so + # that autodoc can discover references to it. + import _pytest.legacypath # noqa: F401 diff --git a/doc/pt-br/contents.rst b/doc/pt-br/contents.rst new file mode 100644 index 000000000..1022efb67 --- /dev/null +++ b/doc/pt-br/contents.rst @@ -0,0 +1,17 @@ +.. _toc: + +Documentação completa do Pytest +=============================== + +`Baixe a versão mais recente em PDF `_ + +.. `Baixe a versão mais recente em EPUB `_ + + +Comece aqui +----------- + +.. toctree:: + :maxdepth: 2 + + getting-started diff --git a/doc/pt-br/getting-started.rst b/doc/pt-br/getting-started.rst new file mode 100644 index 000000000..835b55d55 --- /dev/null +++ b/doc/pt-br/getting-started.rst @@ -0,0 +1,276 @@ +.. _get-started: + +Comece aqui +=================================== + +.. _`getstarted`: +.. _`installation`: + +Instale o ``pytest`` +---------------------------------------- + +``pytest`` requer: Python 3.7+ or PyPy3. + +1. Rode o seguinte comando no seu terminal de comandos: + +.. code-block:: bash + + pip install -U pytest + +2. Confirme que você instalou a versão correta: + +.. code-block:: bash + + $ pytest --version + pytest 7.1.3 + +.. _`simpletest`: + +Crie seu primeiro teste +---------------------------------------------------------- + +Crie um novo arquivo chamado ``test_sample.py``, contendo uma função e um teste: + +.. code-block:: python + + # conteudo de test_sample.py + def func(x): + return x + 1 + + + def test_answer(): + assert func(3) == 5 + +O teste + +.. code-block:: pytest + + $ pytest + =========================== test session starts ============================ + platform linux -- Python 3.x.y, pytest-7.x.y, pluggy-1.x.y + rootdir: /home/sweet/project + collected 1 item + + test_sample.py F [100%] + + ================================= FAILURES ================================= + _______________________________ test_answer ________________________________ + + def test_answer(): + > assert func(3) == 5 + E assert 4 == 5 + E + where 4 = func(3) + + test_sample.py:6: AssertionError + ========================= short test summary info ========================== + FAILED test_sample.py::test_answer - assert 4 == 5 + ============================ 1 failed in 0.12s ============================= + +O ``[100%]`` se refere ao progresso geral de rodar todos os casos de teste. Depois que ele termina, o pytest mostra um +relatório de falhas pois ``func(3)`` não retorna ``5``. + +.. note:: + + Você pode usar sentenças ``assert`` para verificar resultados esperados. A :ref:`Introspecçao avançada de asserções ` do pytest + irá inteligentemente reportar valores intermediários da expressão *assert* para que você possa evitar + usar os vários nomes de :ref:`métodos legados do JUnit `. + +Rode multiplos testes +---------------------------------------------------------- + +O ``pytest`` vai rodar todos os arquivos que seguirem o padrão test_*.py ou \*_test.py no diretório atual e em seus +subdiretórios. De maneira mais geral, ele segue as regras padrões de descoberta de testes. + +.. + :ref:`regras padrões de descoberta de testes ` + + +Verifique se uma exceção especifica é levantada +-------------------------------------------------------------- + +Use a expressão auxiliar raises para verificar que algum pedaço de código levanta uma exceção: + +.. + :ref:`raises ` + +.. code-block:: python + + # conteude de test_sysexit.py + import pytest + + + def f(): + raise SystemExit(1) + + + def test_mytest(): + with pytest.raises(SystemExit): + f() + +Execute a função de teste com o modo de relatório "quieto" (*quiet*): + +.. code-block:: pytest + + $ pytest -q test_sysexit.py + . [100%] + 1 passed in 0.12s + +.. note:: + + A flag ``-q/--quiet`` é usada para manter a saida desse exemplo e dos próximos pequena. + +Agrupe multiplos testes em uma classe +-------------------------------------------------------------- + +.. regendoc:wipe + +Depois de desenvolver multiplos testes, você pode querer agrupá-los em uma classe. +pytest torna fácil o processo de criar uma classe contendo mais de um teste: + +.. code-block:: python + + # conteudo of test_class.py + class TestClass: + def test_one(self): + x = "this" + assert "h" in x + + def test_two(self): + x = "hello" + assert hasattr(x, "check") + +``pytest`` descobre todos os testes seguindo as Convenções para descoberta de testes Python, +então eé encontra ambas as funlções com o prefixo ``test_``. Não há a necessidade de usar subclasses, mas se certifique +de usar o prefixo ``Test`` nas suas classes, caso contrário a classe vai ser ignorada. Podemos simplesmente rodar o +módulo usando nome do arquivo: + +.. + :ref:`Convenções para descoberta de testes Python ` + +.. code-block:: pytest + + $ pytest -q test_class.py + .F [100%] + ================================= FAILURES ================================= + ____________________________ TestClass.test_two ____________________________ + + self = + + def test_two(self): + x = "hello" + > assert hasattr(x, "check") + E AssertionError: assert False + E + where False = hasattr('hello', 'check') + + test_class.py:8: AssertionError + ========================= short test summary info ========================== + FAILED test_class.py::TestClass::test_two - AssertionError: assert False + 1 failed, 1 passed in 0.12s + +O primeiro teste passou e o segundo falhou. Você pode facilmente ver os valores intermediários na asserção para ajudar +você a entender a razão da falha. + +Agrupar testes em classes traz benefícios pelas seguintes razões: + + * Organização dos testes + * Compartilhar fixtures apenas para testes de uma classe em particular + * Aplicar marcadores a nível de classe e tê-los implicitamente aplicados para todos os testes + +Uma coisa a manter em mente quando você está agrupando testes dentro de classes é que cada teste tem uma instância +única da classe. Ter cada teste compartilhar uma mesma instância da classe prejudicaria o isolamento do teste e também +encorajaria más práticas de teste. +Isso está detalhado abaixo: + +.. regendoc:wipe + +.. code-block:: python + + # conteudo de test_class_demo.py + class TestClassDemoInstance: + value = 0 + + def test_one(self): + self.value = 1 + assert self.value == 1 + + def test_two(self): + assert self.value == 1 + + +.. code-block:: pytest + + $ pytest -k TestClassDemoInstance -q + .F [100%] + ================================= FAILURES ================================= + ______________________ TestClassDemoInstance.test_two ______________________ + + self = + + def test_two(self): + > assert self.value == 1 + E assert 0 == 1 + E + where 0 = .value + + test_class_demo.py:9: AssertionError + ========================= short test summary info ========================== + FAILED test_class_demo.py::TestClassDemoInstance::test_two - assert 0 == 1 + 1 failed, 1 passed in 0.12s + +Note que os atributes adicionados a nivel de classe são *atributos de classe*, então eles são compartilhados entre os +testes. + +Use um diretório temporário para testes funcionáis +-------------------------------------------------------------- + +O ``pytest`` provê Fixtures e argumentos de função padrões para requisitar recursos arbitrários, +como um diretório temporário único: + +.. + :std:doc:`Fixtures e argumentos de função padrões ` + +.. code-block:: python + + # conteudo de test_tmp_path.py + def test_needsfiles(tmp_path): + print(tmp_path) + assert 0 + +Liste o nome ``tmp_path`` na assinatura da função de teste e o ``pytest`` irá procurar e chamar uma fábrica de fixtures +para criar o recurso antes de executar a chamada da função de teste. Antes do teste rodar, ``pytest`` cria um +diretório temporário que é único para cada invocação/execução daquele teste. + +.. code-block:: pytest + + $ pytest -q test_tmp_path.py + F [100%] + ================================= FAILURES ================================= + _____________________________ test_needsfiles ______________________________ + + tmp_path = PosixPath('PYTEST_TMPDIR/test_needsfiles0') + + def test_needsfiles(tmp_path): + print(tmp_path) + > assert 0 + E assert 0 + + test_tmp_path.py:3: AssertionError + --------------------------- Captured stdout call --------------------------- + PYTEST_TMPDIR/test_needsfiles0 + ========================= short test summary info ========================== + FAILED test_tmp_path.py::test_needsfiles - assert 0 + 1 failed in 0.12s + +Mais informações sobre como manipular diretórios temporários está disponível em +Arquivos e diretórios temporários . + +Conheça que tipos de fixtures do pytest estão disponíveis por padrão com o comando: + +.. + :ref:`Arquivos e diretórios temporários ` + :ref:`fixtures do pytest ` + +.. code-block:: bash + + pytest --fixtures # shows builtin and custom fixtures + +Note que esse comando omite fixtures que começam com ``_`` a não ser que a opção ``-v`` seja adicionada ao comando. diff --git a/doc/pt-br/img/cramer2.png b/doc/pt-br/img/cramer2.png new file mode 100644 index 000000000..6bf0e92e2 Binary files /dev/null and b/doc/pt-br/img/cramer2.png differ diff --git a/doc/pt-br/img/favicon.png b/doc/pt-br/img/favicon.png new file mode 100644 index 000000000..5c8824d67 Binary files /dev/null and b/doc/pt-br/img/favicon.png differ diff --git a/doc/pt-br/img/freiburg2.jpg b/doc/pt-br/img/freiburg2.jpg new file mode 100644 index 000000000..3383d3023 Binary files /dev/null and b/doc/pt-br/img/freiburg2.jpg differ diff --git a/doc/pt-br/img/gaynor3.png b/doc/pt-br/img/gaynor3.png new file mode 100644 index 000000000..a577c168b Binary files /dev/null and b/doc/pt-br/img/gaynor3.png differ diff --git a/doc/pt-br/img/keleshev.png b/doc/pt-br/img/keleshev.png new file mode 100644 index 000000000..0d5e571e2 Binary files /dev/null and b/doc/pt-br/img/keleshev.png differ diff --git a/doc/pt-br/img/pullrequest.png b/doc/pt-br/img/pullrequest.png new file mode 100644 index 000000000..4af293b21 Binary files /dev/null and b/doc/pt-br/img/pullrequest.png differ diff --git a/doc/pt-br/img/pylib.png b/doc/pt-br/img/pylib.png new file mode 100644 index 000000000..2e10d4388 Binary files /dev/null and b/doc/pt-br/img/pylib.png differ diff --git a/doc/pt-br/img/pytest1.png b/doc/pt-br/img/pytest1.png new file mode 100644 index 000000000..498e70485 Binary files /dev/null and b/doc/pt-br/img/pytest1.png differ diff --git a/doc/pt-br/img/pytest_logo_curves.svg b/doc/pt-br/img/pytest_logo_curves.svg new file mode 100644 index 000000000..e05ceb112 --- /dev/null +++ b/doc/pt-br/img/pytest_logo_curves.svg @@ -0,0 +1,29 @@ + + + + + diff --git a/doc/pt-br/img/theuni.png b/doc/pt-br/img/theuni.png new file mode 100644 index 000000000..abeb737e7 Binary files /dev/null and b/doc/pt-br/img/theuni.png differ diff --git a/doc/pt-br/index.rst b/doc/pt-br/index.rst new file mode 100644 index 000000000..e6ea16ebc --- /dev/null +++ b/doc/pt-br/index.rst @@ -0,0 +1,128 @@ +:orphan: + +.. _features: + +pytest: ajuda você a escrever programas melhores +================================================ + +.. module:: pytest + +O *framework* ``pytest`` torna fácil a tarefa de escrever pequenos, legíveis testes, e consegue escalar para suportar +testes funcionais complexos para aplicações e bibliotecas. + + +``pytest`` requer: Python 3.7+ ou PyPy3. + +**Nome do pacote PyPI**: :pypi:`pytest` + + +Um exemplo rápido +----------------- + +.. code-block:: python + + # conteudo de test_sample.py + def inc(x): + return x + 1 + + + def test_answer(): + assert inc(3) == 5 + + +Para executá-lo: + +.. code-block:: pytest + + $ pytest + =========================== test session starts ============================ + platform linux -- Python 3.x.y, pytest-7.x.y, pluggy-1.x.y + rootdir: /home/sweet/project + collected 1 item + + test_sample.py F [100%] + + ================================= FAILURES ================================= + _______________________________ test_answer ________________________________ + + def test_answer(): + > assert inc(3) == 5 + E assert 4 == 5 + E + where 4 = inc(3) + + test_sample.py:6: AssertionError + ========================= short test summary info ========================== + FAILED test_sample.py::test_answer - assert 4 == 5 + ============================ 1 failed in 0.12s ============================= + +Graças a introspecção detalhada de asserções do ``pytest``, somente puras sentenças de ``assert`` são usadas. +Veja :ref:`Começe aqui ` para uma indrotução básica de como usar o pytest. + + +Funcionalidades +--------------- + +- Informação detalhada sobre sentenças de asserção (não precisa decorar nomes do ``self.assert*`` + +- Descoberta automática de módulos de testes e funções + +- Fixtures modulares para gerenciar recursos de testes pequenos ou parametrizados. + +- Capaz de rodar suites de testes escritas usando unittest (incluindo *trial*) e + nose sem nenhuma mudança extra. + +- Python 3.7+ ou PyPy 3 + +- Arquitetura rica para plugins, com mais de 800+ plugins externos e uma comunidade ativa + + +Documentação +------------ + +* :ref:`Comece aqui ` - instale o pytest e conheça o básico em apenas vinte minutos +* Guias how-to - guias com passo a passo, cobrundo um grande conjunto de casos de uso e necessidades +* Guias de referência - inclui a referência completa para a API do pytest, + uma lista de plugins e mais +* Explicações - background, discução de tópicos chaves, resposta a perguntas de alto-nível + + +Bugs/Pedidos +------------ + +Por favor use o `gerenciador de bugs do Github `_ para submeter bugs ou +pedidos de novas funcionalidades. + + +Suporte o pytest +---------------- + +`Open Collective`_ é uma plataforma de financiamento online para comunidades abertas e transparentes. +Ela provê ferramentas para arrecadar dinheiro e compartilhar gastos com trasnparencia total. + +Ela é a plataforma recomendada para indivíduos e companhias que queira fazer doações mensais ou imediatas diretamente +para o projeto. + +Veja mais detalhes no `pytest collective`_. + +.. _Open Collective: https://opencollective.com +.. _pytest collective: https://opencollective.com/pytest + + +pytest para empresas +-------------------- + +Disponível como parte da assinatuda Tidelift. + +Os mantedores do pytest e milhares de outros pacotes estão trabalhando com a Tidelift para entregar suporte de nível +comercioal e manutenção para as dependencias de código aberto que você usa para construir suas aplicações. +Economize tempo, reduça risco, e melhore a saúde do código, enquanto paga exatamente os mantedores das dependencias que +você usa. + +`Saiba mais. `_ + +Segurança +~~~~~~~~~ + +pytest, até agora, nunca foi associada a uma vulnerabilidade de segurança, mas de qualquer maneira, para reportar +uma vulnerabilidade de segurança, por favor use o `Contato de segurança da Tidelift `_. +A Tidelift irá coordenar o conserto da vulnerabilidade e sua divulgação. diff --git a/tox.ini b/tox.ini index f04242c5c..46bacd2f9 100644 --- a/tox.ini +++ b/tox.ini @@ -79,7 +79,9 @@ commands = # the '-t changelog_towncrier_draft' tags makes sphinx include the draft # changelog in the docs; this does not happen on ReadTheDocs because it uses # the standard sphinx command so the 'changelog_towncrier_draft' is never set there - sphinx-build -W --keep-going -b html doc/en doc/en/_build/html -t changelog_towncrier_draft {posargs:} + # sphinx-build -W --keep-going -b html doc/en doc/en/_build/html -t changelog_towncrier_draft {posargs:} + sphinx-build -W --keep-going -b html doc/pt-br doc/pt-br/_build/html -t changelog_towncrier_draft {posargs:} + [testenv:docs-checklinks] basepython = python3