{"title":"单元测试集","version":"5.0","locale":"zh-hans","docname":"internals/contributing/writing-code/unit-tests","url":"/zh-hans/5.0/internals/contributing/writing-code/unit-tests/","canonical":"https://djangodocs.dev/zh-hans/5.0/internals/contributing/writing-code/unit-tests/","summary":"Django在代码基本库的 tests 目录中带有自己的测试套件。 我们的政策是确保所有测试始终通过。 我们感谢对测试套件的所有贡献！ Django 的测试都使用随 Django 一起提供的测试基础结构来测试应用程序。请查看 编写并运行测试 以了解如何编写新的测试。 运行单元测试 Link to this heading #…","html":"<h1>单元测试集<a class=\"heading-anchor\" href=\"#unit-tests\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Django在代码基本库的 <code class=\"docutils literal notranslate\"><span class=\"pre\">tests</span></code> 目录中带有自己的测试套件。 我们的政策是确保所有测试始终通过。</p>\n<p>我们感谢对测试套件的所有贡献！</p>\n<p>Django 的测试都使用随 Django 一起提供的测试基础结构来测试应用程序。请查看 <a class=\"reference internal\" href=\"/zh-hans/5.0/topics/testing/overview/\"><span class=\"doc\">编写并运行测试</span></a> 以了解如何编写新的测试。</p>\n<section id=\"running-the-unit-tests\">\n<span id=\"running-unit-tests\"></span><h2>运行单元测试<a class=\"heading-anchor\" href=\"#running-the-unit-tests\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"quickstart\">\n<h3>快速上手<a class=\"heading-anchor\" href=\"#quickstart\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>首先，在 GitHub 上 <a class=\"reference external\" href=\"https://github.com/django/django/fork\">fork Django</a>。</p>\n<p>第二步，创建并激活虚拟环境。如果你不熟悉如何做，可以阅读我们的 <a class=\"reference internal\" href=\"/zh-hans/5.0/intro/contributing/\"><span class=\"doc\">贡献教程</span></a>。</p>\n<p>接下来，克隆您的 fork，安装一些要求，然后运行测试：</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>安装这些要求可能需要一些操作系统包，您的计算机可能没有安装。通常，您可以通过搜索错误消息的最后一行或附近的信息来找出需要安装的包。如果需要的话，可以在搜索查询中添加您的操作系统信息。</p>\n<p>如果安装这些要求遇到困难，您可以跳过这一步。请参阅 <a class=\"reference internal\" href=\"#running-unit-tests-dependencies\"><span class=\"std std-ref\">运行所有测试</span></a> 以了解如何安装可选的测试依赖项的详细信息。如果您没有安装某个可选的依赖项，将会跳过需要它的测试。</p>\n<p>运行测试需要一个定义要使用的数据库的 Django 设置模块。为了帮助您入门，Django 提供并使用一个示例设置模块，使用 SQLite 数据库。请参阅 <a class=\"reference internal\" href=\"#running-unit-tests-settings\"><span class=\"std std-ref\">使用另一个 settings 配置模块</span></a> 了解如何使用不同的设置模块以不同的数据库运行测试。</p>\n<p>遇到问题了吗？请查看 <a class=\"reference internal\" href=\"#troubleshooting-unit-tests\"><span class=\"std std-ref\">错误调试</span></a> 以了解一些常见问题。</p>\n</section>\n<section id=\"running-tests-using-tox\">\n<h3>使用 <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 to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><a class=\"reference external\" href=\"https://tox.wiki/\">Tox</a> 是一个在不同虚拟环境中运行测试的工具。Django 包含一个基本的 <code class=\"docutils literal notranslate\"><span class=\"pre\">tox.ini</span></code> 文件，用于自动执行一些我们的构建服务器在拉取请求上执行的检查。要运行单元测试和其他检查（如 <a class=\"reference internal\" href=\"/zh-hans/5.0/internals/contributing/writing-code/coding-style/#coding-style-imports\"><span class=\"std std-ref\">import sorting</span></a>、<a class=\"reference internal\" href=\"/zh-hans/5.0/internals/contributing/writing-documentation/#documentation-spelling-check\"><span class=\"std std-ref\">documentation spelling checker</span></a> 和 <a class=\"reference internal\" href=\"/zh-hans/5.0/internals/contributing/writing-code/coding-style/#coding-style-python\"><span class=\"std std-ref\">code formatting</span></a>），请在 Django 源代码树的任何位置安装并运行 <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-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>默认情况下，<code class=\"docutils literal notranslate\"><span class=\"pre\">tox</span></code> 使用 SQLite 的捆绑测试设置文件运行测试套件，还会运行 <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\">python3</span></code> 命令必须位于您的路径上并链接到适当版本的 Python。默认环境列表如下：</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;=5.1.0</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>=5.1.0\n</code></pre></div></div></div>\n<section id=\"testing-other-python-versions-and-database-backends\">\n<h4>测试其他 Python 版本和数据库后端<a class=\"heading-anchor\" href=\"#testing-other-python-versions-and-database-backends\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>除了默认的环境外，<code class=\"docutils literal notranslate\"><span class=\"pre\">tox</span></code> 还支持运行其他版本的 Python 和其他数据库后端的单元测试。但由于 Django 的测试套件不提供除 SQLite 外的数据库后端的设置文件，因此您必须 <a class=\"reference internal\" href=\"#running-unit-tests-settings\"><span class=\"std std-ref\">创建并提供自己的测试设置</span></a>。例如，要在 Python 3.10 上使用 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>py310-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 py310-postgres -- --settings=my_postgres_settings\n</code></pre></div></div></div>\n<p>此命令设置一个 Python 3.10 的虚拟环境，安装 Django 的测试套件依赖项（包括 PostgreSQL 的依赖项），然后使用提供的参数（在本例中为 <code class=\"docutils literal notranslate\"><span class=\"pre\">--settings=my_postgres_settings</span></code>）调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">runtests.py</span></code>。</p>\n<p>本文档的其余部分展示了如何在没有 <code class=\"docutils literal notranslate\"><span class=\"pre\">tox</span></code> 的情况下运行测试的命令，但是，可以通过在参数列表前面加上 <code class=\"docutils literal notranslate\"><span class=\"pre\">--</span></code> 来将任何选项传递给 <code class=\"docutils literal notranslate\"><span class=\"pre\">tox</span></code>，就像上面一样。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">Tox</span></code> 还会尊重设置的 <span class=\"target\" id=\"index-6\"></span><a class=\"reference internal\" href=\"/zh-hans/5.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> 环境变量。例如，以下命令与上面的命令等效：</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>py310-postgres\n</code></pre></div>\n<p>对于 Windows 用户应使用：</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 py310-postgres\n</code></pre></div>\n</section>\n<section id=\"running-the-javascript-tests\">\n<h4>运行 JavaScript 测试集<a class=\"heading-anchor\" href=\"#running-the-javascript-tests\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Django 包含了一组针对某些附加应用程序中的功能的 <a class=\"reference internal\" href=\"/zh-hans/5.0/internals/contributing/writing-code/javascript/#javascript-tests\"><span class=\"std std-ref\">JavaScript 单元测试</span></a>。这些 JavaScript 测试默认情况下不会使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">tox</span></code> 运行，因为它们需要安装 <code class=\"docutils literal notranslate\"><span class=\"pre\">Node.js</span></code>，并且对于大多数补丁来说并不是必需的。要使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">tox</span></code> 运行 JavaScript 测试：</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>这个命令运行 <code class=\"docutils literal notranslate\"><span class=\"pre\">npm</span> <span class=\"pre\">install</span></code> 以确保测试要求是最新的，然后运行 <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<h3>使用 <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 to this heading</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> 允许您在所有支持的数据库和 Python 版本上运行 Django 的测试套件。有关安装和使用说明，请参阅 <a class=\"reference external\" href=\"https://github.com/django/django-docker-box/\">django-docker-box</a> 项目页面。</p>\n</section>\n<section id=\"using-another-settings-module\">\n<span id=\"running-unit-tests-settings\"></span><h3>使用另一个 <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 to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>包含的设置模块（<code class=\"docutils literal notranslate\"><span class=\"pre\">tests/test_sqlite.py</span></code>）允许您使用 SQLite 运行测试套件。如果要使用不同的数据库运行测试，您需要定义自己的设置文件。一些测试，如 <code class=\"docutils literal notranslate\"><span class=\"pre\">contrib.postgres</span></code> 的测试，是特定于特定数据库后端的，如果使用不同的后端运行，则会被跳过。一些测试在特定的数据库后端上被跳过或预期失败（请查看每个后端上的 <code class=\"docutils literal notranslate\"><span class=\"pre\">DatabaseFeatures.django_test_skips</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">DatabaseFeatures.django_test_expected_failures</span></code>）。</p>\n<p>要使用不同的设置运行测试，请确保该模块位于您的 <span class=\"target\" id=\"index-7\"></span><a class=\"reference external\" href=\"https://docs.python.org/3/using/cmdline.html#envvar-PYTHONPATH\" title=\"(in Python v3.14)\"><code class=\"xref std std-envvar docutils literal notranslate\"><span class=\"pre\">PYTHONPATH</span></code></a> 上，并使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">--settings</span></code> 传递该模块。</p>\n<p>在任何测试设置模块中，<a class=\"reference internal\" href=\"/zh-hans/5.0/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a> 设置需要定义两个数据库：</p>\n<ul class=\"simple\">\n<li><p>一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> 数据库。该数据库应该使用您希望用于主要测试的后端。</p></li>\n<li><p>一个带有别名 <code class=\"docutils literal notranslate\"><span class=\"pre\">other</span></code> 的数据库。<code class=\"docutils literal notranslate\"><span class=\"pre\">other</span></code> 数据库用于测试可以将查询定向到不同的数据库。该数据库应该使用与 <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> 相同的后端，但必须具有不同的名称。</p></li>\n</ul>\n<p>如果您使用的不是SQLite后端，则需要为每个数据库提供其他详细信息：</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/zh-hans/5.0/ref/settings/#std-setting-USER\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USER</span></code></a> 选项需要指定数据库的现有用户帐户。该用户需要有执行 <code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">DATABASE</span></code> 的权限，以便可以创建测试数据库。</p></li>\n<li><p><a class=\"reference internal\" href=\"/zh-hans/5.0/ref/settings/#std-setting-PASSWORD\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">PASSWORD</span></code></a> 配置选项需要为指定的配置 <a class=\"reference internal\" href=\"/zh-hans/5.0/ref/settings/#std-setting-USER\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USER</span></code></a> 提供密码。</p></li>\n</ul>\n<p>测试数据库的名称是通过将 <a class=\"reference internal\" href=\"/zh-hans/5.0/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a> 中定义的数据库的 <a class=\"reference internal\" href=\"/zh-hans/5.0/ref/settings/#std-setting-NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">NAME</span></code></a> 设置的值前面添加 <code class=\"docutils literal notranslate\"><span class=\"pre\">test_</span></code> 来获取的。这些测试数据库在测试完成时被删除。</p>\n<p>您还需要确保您的数据库使用 UTF-8 作为默认字符集。如果您的数据库服务器不使用 UTF-8 作为默认字符集，您需要在适用数据库的测试设置字典中为 <a class=\"reference internal\" href=\"/zh-hans/5.0/ref/settings/#std-setting-TEST_CHARSET\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CHARSET</span></code></a> 包含一个值。</p>\n</section>\n<section id=\"running-only-some-of-the-tests\">\n<span id=\"runtests-specifying-labels\"></span><h3>执行一部分测试<a class=\"heading-anchor\" href=\"#running-only-some-of-the-tests\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django的整个测试套件需要花一些时间才能运行，并且，例如，如果您刚刚向Django添加了一个想要快速运行而不运行其他所有功能的测试，则运行每个测试可能是多余的。您可以通过在命令行上将测试模块的名称附加到 <code class=\"docutils literal notranslate\"><span class=\"pre\">runtests.py</span></code> 上来运行单元测试的子集。</p>\n<p>例如，如果您想仅运行有关通用关系和国际化的测试，请键入：</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>如何找出各个测试的名称？查看 <code class=\"docutils literal notranslate\"><span class=\"pre\">tests/</span></code> - 那里的每个目录名称都是一个测试的名称。</p>\n<p>如果您只想运行特定类别的测试，可以指定一个包含单独测试类路径的列表。例如，要运行 <code class=\"docutils literal notranslate\"><span class=\"pre\">i18n</span></code> 模块的 <code class=\"docutils literal notranslate\"><span class=\"pre\">TranslationTests</span></code>，请输入：</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>更进一步，您可以像这样指定一个单独的测试方法：</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>您可以使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">--start-at</span></code> 选项从指定的顶级模块开始运行测试。例如：</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>您还可以使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">--start-after</span></code> 选项从指定的顶级模块之后开始运行测试。例如：</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>请注意，<code class=\"docutils literal notranslate\"><span class=\"pre\">--reverse</span></code> 选项不影响 <code class=\"docutils literal notranslate\"><span class=\"pre\">--start-at</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">--start-after</span></code> 选项。而且，这些选项不能与测试标签一起使用。</p>\n</section>\n<section id=\"running-the-selenium-tests\">\n<span id=\"running-selenium-tests\"></span><h3>运行 Selenium 测试<a class=\"heading-anchor\" href=\"#running-the-selenium-tests\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>一些测试需要 Selenium 和一个 Web 浏览器。要运行这些测试，您必须安装 <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/selenium/\">selenium</a> 包，并使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">--selenium=&lt;BROWSERS&gt;</span></code> 选项运行测试。例如，如果您安装了 Firefox 和 Google Chrome：</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>查看 <a class=\"reference external\" href=\"https://github.com/SeleniumHQ/selenium/tree/trunk/py/selenium/webdriver\">selenium.webdriver</a> 包，了解可用浏览器的列表。</p>\n<p>指定 <code class=\"docutils literal notranslate\"><span class=\"pre\">--selenium</span></code> 会自动设置 <code class=\"docutils literal notranslate\"><span class=\"pre\">--tags=selenium</span></code>，以仅运行需要 selenium 的测试。</p>\n<p>一些浏览器（例如 Chrome 或 Firefox）支持无头测试，这可以更快速和更稳定。添加 <code class=\"docutils literal notranslate\"><span class=\"pre\">--headless</span></code> 选项以启用此模式。</p>\n</section>\n<section id=\"running-all-the-tests\">\n<span id=\"running-unit-tests-dependencies\"></span><h3>运行所有测试<a class=\"heading-anchor\" href=\"#running-all-the-tests\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>如果要运行全套测试，则需要安装许多依赖项：</p>\n<ul class=\"simple\">\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/aiosmtpd/\">aiosmtpd</a></p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/argon2-cffi/\">argon2-cffi</a> 19.2.0+</p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/asgiref/\">asgiref</a> 3.7.0+（必需）</p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/bcrypt/\">bcrypt</a></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.19+</p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/geoip2/\">geoip2</a></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></p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/Pillow/\">Pillow</a> 6.2.1+</p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/PyYAML/\">PyYAML</a></p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/pytz/\">pytz</a> (必须的)</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> 3.4+</p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/setuptools/\">setuptools</a></p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/python-memcached/\">python-memcached</a>，以及一个 <a class=\"reference external\" href=\"https://memcached.org/\">支持的 Python 绑定</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=\"/zh-hans/5.0/topics/i18n/translation/#gettext-on-windows\"><span class=\"std std-ref\">Windows 上的 gettext</span></a>)</p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/selenium/\">selenium</a> 4.8.0+</p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/sqlparse/\">sqlparse</a> 0.3.1+ (必须的)</p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/tblib/\">tblib</a> 1.5.0+</p></li>\n</ul>\n<p>你可以在 Django 源代码树的 <code class=\"docutils literal notranslate\"><span class=\"pre\">tests/requirements</span></code> 目录中找到这些依赖项的 <a class=\"reference external\" href=\"https://pip.pypa.io/en/latest/user_guide/#requirements-files\">pip requirements 文件</a>，然后像这样安装它们：</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>如果你在安装过程中遇到错误，你的系统可能缺少一个或多个 Python 包的依赖。请查阅失败软件包的文档，或者用你遇到的错误信息在网上搜索。</p>\n<p>你还可以使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">oracle.txt</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">mysql.txt</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">postgres.txt</span></code> 安装你选择的数据库适配器。</p>\n<p>如果要测试 memcached 或 Redis 缓存后端，你还需要定义一个 <a class=\"reference internal\" href=\"/zh-hans/5.0/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> 设置，分别指向你的 memcached 或 Redis 实例。</p>\n<p>要运行 GeoDjango 测试，你需要 <a class=\"reference internal\" href=\"/zh-hans/5.0/ref/contrib/gis/install/\"><span class=\"doc\">设置一个空间数据库并安装地理空间库</span></a>。</p>\n<p>这些依赖项中的每一个都是可选的。 如果您缺少其中的任何一个，则将跳过关联的测试。</p>\n<p>要运行一些自动重新加载测试，你需要安装 <a class=\"reference external\" href=\"https://facebook.github.io/watchman/\">Watchman</a> 服务。</p>\n</section>\n<section id=\"code-coverage\">\n<h3>代码覆盖率<a class=\"heading-anchor\" href=\"#code-coverage\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>鼓励贡献者对测试套件进行覆盖率测试，以确定需要额外测试的区域。在:ref:testing code coverage 1. 中介绍了coverage代码覆盖度工具的安装和使用。</p>\n<p>要使用标准测试设置运行 Django 测试套件的覆盖率：</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>在运行覆盖率后，通过运行以下命令合并所有覆盖率统计数据：</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>然后通过运行以下命令生成 HTML 报告：</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>运行Django测试的覆盖率时，随附的 <code class=\"docutils literal notranslate\"><span class=\"pre\">.coveragerc</span></code> 配置文件将 <code class=\"docutils literal notranslate\"><span class=\"pre\">coverage_html</span></code> 定义为报告的输出目录，并且还排除了与结果无关的几个目录（Django中包含的测试代码或外部代码）。</p>\n</section>\n</section>\n<section id=\"contrib-apps\">\n<span id=\"id1\"></span><h2>Contrib 应用程序<a class=\"heading-anchor\" href=\"#contrib-apps\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>contrib 应用程序的测试可以在 <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/5.0.x/tests/\">tests/</a> 目录中找到，通常位于 <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;app_name&gt;_tests</span></code> 下。例如，<code class=\"docutils literal notranslate\"><span class=\"pre\">contrib.auth</span></code> 的测试位于 <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/5.0.x/tests/auth_tests\">tests/auth_tests</a> 中。</p>\n</section>\n<section id=\"troubleshooting\">\n<span id=\"troubleshooting-unit-tests\"></span><h2>错误调试<a class=\"heading-anchor\" href=\"#troubleshooting\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"test-suite-hangs-or-shows-failures-on-main-branch\">\n<h3>测试套件在 <code class=\"docutils literal notranslate\"><span class=\"pre\">main</span></code> 分支上出现挂起或失败。<a class=\"heading-anchor\" href=\"#test-suite-hangs-or-shows-failures-on-main-branch\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>确保你使用的是一个 <a class=\"reference internal\" href=\"/zh-hans/5.0/faq/install/#faq-python-version-support\"><span class=\"std std-ref\">支持的 Python 版本</span></a> 的最新点发布版，因为早期版本中通常会有可能导致测试套件失败或挂起的错误。</p>\n<p>在 <strong>macOS</strong> （High Sierra 和更新的版本）上，你可能会看到这个消息被记录下来，之后测试会挂起：</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>为了避免这个问题，设置一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">OBJC_DISABLE_INITIALIZE_FORK_SAFETY</span></code> 环境变量，例如：</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>或者将 <code class=\"docutils literal notranslate\"><span class=\"pre\">export</span> <span class=\"pre\">OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES</span></code> 添加到你的 shell 启动文件（例如 <code class=\"docutils literal notranslate\"><span class=\"pre\">~/.profile</span></code>）。</p>\n</section>\n<section id=\"many-test-failures-with-unicodeencodeerror\">\n<h3>许多测试失败，出现了 <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 to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>如果未安装 <code class=\"docutils literal notranslate\"><span class=\"pre\">locales</span></code> 包，一些测试将会因为 <code class=\"docutils literal notranslate\"><span class=\"pre\">UnicodeEncodeError</span></code> 而失败。</p>\n<p>你可以在基于 Debian 的系统上解决这个问题，例如，通过运行以下命令：</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>你可以在 macOS 系统上通过配置你的 shell 的 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>运行 <code class=\"docutils literal notranslate\"><span class=\"pre\">locale</span></code> 命令来确认更改。如果需要，可以将这些导出命令添加到你的 shell 启动文件（例如，对于 Bash，是 <code class=\"docutils literal notranslate\"><span class=\"pre\">~/.bashrc</span></code>）中，以避免需要重新输入它们。</p>\n</section>\n<section id=\"tests-that-only-fail-in-combination\">\n<h3>仅在特定组合条件下失败的测试。<a class=\"heading-anchor\" href=\"#tests-that-only-fail-in-combination\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>如果一个测试在单独运行时通过，但在整个测试套件中失败，我们有一些工具可以帮助分析问题。</p>\n<p>使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">runtests.py</span></code> 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">--bisect</span></code> 选项将在每次迭代中运行失败的测试，同时减半运行的测试集合，通常可以帮助识别与失败相关的少量测试。</p>\n<p>例如，假设单独运行正常的失败测试是 <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelTest.test_eq</span></code>，然后使用以下命令：</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>将尝试确定与给定测试干扰的测试。首先，将使用测试套件的前半部分运行该测试。如果出现失败，将测试套件的前半部分分成两组，然后每组都将与指定的测试一起运行。如果在测试套件的前半部分没有失败，将使用指定的测试运行测试套件的后半部分，并根据前述方式进行适当的分割。该过程将重复，直到最小化失败测试的集合。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">--pair</span></code> 选项会将给定的测试与测试套件中的每个其他测试一起运行，让你检查是否有其他测试产生了导致失败的副作用。因此：</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>将使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">test_eq</span></code> 与每个测试标签配对。</p>\n<p>使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">--bisect</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">--pair</span></code>，如果你已经怀疑哪些情况可能导致失败，你可以在第一个标签之后通过 <a class=\"reference internal\" href=\"#runtests-specifying-labels\"><span class=\"std std-ref\">指定更多的测试标签</span></a> 来限制进行交叉分析的测试。</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>你还可以尝试使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">--shuffle</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">--reverse</span></code> 选项以随机或反向顺序运行任何一组测试。这有助于验证以不同的顺序执行测试是否会导致任何问题：</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>查看测试期间运行的 SQL 查询。<a class=\"heading-anchor\" href=\"#seeing-the-sql-queries-run-during-a-test\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>如果你希望查看失败测试中运行的 SQL，你可以使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">--debug-sql</span></code> 选项打开 <a class=\"reference internal\" href=\"/zh-hans/5.0/ref/logging/#django-db-logger\"><span class=\"std std-ref\">SQL 日志记录</span></a>。如果将其与 <code class=\"docutils literal notranslate\"><span class=\"pre\">--verbosity=2</span></code> 结合使用，将输出所有的 SQL 查询：</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>查看测试失败的完整回溯信息。<a class=\"heading-anchor\" href=\"#seeing-the-full-traceback-of-a-test-failure\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>默认情况下，测试会并行运行，每个核心一个进程。然而，在并行运行测试时，对于任何测试失败，你只会看到一个截断的回溯信息。你可以使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">--parallel</span></code> 选项来调整这个行为：</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>你还可以使用 <span class=\"target\" id=\"index-8\"></span><a class=\"reference internal\" href=\"/zh-hans/5.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> 环境变量来实现这个目的。</p>\n</section>\n</section>\n<section id=\"tips-for-writing-tests\">\n<h2>编写测试的一些建议<a class=\"heading-anchor\" href=\"#tips-for-writing-tests\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"isolating-model-registration\">\n<h3>隔离模型注册<a class=\"heading-anchor\" href=\"#isolating-model-registration\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>为了避免污染全局的 :attr:`~django.apps.apps 注册表并防止不必要的表创建，测试方法中定义的模型应该与临时的 <code class=\"docutils literal notranslate\"><span class=\"pre\">Apps</span></code> 实例绑定。要做到这一点，可以使用 <a class=\"reference internal\" href=\"/zh-hans/5.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> 装饰器：</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\">设置 <code class=\"docutils literal notranslate\"><span class=\"pre\">app_label</span></code></p>\n<p>在测试方法中定义的模型，如果没有显式设置 <a class=\"reference internal\" href=\"/zh-hans/5.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>，将自动分配给其所在测试类所在的应用程序的标签。</p>\n<p>为了确保在 <a class=\"reference internal\" href=\"/zh-hans/5.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> 实例的上下文中定义的模型被正确安装，你应该将目标的 <code class=\"docutils literal notranslate\"><span class=\"pre\">app_label</span></code> 集合作为参数传递：</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":"运行单元测试","anchor":"running-the-unit-tests","children":[{"title":"快速上手","anchor":"quickstart","children":[]},{"title":"使用 tox 运行测试","anchor":"running-tests-using-tox","children":[{"title":"测试其他 Python 版本和数据库后端","anchor":"testing-other-python-versions-and-database-backends","children":[]},{"title":"运行 JavaScript 测试集","anchor":"running-the-javascript-tests","children":[]}]},{"title":"使用 django-docker-box 运行测试","anchor":"running-tests-using-django-docker-box","children":[]},{"title":"使用另一个 settings 配置模块","anchor":"using-another-settings-module","children":[]},{"title":"执行一部分测试","anchor":"running-only-some-of-the-tests","children":[]},{"title":"运行 Selenium 测试","anchor":"running-the-selenium-tests","children":[]},{"title":"运行所有测试","anchor":"running-all-the-tests","children":[]},{"title":"代码覆盖率","anchor":"code-coverage","children":[]}]},{"title":"Contrib 应用程序","anchor":"contrib-apps","children":[]},{"title":"错误调试","anchor":"troubleshooting","children":[{"title":"测试套件在 main 分支上出现挂起或失败。","anchor":"test-suite-hangs-or-shows-failures-on-main-branch","children":[]},{"title":"许多测试失败，出现了 UnicodeEncodeError。","anchor":"many-test-failures-with-unicodeencodeerror","children":[]},{"title":"仅在特定组合条件下失败的测试。","anchor":"tests-that-only-fail-in-combination","children":[]},{"title":"查看测试期间运行的 SQL 查询。","anchor":"seeing-the-sql-queries-run-during-a-test","children":[]},{"title":"查看测试失败的完整回溯信息。","anchor":"seeing-the-full-traceback-of-a-test-failure","children":[]}]},{"title":"编写测试的一些建议","anchor":"tips-for-writing-tests","children":[{"title":"隔离模型注册","anchor":"isolating-model-registration","children":[]}]}],"breadcrumbs":[{"docname":"internals/index","title":"Django内部","url":"/zh-hans/5.0/internals/"},{"docname":"internals/contributing/index","title":"为 Django 做贡献","url":"/zh-hans/5.0/internals/contributing/"},{"docname":"internals/contributing/writing-code/index","title":"编写代码","url":"/zh-hans/5.0/internals/contributing/writing-code/"}],"prev":{"docname":"internals/contributing/writing-code/coding-style","title":"编码风格","url":"/zh-hans/5.0/internals/contributing/writing-code/coding-style/"},"next":{"docname":"internals/contributing/writing-code/submitting-patches","title":"提交补丁","url":"/zh-hans/5.0/internals/contributing/writing-code/submitting-patches/"},"formats":{"html":"/zh-hans/5.0/internals/contributing/writing-code/unit-tests/","markdown":"/zh-hans/5.0/internals/contributing/writing-code/unit-tests.md","json":"/zh-hans/5.0/internals/contributing/writing-code/unit-tests.json"},"source":"https://github.com/django/django/blob/stable/5.0.x/docs/internals/contributing/writing-code/unit-tests.txt","official":"https://docs.djangoproject.com/zh-hans/5.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"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}