{"title":"Testes unitários","version":"6.0","locale":"pt-br","docname":"internals/contributing/writing-code/unit-tests","url":"/pt-br/6.0/internals/contributing/writing-code/unit-tests/","canonical":"https://djangodocs.dev/pt-br/6.0/internals/contributing/writing-code/unit-tests/","summary":"O Django vem com uma suíte de testes própria, no diretório tests do código. É nossa política garantir que todos os testes passem em todos os momentos. Nós…","html":"<h1>Testes unitários<a class=\"heading-anchor\" href=\"#unit-tests\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>O Django vem com uma suíte de testes própria, no diretório <code class=\"docutils literal notranslate\"><span class=\"pre\">tests</span></code> do código. É nossa política garantir que todos os testes passem em todos os momentos.</p>\n<p>Nós agradecemos toda e qualquer contribuição para a suíte de testes.</p>\n<p>Todos os testes do Django usam a infraestrutura de testes que é distribuída com o Django para testar aplicações. Veja <a class=\"reference internal\" href=\"/pt-br/6.0/topics/testing/overview/\"><span class=\"doc\">Writing and running tests</span></a> para uma explicação de como escrever novos testes.</p>\n<section id=\"running-the-unit-tests\">\n<span id=\"running-unit-tests\"></span><h2>Rodando os testes unitários<a class=\"heading-anchor\" href=\"#running-the-unit-tests\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"quickstart\">\n<h3>Início Rápido<a class=\"heading-anchor\" href=\"#quickstart\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Primeiro, faça o <a class=\"reference external\" href=\"https://github.com/django/django/fork\">“fork”do Django no GitHub</a>.</p>\n<p>Segundo, crie e ative um ambiente virtual. Se não estiver familiar de como fazê-lo, leia nosso <a class=\"reference internal\" href=\"/pt-br/6.0/intro/contributing/\"><span class=\"doc\">tutorial de como contribuir</span></a>.</p>\n<p>Next, clone your fork, install some requirements, and run the tests:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-0-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>git<span class=\"w\"> </span>clone<span class=\"w\"> </span>https://github.com/YourGitHubName/django.git<span class=\"w\"> </span>django-repo\n<span class=\"gp\">$ </span><span class=\"nb\">cd</span><span class=\"w\"> </span>django-repo/tests\n<span class=\"gp\">$ </span>python<span class=\"w\"> </span>-m<span class=\"w\"> </span>pip<span class=\"w\"> </span>install<span class=\"w\"> </span>-e<span class=\"w\"> </span>..\n<span class=\"gp\">$ </span>python<span class=\"w\"> </span>-m<span class=\"w\"> </span>pip<span class=\"w\"> </span>install<span class=\"w\"> </span>-r<span class=\"w\"> </span>requirements/py3.txt\n<span class=\"gp\">$ </span>./runtests.py\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-0-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> git clone https://github.com/YourGitHubName/django.git django-repo\n<span class=\"gp\">...\\&gt;</span> <span class=\"k\">cd</span> django-repo\\tests\n<span class=\"gp\">...\\&gt;</span> py -m pip install -e ..\n<span class=\"gp\">...\\&gt;</span> py -m pip install -r requirements\\py3.txt\n<span class=\"gp\">...\\&gt;</span> runtests.py \n</code></pre></div></div></div>\n<p>Installing the requirements will likely require some operating system packages\nthat your computer doesn’t have installed. You can usually figure out which\npackage to install by doing a web search for the last line or so of the error\nmessage. Try adding your operating system to the search query if needed.</p>\n<p>If you have trouble installing an optional test dependency, you can skip that\ndependency locally. For example, if installing <code class=\"docutils literal notranslate\"><span class=\"pre\">pylibmc</span></code> fails, comment out\nits line in <code class=\"docutils literal notranslate\"><span class=\"pre\">requirements/py3.txt</span></code> and continue with <code class=\"docutils literal notranslate\"><span class=\"pre\">./runtests.py</span></code>.\nTests that require <code class=\"docutils literal notranslate\"><span class=\"pre\">pylibmc</span></code> will be skipped automatically. See\n<a class=\"reference internal\" href=\"#running-unit-tests-dependencies\"><span class=\"std std-ref\">Rodando todos os testes</span></a> for details on installing the optional\ntest dependencies.</p>\n<p>Running the tests requires a Django settings module that defines the databases\nto use. To help you get started, Django provides and uses a sample settings\nmodule that uses the SQLite database. See <a class=\"reference internal\" href=\"#running-unit-tests-settings\"><span class=\"std std-ref\">Usando outro módulo settings</span></a> to\nlearn how to use a different settings module to run the tests with a different\ndatabase.</p>\n<p>Está tendo problemas? Veja <a class=\"reference internal\" href=\"#troubleshooting-unit-tests\"><span class=\"std std-ref\">Solução de Problemas</span></a> para alguns problemas comuns.</p>\n</section>\n<section id=\"running-tests-using-tox\">\n<h3>Executando testes usando <code class=\"docutils literal notranslate\"><span class=\"pre\">tox</span></code><a class=\"heading-anchor\" href=\"#running-tests-using-tox\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><a class=\"reference external\" href=\"https://tox.wiki/\">Tox</a> is a tool for running tests in different virtual\nenvironments. Django includes a basic <code class=\"docutils literal notranslate\"><span class=\"pre\">tox.ini</span></code> that automates some checks\nthat our build server performs on pull requests. To run the unit tests and\nother checks (such as <a class=\"reference internal\" href=\"/pt-br/6.0/internals/contributing/writing-code/coding-style/#coding-style-imports\"><span class=\"std std-ref\">import sorting</span></a>, the\n<a class=\"reference internal\" href=\"/pt-br/6.0/internals/contributing/writing-documentation/#documentation-spelling-check\"><span class=\"std std-ref\">documentation spelling checker</span></a>, and\n<a class=\"reference internal\" href=\"/pt-br/6.0/internals/contributing/writing-code/coding-style/#coding-style-python\"><span class=\"std std-ref\">code formatting</span></a>), install and run the <code class=\"docutils literal notranslate\"><span class=\"pre\">tox</span></code>\ncommand from any place in the Django source tree:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-1-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>-m<span class=\"w\"> </span>pip<span class=\"w\"> </span>install<span class=\"w\"> </span>tox\n<span class=\"gp\">$ </span>tox\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-1-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py -m pip install tox\n<span class=\"gp\">...\\&gt;</span> tox\n</code></pre></div></div></div>\n<p>By default, <code class=\"docutils literal notranslate\"><span class=\"pre\">tox</span></code> runs the test suite with the bundled test settings file for\nSQLite, <code class=\"docutils literal notranslate\"><span class=\"pre\">black</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">blacken-docs</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">flake8</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">isort</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">lint-docs</span></code>,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">zizmor</span></code>, and the documentation spelling checker. In addition to the system\ndependencies noted elsewhere in this documentation, the command <code class=\"docutils literal notranslate\"><span class=\"pre\">python3</span></code>\nmust be on your path and linked to the appropriate version of Python. A list of\ndefault environments can be seen as follows:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-2-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>tox<span class=\"w\"> </span>-l\n<span class=\"go\">py3</span>\n<span class=\"go\">black</span>\n<span class=\"go\">blacken-docs</span>\n<span class=\"go\">flake8&gt;=3.7.0</span>\n<span class=\"go\">docs</span>\n<span class=\"go\">isort&gt;=7.0.0</span>\n<span class=\"go\">lint-docs</span>\n<span class=\"go\">zizmor&gt;=1.16.3</span>\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-2-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> tox -l\n<span class=\"go\">py3</span>\n<span class=\"go\">black</span>\n<span class=\"go\">blacken-docs</span>\n<span class=\"gp\">flake8&gt;</span>=3.7.0\n<span class=\"go\">docs</span>\n<span class=\"gp\">isort&gt;</span>=7.0.0\n<span class=\"go\">lint-docs</span>\n<span class=\"gp\">zizmor&gt;</span>=1.16.3\n</code></pre></div></div></div>\n<section id=\"testing-other-python-versions-and-database-backends\">\n<h4>Testing other Python versions and database backends<a class=\"heading-anchor\" href=\"#testing-other-python-versions-and-database-backends\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>In addition to the default environments, <code class=\"docutils literal notranslate\"><span class=\"pre\">tox</span></code> supports running unit tests\nfor other versions of Python and other database backends. Since Django’s test\nsuite doesn’t bundle a settings file for database backends other than SQLite,\nhowever, you must <a class=\"reference internal\" href=\"#running-unit-tests-settings\"><span class=\"std std-ref\">create and provide your own test settings</span></a>. For example, to run the tests on Python 3.12\nusing PostgreSQL:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-3-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>tox<span class=\"w\"> </span>-e<span class=\"w\"> </span>py312-postgres<span class=\"w\"> </span>--<span class=\"w\"> </span>--settings<span class=\"o\">=</span>my_postgres_settings\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-3-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> tox -e py312-postgres -- --settings=my_postgres_settings\n</code></pre></div></div></div>\n<p>This command sets up a Python 3.12 virtual environment, installs Django’s\ntest suite dependencies (including those for PostgreSQL), and calls\n<code class=\"docutils literal notranslate\"><span class=\"pre\">runtests.py</span></code> with the supplied arguments (in this case,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">--settings=my_postgres_settings</span></code>).</p>\n<p>The remainder of this documentation shows commands for running tests without\n<code class=\"docutils literal notranslate\"><span class=\"pre\">tox</span></code>, however, any option passed to <code class=\"docutils literal notranslate\"><span class=\"pre\">runtests.py</span></code> can also be passed to\n<code class=\"docutils literal notranslate\"><span class=\"pre\">tox</span></code> by prefixing the argument list with <code class=\"docutils literal notranslate\"><span class=\"pre\">--</span></code>, as above.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">Tox</span></code> also respects the <span class=\"target\" id=\"index-0\"></span><a class=\"reference internal\" href=\"/pt-br/6.0/topics/settings/#envvar-DJANGO_SETTINGS_MODULE\"><code class=\"xref std std-envvar docutils literal notranslate\"><span class=\"pre\">DJANGO_SETTINGS_MODULE</span></code></a> environment\nvariable, if set. For example, the following is equivalent to the command\nabove:</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span><span class=\"nv\">DJANGO_SETTINGS_MODULE</span><span class=\"o\">=</span>my_postgres_settings<span class=\"w\"> </span>tox<span class=\"w\"> </span>-e<span class=\"w\"> </span>py312-postgres\n</code></pre></div>\n<p>Windows users should use:</p>\n<div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows code\"><code><span class=\"gp\">...\\&gt;</span> <span class=\"k\">set</span> <span class=\"nv\">DJANGO_SETTINGS_MODULE</span><span class=\"p\">=</span>my_postgres_settings\n<span class=\"gp\">...\\&gt;</span> tox -e py312-postgres\n</code></pre></div>\n</section>\n<section id=\"running-the-javascript-tests\">\n<h4>Executando os testes JavaScript<a class=\"heading-anchor\" href=\"#running-the-javascript-tests\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Django includes a set of <a class=\"reference internal\" href=\"/pt-br/6.0/internals/contributing/writing-code/javascript/#javascript-tests\"><span class=\"std std-ref\">JavaScript unit tests</span></a> for\nfunctions in certain contrib apps. The JavaScript tests aren’t run by default\nusing <code class=\"docutils literal notranslate\"><span class=\"pre\">tox</span></code> because they require <code class=\"docutils literal notranslate\"><span class=\"pre\">Node.js</span></code> to be installed and aren’t\nnecessary for the majority of patches. To run the JavaScript tests using\n<code class=\"docutils literal notranslate\"><span class=\"pre\">tox</span></code>:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-4-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>tox<span class=\"w\"> </span>-e<span class=\"w\"> </span>javascript\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-4-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> tox -e javascript\n</code></pre></div></div></div>\n<p>This command runs <code class=\"docutils literal notranslate\"><span class=\"pre\">npm</span> <span class=\"pre\">install</span></code> to ensure test requirements are up to\ndate and then runs <code class=\"docutils literal notranslate\"><span class=\"pre\">npm</span> <span class=\"pre\">test</span></code>.</p>\n</section>\n</section>\n<section id=\"running-tests-using-django-docker-box\">\n<span id=\"running-tests-docker-box\"></span><h3>Running tests using <code class=\"docutils literal notranslate\"><span class=\"pre\">django-docker-box</span></code><a class=\"heading-anchor\" href=\"#running-tests-using-django-docker-box\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><a class=\"reference external\" href=\"https://github.com/django/django-docker-box/\">django-docker-box</a> allows you to run the Django’s test suite across all\nsupported databases and python versions. See the <a class=\"reference external\" href=\"https://github.com/django/django-docker-box/\">django-docker-box</a> project\npage for installation and usage instructions.</p>\n</section>\n<section id=\"using-another-settings-module\">\n<span id=\"running-unit-tests-settings\"></span><h3>Usando outro módulo <code class=\"docutils literal notranslate\"><span class=\"pre\">settings</span></code><a class=\"heading-anchor\" href=\"#using-another-settings-module\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>The included settings module (<code class=\"docutils literal notranslate\"><span class=\"pre\">tests/test_sqlite.py</span></code>) allows you to run the\ntest suite using SQLite. If you want to run the tests using a different\ndatabase, you’ll need to define your own settings file. Some tests, such as\nthose for <code class=\"docutils literal notranslate\"><span class=\"pre\">contrib.postgres</span></code>, are specific to a particular database backend\nand will be skipped if run with a different backend. Some tests are skipped or\nexpected failures on a particular database backend (see\n<code class=\"docutils literal notranslate\"><span class=\"pre\">DatabaseFeatures.django_test_skips</span></code> and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">DatabaseFeatures.django_test_expected_failures</span></code> on each backend).</p>\n<p>To run the tests with different settings, ensure that the module is on your\n<span class=\"target\" id=\"index-1\"></span><a class=\"reference external\" href=\"https://docs.python.org/3/using/cmdline.html#envvar-PYTHONPATH\" title=\"(em Python v3.14)\"><code class=\"xref std std-envvar docutils literal notranslate\"><span class=\"pre\">PYTHONPATH</span></code></a> and pass the module with <code class=\"docutils literal notranslate\"><span class=\"pre\">--settings</span></code>.</p>\n<p>O setting <a class=\"reference internal\" href=\"/pt-br/6.0/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a> em qualquer settings de módulo de testes precisa definir dois bancos:</p>\n<ul class=\"simple\">\n<li><p>O banco <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code>. Este banco deve usar o backend que você quer usar para testes primários.</p></li>\n<li><p>Um banco de dados com o apelido <code class=\"docutils literal notranslate\"><span class=\"pre\">other</span></code>. O banco de dados <code class=\"docutils literal notranslate\"><span class=\"pre\">other</span></code> é usado para testar consultas que podem ser direcionadas a diferentes bancos de dados. Este banco de dados devem usar o mesmo “backend” que o <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code>, e deve ter um nome diferente.</p></li>\n</ul>\n<p>Se você está usando um backend que não é o SQLite, você irá precisar providenciar outros detalhes para cada banco de dados:</p>\n<ul class=\"simple\">\n<li><p>A opção <a class=\"reference internal\" href=\"/pt-br/6.0/ref/settings/#std-setting-USER\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USER</span></code></a> deve especificar uma conta de usuário válida para o banco de dados. Esse usuário precisa ter permissão para executar <code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">DATABASE</span></code> de modo que o banco de dados de teste possa ser criado.</p></li>\n<li><p>A opção <a class=\"reference internal\" href=\"/pt-br/6.0/ref/settings/#std-setting-PASSWORD\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">PASSWORD</span></code></a> precisa fornecer uma senha para o user <a class=\"reference internal\" href=\"/pt-br/6.0/ref/settings/#std-setting-USER\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USER</span></code></a> que foi especificado.</p></li>\n</ul>\n<p>Os nomes dos bancos de dados de teste são gerados adicionando o prefixo <code class=\"docutils literal notranslate\"><span class=\"pre\">test_</span></code> ao valor do campo <a class=\"reference internal\" href=\"/pt-br/6.0/ref/settings/#std-setting-NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">NAME</span></code></a> das configurações dos bancos de dados definidos dentro de <a class=\"reference internal\" href=\"/pt-br/6.0/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a>. Esses bancos de testes são deletados quando os testes são concluídos.</p>\n<p>Você também terá que garantir que o seu banco de dados usa UTF-8 por padrão como charset. Se o servidor do seu banco de dados não usa UTF-8 como charset padrão, você terá que incluir um valor para <a class=\"reference internal\" href=\"/pt-br/6.0/ref/settings/#std-setting-TEST_CHARSET\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CHARSET</span></code></a>  no dicionário do settings de teste para o banco de dados correspondente.</p>\n</section>\n<section id=\"running-only-some-of-the-tests\">\n<span id=\"runtests-specifying-labels\"></span><h3>Rodando apenas alguns dos testes.<a class=\"heading-anchor\" href=\"#running-only-some-of-the-tests\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>A suíte completa de testes do Django leva um tempo para rodar, e rodar cada um dos testes pode ser redundantes se, por exemplo, você deseja adicionar um teste no Django que você quer rodar rapidamente sem ter que rodar todo o resto. Você pode rodar um subconjunto de testes unitários adicionando os nomes dos módulos de teste para o comando <code class=\"docutils literal notranslate\"><span class=\"pre\">runtests.py</span></code> na linha de comando.</p>\n<p>For example, if you’d like to run tests only for generic relations and\ninternationalization, type:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-5-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>./runtests.py<span class=\"w\"> </span>--settings<span class=\"o\">=</span>path.to.settings<span class=\"w\"> </span>generic_relations<span class=\"w\"> </span>i18n\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-5-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> runtests.py --settings=path.to.settings generic_relations i18n\n</code></pre></div></div></div>\n<p>Como você pode saber os nomes de testes em específico? Procure em <code class=\"docutils literal notranslate\"><span class=\"pre\">tests/</span></code> — cada nome de diretório lá representa o nome de um teste.</p>\n<p>If you want to run only a particular class of tests, you can specify a list of\npaths to individual test classes. For example, to run the <code class=\"docutils literal notranslate\"><span class=\"pre\">TranslationTests</span></code>\nof the <code class=\"docutils literal notranslate\"><span class=\"pre\">i18n</span></code> module, type:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-6-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>./runtests.py<span class=\"w\"> </span>--settings<span class=\"o\">=</span>path.to.settings<span class=\"w\"> </span>i18n.tests.TranslationTests\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-6-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> runtests.py --settings=path.to.settings i18n.tests.TranslationTests\n</code></pre></div></div></div>\n<p>Going beyond that, you can specify an individual test method like this:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-7-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>./runtests.py<span class=\"w\"> </span>--settings<span class=\"o\">=</span>path.to.settings<span class=\"w\"> </span>i18n.tests.TranslationTests.test_lazy_objects\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-7-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> runtests.py --settings=path.to.settings i18n.tests.TranslationTests.test_lazy_objects\n</code></pre></div></div></div>\n<p>You can run tests starting at a specified top-level module with <code class=\"docutils literal notranslate\"><span class=\"pre\">--start-at</span></code>\noption. For example:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-8-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>./runtests.py<span class=\"w\"> </span>--start-at<span class=\"o\">=</span>wsgi\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-8-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> runtests.py --start-at=wsgi\n</code></pre></div></div></div>\n<p>You can also run tests starting after a specified top-level module with\n<code class=\"docutils literal notranslate\"><span class=\"pre\">--start-after</span></code> option. For example:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-9-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>./runtests.py<span class=\"w\"> </span>--start-after<span class=\"o\">=</span>wsgi\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-9-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> runtests.py --start-after=wsgi\n</code></pre></div></div></div>\n<p>Note that the <code class=\"docutils literal notranslate\"><span class=\"pre\">--reverse</span></code> option doesn’t impact on <code class=\"docutils literal notranslate\"><span class=\"pre\">--start-at</span></code> or\n<code class=\"docutils literal notranslate\"><span class=\"pre\">--start-after</span></code> options. Moreover these options cannot be used with test\nlabels.</p>\n</section>\n<section id=\"running-the-selenium-tests\">\n<span id=\"running-selenium-tests\"></span><h3>Rodando os testes do Selenium<a class=\"heading-anchor\" href=\"#running-the-selenium-tests\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Some tests require Selenium and a web browser. To run these tests, you must\ninstall the <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/selenium/\">selenium</a> package and run the tests with the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">--selenium=&lt;BROWSERS&gt;</span></code> option. For example, if you have Firefox and Google\nChrome installed:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-10-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>./runtests.py<span class=\"w\"> </span>--selenium<span class=\"o\">=</span>firefox,chrome\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-10-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> runtests.py --selenium=firefox,chrome\n</code></pre></div></div></div>\n<p>Veja o pacote <a class=\"reference external\" href=\"https://github.com/SeleniumHQ/selenium/tree/trunk/py/selenium/webdriver\">selenium.webdriver</a> para uma lista de navegadores disponíveis.</p>\n<p>Definindo o <code class=\"docutils literal notranslate\"><span class=\"pre\">--selenium</span></code> automaticamente define <code class=\"docutils literal notranslate\"><span class=\"pre\">--tags=selenium</span></code> para rodar somente testes que requerem o selenium.</p>\n<p>Some browsers (e.g. Chrome or Firefox) support headless testing, which can be\nfaster and more stable. Add the <code class=\"docutils literal notranslate\"><span class=\"pre\">--headless</span></code> option to enable this mode.</p>\n<section id=\"screenshot-tests\">\n<span id=\"id1\"></span><h4>Screenshot tests<a class=\"heading-anchor\" href=\"#screenshot-tests\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>For testing changes to the admin UI, the selenium tests can be run with the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">--screenshots</span></code> option enabled. Screenshots will be saved to the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">tests/screenshots/</span></code> directory.</p>\n<p>To define when screenshots should be taken during a selenium test, the test\nclass must use the <code class=\"docutils literal notranslate\"><span class=\"pre\">&#64;django.test.selenium.screenshot_cases</span></code> decorator with a\nlist of supported screenshot types (<code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;desktop_size&quot;</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;mobile_size&quot;</span></code>,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;small_screen_size&quot;</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;rtl&quot;</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;dark&quot;</span></code>, and <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;high_contrast&quot;</span></code>). It\ncan then call <code class=\"docutils literal notranslate\"><span class=\"pre\">self.take_screenshot(&quot;unique-screenshot-name&quot;)</span></code> at the desired\npoint to generate the screenshots. For example:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.test.selenium</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">SeleniumTestCase</span><span class=\"p\">,</span> <span class=\"n\">screenshot_cases</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">reverse</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">SeleniumTests</span><span class=\"p\">(</span><span class=\"n\">SeleniumTestCase</span><span class=\"p\">):</span>\n    <span class=\"nd\">@screenshot_cases</span><span class=\"p\">([</span><span class=\"s2\">&quot;desktop_size&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;mobile_size&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;rtl&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;dark&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;high_contrast&quot;</span><span class=\"p\">])</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_login_button_centered</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">selenium</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">live_server_url</span> <span class=\"o\">+</span> <span class=\"n\">reverse</span><span class=\"p\">(</span><span class=\"s2\">&quot;admin:login&quot;</span><span class=\"p\">))</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">take_screenshot</span><span class=\"p\">(</span><span class=\"s2\">&quot;login&quot;</span><span class=\"p\">)</span>\n        <span class=\"o\">...</span>\n</code></pre></div>\n<p>This generates multiple screenshots of the login page - one for a desktop\nscreen, one for a mobile screen, one for right-to-left languages on desktop,\none for the dark mode on desktop, and one for high contrast mode on desktop\nwhen using chrome.</p>\n</section>\n</section>\n<section id=\"running-all-the-tests\">\n<span id=\"running-unit-tests-dependencies\"></span><h3>Rodando todos os testes<a class=\"heading-anchor\" href=\"#running-all-the-tests\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Se você quiser rodar toda a suíte de testes, você precisará instalar algumas dependências:</p>\n<ul class=\"simple\">\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/aiosmtpd/\">aiosmtpd</a> 1.4.5+</p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/argon2-cffi/\">argon2-cffi</a> 23.1.0+</p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/asgiref/\">asgiref</a> 3.9.1+ (required)</p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/bcrypt/\">bcrypt</a> 4.1.1+</p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/colorama/\">colorama</a> 0.4.6+</p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/docutils/\">docutils</a> 0.22+</p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/geoip2/\">geoip2</a> 4.8.0+</p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/Jinja2/\">Jinja2</a> 2.11+</p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/numpy/\">numpy</a> 1.26.0+</p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/Pillow/\">Pillow</a> 10.1.0+</p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/PyYAML/\">PyYAML</a> 6.0.2+</p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/pywatchman/\">pywatchman</a></p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/redis/\">redis</a> 5.1.0+</p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/pymemcache/\">pymemcache</a>, plus a <a class=\"reference external\" href=\"https://memcached.org/\">supported Python binding</a></p></li>\n<li><p><a class=\"reference external\" href=\"https://www.gnu.org/software/gettext/manual/gettext.html\">gettext</a>\n(<a class=\"reference internal\" href=\"/pt-br/6.0/topics/i18n/translation/#gettext-on-windows\"><span class=\"std std-ref\">gettext on Windows</span></a>)</p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/selenium/\">selenium</a> 4.23.0+</p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/sqlparse/\">sqlparse</a> 0.5.0+ (required)</p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/tblib/\">tblib</a> 3.0.0+</p></li>\n</ul>\n<p>You can find these dependencies in <a class=\"reference external\" href=\"https://pip.pypa.io/en/latest/user_guide/#requirements-files\">pip requirements files</a> inside the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">tests/requirements</span></code> directory of the Django source tree and install them\nlike so:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-11-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>-m<span class=\"w\"> </span>pip<span class=\"w\"> </span>install<span class=\"w\"> </span>-r<span class=\"w\"> </span>tests/requirements/py3.txt\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-11-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py -m pip install -r tests\\requirements\\py3.txt\n</code></pre></div></div></div>\n<p>Se você encontrar algum erro durante a instalação, talvez esteja faltando no seu sistema alguma dependência de um ou mais pacotes do Python. Consulte a documentação dos pacotes com falha ou faça uma busca na web com a mensagem de erro que você encontrou.</p>\n<p>Você também pode instalar o adaptador (ou adaptadores) de sua escolha usando <code class=\"docutils literal notranslate\"><span class=\"pre\">oracle.txt</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">mysql.txt</span></code>, ou <code class=\"docutils literal notranslate\"><span class=\"pre\">postgres.txt</span></code>.</p>\n<p>If you want to test the memcached or Redis cache backends, you’ll also need to\ndefine a <a class=\"reference internal\" href=\"/pt-br/6.0/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> setting that points at your memcached or Redis\ninstance respectively.</p>\n<p>To run the GeoDjango tests, you will need to <a class=\"reference internal\" href=\"/pt-br/6.0/ref/contrib/gis/install/\"><span class=\"doc\">set up a spatial database\nand install the Geospatial libraries</span></a>.</p>\n<p>Cada uma dessas dependências é opcional. Se você estiver esquecendo qualquer uma delas, os testes associados serão pulados.</p>\n<p>To run some of the autoreload tests, you’ll need to install the\n<a class=\"reference external\" href=\"https://facebook.github.io/watchman/\">Watchman</a> service.</p>\n</section>\n<section id=\"code-coverage\">\n<h3>Cobertura de código<a class=\"heading-anchor\" href=\"#code-coverage\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Voluntários são encorajados a rodar a cobertura na suíte de testes para identificar áreas que precisam de mais testes. A instalação da ferramenta de cobertura e a sua utilização é descrita em <a class=\"reference internal\" href=\"/pt-br/6.0/topics/testing/advanced/#topics-testing-code-coverage\"><span class=\"std std-ref\">testando a cobertura de código</span></a>.</p>\n<p>To run coverage on the Django test suite using the standard test settings:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-12-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>coverage<span class=\"w\"> </span>run<span class=\"w\"> </span>./runtests.py<span class=\"w\"> </span>--settings<span class=\"o\">=</span>test_sqlite\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-12-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> coverage run runtests.py --settings=test_sqlite\n</code></pre></div></div></div>\n<p>After running coverage, combine all coverage statistics by running:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-13-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>coverage<span class=\"w\"> </span>combine\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-13-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> coverage combine\n</code></pre></div></div></div>\n<p>After that generate the html report by running:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-14-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>coverage<span class=\"w\"> </span>html\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-14-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> coverage html\n</code></pre></div></div></div>\n<p>Quando executar a cobertura para testes do Django, o arquivo de settings incluído <code class=\"docutils literal notranslate\"><span class=\"pre\">.coveragerc</span></code> define <code class=\"docutils literal notranslate\"><span class=\"pre\">coverage_html</span></code> como sendo o diretório de saída para o relatório e também exclui vários diretórios não relevantes para os resultados (código de testes ou código externo incluídos no Django).</p>\n</section>\n<section id=\"code-coverage-on-pull-requests\">\n<span id=\"id2\"></span><h3>Code coverage on pull requests<a class=\"heading-anchor\" href=\"#code-coverage-on-pull-requests\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django’s continuous integration (CI) system automatically runs code coverage\nanalysis on pull requests and posts a comment with a diff coverage report. This\nhelps reviewers see which lines in the changed code are covered by tests.</p>\n<p><strong>What the coverage report shows:</strong></p>\n<p>The coverage report posted on pull requests uses <a class=\"reference external\" href=\"https://github.com/Bachmann1234/diff_cover\">diff-cover</a> to analyze only\nthe lines that were changed or added in the PR. It shows:</p>\n<ul class=\"simple\">\n<li><p>Lines that are covered by tests (✓)</p></li>\n<li><p>Lines that are not covered by tests (✗)</p></li>\n<li><p>Lines that cannot be covered (e.g., comments, blank lines)</p></li>\n</ul>\n<p><strong>Important limitations:</strong></p>\n<p>When reviewing coverage reports on pull requests, keep these limitations in\nmind:</p>\n<ul class=\"simple\">\n<li><p><strong>Database-specific code:</strong> The CI coverage job runs tests using SQLite on\nWindows. Code paths specific to other databases (PostgreSQL, MySQL, Oracle)\nwill appear as “not covered” even if database-specific tests exist. This is\nexpected and acceptable.</p></li>\n<li><p><strong>Platform-specific code:</strong> Similarly, code that only runs on certain\noperating systems (Linux, macOS) will appear as not covered when run on\nWindows.</p></li>\n<li><p><strong>Coverage doesn’t equal quality:</strong> A line being “covered” only means it was\nexecuted during tests. It doesn’t guarantee the line is well-tested or that\nall edge cases are handled. During review, assess test quality beyond just\ncoverage numbers.</p></li>\n</ul>\n<p>Missing coverage should be considered a warning rather than a blocker and\nshould be evaluated in context.</p>\n</section>\n</section>\n<section id=\"contrib-apps\">\n<span id=\"id3\"></span><h2>Aplicações Contrib<a class=\"heading-anchor\" href=\"#contrib-apps\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Tests for contrib apps can be found in the <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/6.0.x/tests/\">tests/</a> directory,\ntypically under <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;app_name&gt;_tests</span></code>. For example, tests for <code class=\"docutils literal notranslate\"><span class=\"pre\">contrib.auth</span></code>\nare located in <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/6.0.x/tests/auth_tests\">tests/auth_tests</a>.</p>\n</section>\n<section id=\"troubleshooting\">\n<span id=\"troubleshooting-unit-tests\"></span><h2>Solução de Problemas<a class=\"heading-anchor\" href=\"#troubleshooting\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"test-suite-hangs-or-shows-failures-on-main-branch\">\n<h3>Test suite hangs or shows failures on <code class=\"docutils literal notranslate\"><span class=\"pre\">main</span></code> branch<a class=\"heading-anchor\" href=\"#test-suite-hangs-or-shows-failures-on-main-branch\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Ensure you have the latest point release of a <a class=\"reference internal\" href=\"/pt-br/6.0/faq/install/#faq-python-version-support\"><span class=\"std std-ref\">supported Python version</span></a>, since there are often bugs in earlier versions\nthat may cause the test suite to fail or hang.</p>\n<p>On <strong>macOS</strong> (High Sierra and newer versions), you might see this message\nlogged, after which the tests hang:</p>\n<div class=\"code-block\" data-language=\"pytb\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Pytb</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Pytb code\"><code><span class=\"x\">objc[42074]: +[__NSPlaceholderDate initialize] may have been in progress in</span>\n<span class=\"x\">another thread when fork() was called.</span>\n</code></pre></div>\n<p>To avoid this set a <code class=\"docutils literal notranslate\"><span class=\"pre\">OBJC_DISABLE_INITIALIZE_FORK_SAFETY</span></code> environment\nvariable, for example:</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>$<span class=\"w\"> </span><span class=\"nv\">OBJC_DISABLE_INITIALIZE_FORK_SAFETY</span><span class=\"o\">=</span>YES<span class=\"w\"> </span>./runtests.py\n</code></pre></div>\n<p>Or add <code class=\"docutils literal notranslate\"><span class=\"pre\">export</span> <span class=\"pre\">OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES</span></code> to your shell’s\nstartup file (e.g. <code class=\"docutils literal notranslate\"><span class=\"pre\">~/.profile</span></code>).</p>\n</section>\n<section id=\"many-test-failures-with-unicodeencodeerror\">\n<h3>Vários testes falham com <code class=\"docutils literal notranslate\"><span class=\"pre\">UnicodeEncodeError</span></code><a class=\"heading-anchor\" href=\"#many-test-failures-with-unicodeencodeerror\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Se o pacote de <code class=\"docutils literal notranslate\"><span class=\"pre\">locales</span></code> não estiver instalado, alguns testes irão falhar com um <code class=\"docutils literal notranslate\"><span class=\"pre\">UnicodeEncodeError</span></code>.</p>\n<p>You can resolve this on Debian-based systems, for example, by running:</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>apt-get<span class=\"w\"> </span>install<span class=\"w\"> </span>locales\n<span class=\"gp\">$ </span>dpkg-reconfigure<span class=\"w\"> </span>locales\n</code></pre></div>\n<p>You can resolve this for macOS systems by configuring your shell’s locale:</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span><span class=\"nb\">export</span><span class=\"w\"> </span><span class=\"nv\">LANG</span><span class=\"o\">=</span><span class=\"s2\">&quot;en_US.UTF-8&quot;</span>\n<span class=\"gp\">$ </span><span class=\"nb\">export</span><span class=\"w\"> </span><span class=\"nv\">LC_ALL</span><span class=\"o\">=</span><span class=\"s2\">&quot;en_US.UTF-8&quot;</span>\n</code></pre></div>\n<p>Execute o comando <code class=\"docutils literal notranslate\"><span class=\"pre\">locale</span></code> para confirmar a alteração. Opcionalmente, adicione os comandos de “export” para o arquivo de inicialização do seu “shell” (exemplo <code class=\"docutils literal notranslate\"><span class=\"pre\">~/.bashrc</span></code> para o Bash) para evitar ter que redefini-los.</p>\n</section>\n<section id=\"tests-that-only-fail-in-combination\">\n<h3>Testes que só falham em combinação<a class=\"heading-anchor\" href=\"#tests-that-only-fail-in-combination\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Caso um teste passe quando rodado isoladamente mas que falhe quando rodado dentro de uma suíte inteira de testes, nós temos algumas ferramentas para ajudar a analizar o problema.</p>\n<p>A opção <code class=\"docutils literal notranslate\"><span class=\"pre\">--bisect</span></code> do <code class=\"docutils literal notranslate\"><span class=\"pre\">runtests.py</span></code> irá executar o teste que falhou enquanto reparte o conjunto de testes do qual o teste falho faz parte a cada nova iteração, geralmente permitindo identificar um pequeno número de testes que podem estar relacionados com a falha.</p>\n<p>For example, suppose that the failing test that works on its own is\n<code class=\"docutils literal notranslate\"><span class=\"pre\">ModelTest.test_eq</span></code>, then using:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-15-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>./runtests.py<span class=\"w\"> </span>--bisect<span class=\"w\"> </span>basic.tests.ModelTest.test_eq\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-15-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> runtests.py --bisect basic.tests.ModelTest.test_eq\n</code></pre></div></div></div>\n<p>Nós vamos tentar descobrir um teste que interfere com o teste escolhido. Primeiro, o teste é rodado com a primeira metade da suíte de testes. Se uma falha ocorrer, a primeira metade da suíte de testes é dividida em dois grupos e cada grupo é então rodado com o teste especificado. Se não existe falha com a primeira metade da suíte de testes, a segunda metade da suíte é rodada com o teste especificado e dividida apropriadamente conforme descrito anteriormente. O processo se repete até que o conjunto de testes que falham é minimizado.</p>\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">--pair</span></code> option runs the given test alongside every other test from the\nsuite, letting you check if another test has side-effects that cause the\nfailure. So:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-16-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>./runtests.py<span class=\"w\"> </span>--pair<span class=\"w\"> </span>basic.tests.ModelTest.test_eq\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-16-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> runtests.py --pair basic.tests.ModelTest.test_eq\n</code></pre></div></div></div>\n<p>nós vamos parear <code class=\"docutils literal notranslate\"><span class=\"pre\">test_eq</span></code> com cada rótulo de teste</p>\n<p>With both <code class=\"docutils literal notranslate\"><span class=\"pre\">--bisect</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">--pair</span></code>, if you already suspect which cases\nmight be responsible for the failure, you may limit tests to be cross-analyzed\nby <a class=\"reference internal\" href=\"#runtests-specifying-labels\"><span class=\"std std-ref\">specifying further test labels</span></a> after\nthe first one:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-17-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>./runtests.py<span class=\"w\"> </span>--pair<span class=\"w\"> </span>basic.tests.ModelTest.test_eq<span class=\"w\"> </span>queries<span class=\"w\"> </span>transactions\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-17-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> runtests.py --pair basic.tests.ModelTest.test_eq queries transactions\n</code></pre></div></div></div>\n<p>You can also try running any set of tests in a random or reverse order using\nthe <code class=\"docutils literal notranslate\"><span class=\"pre\">--shuffle</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">--reverse</span></code> options. This can help verify that\nexecuting tests in a different order does not cause any trouble:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-18-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>./runtests.py<span class=\"w\"> </span>basic<span class=\"w\"> </span>--shuffle\n<span class=\"gp\">$ </span>./runtests.py<span class=\"w\"> </span>basic<span class=\"w\"> </span>--reverse\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-18-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> runtests.py basic --shuffle\n<span class=\"gp\">...\\&gt;</span> runtests.py basic --reverse\n</code></pre></div></div></div>\n</section>\n<section id=\"seeing-the-sql-queries-run-during-a-test\">\n<h3>Verificando as consultas SQL realizadas durante os testes<a class=\"heading-anchor\" href=\"#seeing-the-sql-queries-run-during-a-test\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>If you wish to examine the SQL being run in failing tests, you can turn on\n<a class=\"reference internal\" href=\"/pt-br/6.0/ref/logging/#django-db-logger\"><span class=\"std std-ref\">SQL logging</span></a> using the <code class=\"docutils literal notranslate\"><span class=\"pre\">--debug-sql</span></code> option. If you\ncombine this with <code class=\"docutils literal notranslate\"><span class=\"pre\">--verbosity=2</span></code>, all SQL queries will be output:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-19-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>./runtests.py<span class=\"w\"> </span>basic<span class=\"w\"> </span>--debug-sql\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-19-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> runtests.py basic --debug-sql\n</code></pre></div></div></div>\n</section>\n<section id=\"seeing-the-full-traceback-of-a-test-failure\">\n<h3>Visualizando todo o traceback de um teste falho<a class=\"heading-anchor\" href=\"#seeing-the-full-traceback-of-a-test-failure\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>By default tests are run in parallel with one process per core. When the tests\nare run in parallel, however, you’ll only see a truncated traceback for any\ntest failures. You can adjust this behavior with the <code class=\"docutils literal notranslate\"><span class=\"pre\">--parallel</span></code> option:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-20-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>./runtests.py<span class=\"w\"> </span>basic<span class=\"w\"> </span>--parallel<span class=\"o\">=</span><span class=\"m\">1</span>\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-20-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> runtests.py basic --parallel=1\n</code></pre></div></div></div>\n<p>You can also use the <span class=\"target\" id=\"index-2\"></span><a class=\"reference internal\" href=\"/pt-br/6.0/ref/django-admin/#envvar-DJANGO_TEST_PROCESSES\"><code class=\"xref std std-envvar docutils literal notranslate\"><span class=\"pre\">DJANGO_TEST_PROCESSES</span></code></a> environment variable for\nthis purpose.</p>\n</section>\n</section>\n<section id=\"tips-for-writing-tests\">\n<h2>Dicas para rodar testes<a class=\"heading-anchor\" href=\"#tips-for-writing-tests\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"isolating-model-registration\">\n<h3>Isolando o registro de modelos<a class=\"heading-anchor\" href=\"#isolating-model-registration\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>To avoid polluting the global <a class=\"reference internal\" href=\"/pt-br/6.0/ref/applications/#django.apps.apps\" title=\"django.apps.apps\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">apps</span></code></a> registry and prevent\nunnecessary table creation, models defined in a test method should be bound to\na temporary <code class=\"docutils literal notranslate\"><span class=\"pre\">Apps</span></code> instance. To do this, use the\n<a class=\"reference internal\" href=\"/pt-br/6.0/topics/testing/tools/#django.test.utils.isolate_apps\" title=\"django.test.utils.isolate_apps\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">isolate_apps()</span></code></a> decorator:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.test</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">SimpleTestCase</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.test.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">isolate_apps</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">TestModelDefinition</span><span class=\"p\">(</span><span class=\"n\">SimpleTestCase</span><span class=\"p\">):</span>\n    <span class=\"nd\">@isolate_apps</span><span class=\"p\">(</span><span class=\"s2\">&quot;app_label&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_model_definition</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">TestModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n            <span class=\"k\">pass</span>\n\n        <span class=\"o\">...</span>\n</code></pre></div>\n<aside class=\"admonition-setting-app-label admonition\">\n<p class=\"admonition-title\">A definição <code class=\"docutils literal notranslate\"><span class=\"pre\">app_label</span></code></p>\n<p>Modelos definidos em um método de teste sem explicitar o <a class=\"reference internal\" href=\"/pt-br/6.0/ref/models/options/#django.db.models.Options.app_label\" title=\"django.db.models.Options.app_label\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">app_label</span></code></a> são automaticamente assinalados com a etiqueta da aplicação na qual sua classe de teste está localizada.</p>\n<p>De modo a ter certeza que os modelos definidos dentro do contexto das instâncias de <a class=\"reference internal\" href=\"/pt-br/6.0/topics/testing/tools/#django.test.utils.isolate_apps\" title=\"django.test.utils.isolate_apps\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">isolate_apps()</span></code></a> estão corretamente instalados, você deve passar a definição dos <code class=\"docutils literal notranslate\"><span class=\"pre\">app_label</span></code> alvo como argumentos:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">tests/app_label/tests.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.test</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">SimpleTestCase</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.test.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">isolate_apps</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">TestModelDefinition</span><span class=\"p\">(</span><span class=\"n\">SimpleTestCase</span><span class=\"p\">):</span>\n    <span class=\"nd\">@isolate_apps</span><span class=\"p\">(</span><span class=\"s2\">&quot;app_label&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;other_app_label&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_model_definition</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"c1\"># This model automatically receives app_label=&#39;app_label&#39;</span>\n        <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">TestModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n            <span class=\"k\">pass</span>\n\n        <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">OtherAppModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n            <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n                <span class=\"n\">app_label</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;other_app_label&quot;</span>\n\n        <span class=\"o\">...</span>\n</code></pre></figure>\n</aside>\n</section>\n</section>","rootId":"unit-tests","toc":[{"title":"Rodando os testes unitários","anchor":"running-the-unit-tests","children":[{"title":"Início Rápido","anchor":"quickstart","children":[]},{"title":"Executando testes usando tox","anchor":"running-tests-using-tox","children":[{"title":"Testing other Python versions and database backends","anchor":"testing-other-python-versions-and-database-backends","children":[]},{"title":"Executando os testes JavaScript","anchor":"running-the-javascript-tests","children":[]}]},{"title":"Running tests using django-docker-box","anchor":"running-tests-using-django-docker-box","children":[]},{"title":"Usando outro módulo settings","anchor":"using-another-settings-module","children":[]},{"title":"Rodando apenas alguns dos testes.","anchor":"running-only-some-of-the-tests","children":[]},{"title":"Rodando os testes do Selenium","anchor":"running-the-selenium-tests","children":[{"title":"Screenshot tests","anchor":"screenshot-tests","children":[]}]},{"title":"Rodando todos os testes","anchor":"running-all-the-tests","children":[]},{"title":"Cobertura de código","anchor":"code-coverage","children":[]},{"title":"Code coverage on pull requests","anchor":"code-coverage-on-pull-requests","children":[]}]},{"title":"Aplicações Contrib","anchor":"contrib-apps","children":[]},{"title":"Solução de Problemas","anchor":"troubleshooting","children":[{"title":"Test suite hangs or shows failures on main branch","anchor":"test-suite-hangs-or-shows-failures-on-main-branch","children":[]},{"title":"Vários testes falham com UnicodeEncodeError","anchor":"many-test-failures-with-unicodeencodeerror","children":[]},{"title":"Testes que só falham em combinação","anchor":"tests-that-only-fail-in-combination","children":[]},{"title":"Verificando as consultas SQL realizadas durante os testes","anchor":"seeing-the-sql-queries-run-during-a-test","children":[]},{"title":"Visualizando todo o traceback de um teste falho","anchor":"seeing-the-full-traceback-of-a-test-failure","children":[]}]},{"title":"Dicas para rodar testes","anchor":"tips-for-writing-tests","children":[{"title":"Isolando o registro de modelos","anchor":"isolating-model-registration","children":[]}]}],"breadcrumbs":[{"docname":"internals/index","title":"Funcionamento interno do Projeto Django","url":"/pt-br/6.0/internals/"},{"docname":"internals/contributing/index","title":"Contribuindo com o Django","url":"/pt-br/6.0/internals/contributing/"},{"docname":"internals/contributing/writing-code/index","title":"Contributing code","url":"/pt-br/6.0/internals/contributing/writing-code/"}],"prev":{"docname":"internals/contributing/writing-code/submitting-patches","title":"Submitting contributions","url":"/pt-br/6.0/internals/contributing/writing-code/submitting-patches/"},"next":{"docname":"internals/contributing/writing-code/working-with-git","title":"Trabalhando com Git e GitHub","url":"/pt-br/6.0/internals/contributing/writing-code/working-with-git/"},"formats":{"html":"/pt-br/6.0/internals/contributing/writing-code/unit-tests/","markdown":"/pt-br/6.0/internals/contributing/writing-code/unit-tests.md","json":"/pt-br/6.0/internals/contributing/writing-code/unit-tests.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/internals/contributing/writing-code/unit-tests.txt","official":"https://docs.djangoproject.com/pt-br/6.0/internals/contributing/writing-code/unit-tests/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}