{"title":"テストに関する高度なトピック","version":"6.0","locale":"ja","docname":"topics/testing/advanced","url":"/ja/6.0/topics/testing/advanced/","canonical":"https://djangodocs.dev/ja/6.0/topics/testing/advanced/","summary":"RequestFactory（リクエスト ファクトリ） Link to this heading # class RequestFactory Link to this definition # RequestFactory はテストクライアントと同じ API を共有しています。しかし、ブラウザのように動作するのではなく、…","html":"<h1>テストに関する高度なトピック<a class=\"heading-anchor\" href=\"#advanced-testing-topics\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<section id=\"the-request-factory\">\n<h2>RequestFactory（リクエスト ファクトリ）<a class=\"heading-anchor\" href=\"#the-request-factory\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.test.RequestFactory\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">RequestFactory</span></span><a class=\"heading-anchor\" href=\"#django.test.RequestFactory\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><a class=\"reference internal\" href=\"#django.test.RequestFactory\" title=\"django.test.RequestFactory\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RequestFactory</span></code></a> はテストクライアントと同じ API を共有しています。しかし、ブラウザのように動作するのではなく、 RequestFactory は任意のビューの最初の引数として使用できるリクエストインスタンスを生成する方法を提供します。つまり、ビュー関数を他の関数をテストするのと同じ方法で テストできます。入力が完全にわかっているブラックボックスとして、特定の出力をテストできます。</p>\n<p><a class=\"reference internal\" href=\"#django.test.RequestFactory\" title=\"django.test.RequestFactory\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RequestFactory</span></code></a> の API は、テストクライアント API の少し制限されたサブセットです:</p>\n<ul class=\"simple\">\n<li><p>It only has access to the HTTP methods <a class=\"reference internal\" href=\"/ja/6.0/topics/testing/tools/#django.test.Client.get\" title=\"django.test.Client.get\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get()</span></code></a>,\n<a class=\"reference internal\" href=\"/ja/6.0/topics/testing/tools/#django.test.Client.post\" title=\"django.test.Client.post\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">post()</span></code></a>, <a class=\"reference internal\" href=\"/ja/6.0/topics/testing/tools/#django.test.Client.put\" title=\"django.test.Client.put\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">put()</span></code></a>,\n<a class=\"reference internal\" href=\"/ja/6.0/topics/testing/tools/#django.test.Client.delete\" title=\"django.test.Client.delete\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">delete()</span></code></a>, <a class=\"reference internal\" href=\"/ja/6.0/topics/testing/tools/#django.test.Client.head\" title=\"django.test.Client.head\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">head()</span></code></a>,\n<a class=\"reference internal\" href=\"/ja/6.0/topics/testing/tools/#django.test.Client.options\" title=\"django.test.Client.options\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">options()</span></code></a>, and <a class=\"reference internal\" href=\"/ja/6.0/topics/testing/tools/#django.test.Client.trace\" title=\"django.test.Client.trace\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">trace()</span></code></a>.</p></li>\n<li><p>これらのメソッドは <code class=\"docutils literal notranslate\"><span class=\"pre\">follow</span></code> <em>以外</em> はすべて同じ引数を受け取ります。これはリクエストを生成するための単なるファクトリ（工場）なので、 レスポンスの処理はあなた次第です。</p></li>\n<li><p>ミドルウェアはサポートしていません。セッション属性と認証属性は、ビューが正しく機能するために必要であれば、テスト自身が持たなければなりません。</p></li>\n</ul>\n<section id=\"example\">\n<h3>カスタマイズ例<a class=\"heading-anchor\" href=\"#example\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>以下はリクエスト・ファクトリを使ったユニットテストです:</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.contrib.auth.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">AnonymousUser</span><span class=\"p\">,</span> <span class=\"n\">User</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\">RequestFactory</span><span class=\"p\">,</span> <span class=\"n\">TestCase</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.views</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">MyView</span><span class=\"p\">,</span> <span class=\"n\">my_view</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">SimpleTest</span><span class=\"p\">(</span><span class=\"n\">TestCase</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">setUp</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Every test needs access to the request factory.</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">factory</span> <span class=\"o\">=</span> <span class=\"n\">RequestFactory</span><span class=\"p\">()</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">user</span> <span class=\"o\">=</span> <span class=\"n\">User</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create_user</span><span class=\"p\">(</span>\n            <span class=\"n\">username</span><span class=\"o\">=</span><span class=\"s2\">&quot;jacob&quot;</span><span class=\"p\">,</span> <span class=\"n\">email</span><span class=\"o\">=</span><span class=\"s2\">&quot;jacob@…&quot;</span><span class=\"p\">,</span> <span class=\"n\">password</span><span class=\"o\">=</span><span class=\"s2\">&quot;top_secret&quot;</span>\n        <span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_details</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Create an instance of a GET request.</span>\n        <span class=\"n\">request</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">factory</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;/customer/details&quot;</span><span class=\"p\">)</span>\n\n        <span class=\"c1\"># Recall that middleware are not supported. You can simulate a</span>\n        <span class=\"c1\"># logged-in user by setting request.user manually.</span>\n        <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">user</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">user</span>\n\n        <span class=\"c1\"># Or you can simulate an anonymous user by setting request.user to</span>\n        <span class=\"c1\"># an AnonymousUser instance.</span>\n        <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">user</span> <span class=\"o\">=</span> <span class=\"n\">AnonymousUser</span><span class=\"p\">()</span>\n\n        <span class=\"c1\"># Test my_view() as if it were deployed at /customer/details</span>\n        <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"n\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">)</span>\n        <span class=\"c1\"># Use this syntax for class-based views.</span>\n        <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"n\">MyView</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">()(</span><span class=\"n\">request</span><span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assertEqual</span><span class=\"p\">(</span><span class=\"n\">response</span><span class=\"o\">.</span><span class=\"n\">status_code</span><span class=\"p\">,</span> <span class=\"mi\">200</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"asyncrequestfactory\">\n<h3>AsyncRequestFactory<a class=\"heading-anchor\" href=\"#asyncrequestfactory\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.test.AsyncRequestFactory\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">AsyncRequestFactory</span></span><a class=\"heading-anchor\" href=\"#django.test.AsyncRequestFactory\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">RequestFactory</span></code> は WSGI ライクなリクエストを作成します。正しい ASGI <code class=\"docutils literal notranslate\"><span class=\"pre\">scope</span></code> を持つなど、ASGI ライクなリクエストを作成したい場合は、代わりに <code class=\"docutils literal notranslate\"><span class=\"pre\">django.test.AsyncRequestFactory</span></code> が使用できます。</p>\n<p>このクラスは <code class=\"docutils literal notranslate\"><span class=\"pre\">RequestFactory</span></code> と直接 API 互換ですが、唯一の違いは <code class=\"docutils literal notranslate\"><span class=\"pre\">WSGIRequest</span></code> インスタンスではなく <code class=\"docutils literal notranslate\"><span class=\"pre\">ASGIRequest</span></code> インスタンスを返すことです。そのメソッドはすべて同期呼び出し可能オブジェクトのままです。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">defaults</span></code> 内の任意のキーワード引数は直接ASGIスコープに追加されます。</p>\n</section>\n</section>\n<section id=\"testing-class-based-views\">\n<h2>クラスベースのビューをテストする<a class=\"heading-anchor\" href=\"#testing-class-based-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>リクエスト/レスポンスサイクルの外でクラスベースのビューをテストするには、インスタンス化後に <a class=\"reference internal\" href=\"/ja/6.0/ref/class-based-views/base/#django.views.generic.base.View.setup\" title=\"django.views.generic.base.View.setup\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">setup()</span></code></a> を呼び出して、正しく設定されていることを確認する必要があります。</p>\n<p>たとえば、以下のようなクラスベースのビューを想定します:</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\">views.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.views.generic</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">TemplateView</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">HomeView</span><span class=\"p\">(</span><span class=\"n\">TemplateView</span><span class=\"p\">):</span>\n    <span class=\"n\">template_name</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;myapp/home.html&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_context_data</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s2\">&quot;environment&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;Production&quot;</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">get_context_data</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">get_context_data()</span></code> メソッドを直接テストするには、まずビューをインスタンス化して <code class=\"docutils literal notranslate\"><span class=\"pre\">setup()</span></code> に <code class=\"docutils literal notranslate\"><span class=\"pre\">request</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.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.test</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">RequestFactory</span><span class=\"p\">,</span> <span class=\"n\">TestCase</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.views</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HomeView</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">HomePageTest</span><span class=\"p\">(</span><span class=\"n\">TestCase</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_environment_set_in_context</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">request</span> <span class=\"o\">=</span> <span class=\"n\">RequestFactory</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;/&quot;</span><span class=\"p\">)</span>\n        <span class=\"n\">view</span> <span class=\"o\">=</span> <span class=\"n\">HomeView</span><span class=\"p\">()</span>\n        <span class=\"n\">view</span><span class=\"o\">.</span><span class=\"n\">setup</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">)</span>\n\n        <span class=\"n\">context</span> <span class=\"o\">=</span> <span class=\"n\">view</span><span class=\"o\">.</span><span class=\"n\">get_context_data</span><span class=\"p\">()</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assertIn</span><span class=\"p\">(</span><span class=\"s2\">&quot;environment&quot;</span><span class=\"p\">,</span> <span class=\"n\">context</span><span class=\"p\">)</span>\n</code></pre></figure>\n</section>\n<section id=\"tests-and-multiple-host-names\">\n<span id=\"topics-testing-advanced-multiple-hosts\"></span><h2>テストとマルチホスト名<a class=\"heading-anchor\" href=\"#tests-and-multiple-host-names\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-ALLOWED_HOSTS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">ALLOWED_HOSTS</span></code></a> 設定はテストを実行する際に検証されます。これによりテストクライアントが内部 URL と外部 URL を区別できるようになります。</p>\n<p>マルチテナントをサポートするプロジェクトや、リクエストのホストに基づいてビジネスロジックを変更するプロジェクトで、カスタムホスト名をテストで使用する場合は、それらのホストを <a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-ALLOWED_HOSTS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">ALLOWED_HOSTS</span></code></a> に含める必要があります。</p>\n<p>そのための最初の選択肢は、hosts を設定ファイルに追加することです。例えば、docs.djangoproject.com のテストスイートには以下が含まれています:</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</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">TestCase</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">SearchFormTestCase</span><span class=\"p\">(</span><span class=\"n\">TestCase</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_empty_get</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">client</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span>\n            <span class=\"s2\">&quot;/en/dev/search/&quot;</span><span class=\"p\">,</span>\n            <span class=\"n\">headers</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;host&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;docs.djangoproject.dev:8000&quot;</span><span class=\"p\">},</span>\n        <span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assertEqual</span><span class=\"p\">(</span><span class=\"n\">response</span><span class=\"o\">.</span><span class=\"n\">status_code</span><span class=\"p\">,</span> <span class=\"mi\">200</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>そして設定ファイルには、プロジェクトがサポートするドメインのリストが含まれています:</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=\"n\">ALLOWED_HOSTS</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;www.djangoproject.dev&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;docs.djangoproject.dev&quot;</span><span class=\"p\">,</span> <span class=\"o\">...</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>Another option is to add the required hosts to <a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-ALLOWED_HOSTS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">ALLOWED_HOSTS</span></code></a> using\n<a class=\"reference internal\" href=\"/ja/6.0/topics/testing/tools/#django.test.override_settings\" title=\"django.test.override_settings\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">override_settings()</span></code></a> or\n<a class=\"reference internal\" href=\"/ja/6.0/topics/testing/tools/#django.test.SimpleTestCase.modify_settings\" title=\"django.test.SimpleTestCase.modify_settings\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">modify_settings</span></code></a>. This option may be\npreferable in standalone apps that can't package their own settings file or\nfor projects where the list of domains is not static (e.g., subdomains for\nmultitenancy). For example, you could write a test for the domain\n<code class=\"docutils literal notranslate\"><span class=\"pre\">http://otherserver/</span></code> as follows:</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</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">TestCase</span><span class=\"p\">,</span> <span class=\"n\">override_settings</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MultiDomainTestCase</span><span class=\"p\">(</span><span class=\"n\">TestCase</span><span class=\"p\">):</span>\n    <span class=\"nd\">@override_settings</span><span class=\"p\">(</span><span class=\"n\">ALLOWED_HOSTS</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;otherserver&quot;</span><span class=\"p\">])</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_other_domain</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">client</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;http://otherserver/foo/bar/&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>テストの実行時に <a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-ALLOWED_HOSTS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">ALLOWED_HOSTS</span></code></a> チェック (<code class=\"docutils literal notranslate\"><span class=\"pre\">ALLOWED_HOSTS</span> <span class=\"pre\">=</span> <span class=\"pre\">['*']</span></code>) を無効にすると、外部 URL へのリダイレクトを辿ったときにテストクライアントが役立つエラーメッセージを表示しないようになります。</p>\n</section>\n<section id=\"tests-and-multiple-databases\">\n<span id=\"topics-testing-advanced-multidb\"></span><h2>テストと複数データベース<a class=\"heading-anchor\" href=\"#tests-and-multiple-databases\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"testing-primary-replica-configurations\">\n<span id=\"topics-testing-primaryreplica\"></span><h3>プライマリ/レプリカ構成のテスト<a class=\"heading-anchor\" href=\"#testing-primary-replica-configurations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>プライマリ/レプリカ（データベースによってはマスタ/スレーブとも呼ばれる）レプリケーションを使用した複数データベース構成をテストする場合、テスト用データベースを作成するこの方法には問題があります。テスト用データベースを作成すると、レプリケーションが行われなくなり、その結果、プライマリで作成されたデータがレプリカで見られなくなります。</p>\n<p>これを補うために、 Django ではデータベースを <em>テストミラー</em> と定義できます。以下の (単純化した) データベース設定例を見てください:</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=\"n\">DATABASES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;ENGINE&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.db.backends.mysql&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;NAME&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;myproject&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;HOST&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;dbprimary&quot;</span><span class=\"p\">,</span>\n        <span class=\"c1\"># ... plus some other settings</span>\n    <span class=\"p\">},</span>\n    <span class=\"s2\">&quot;replica&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;ENGINE&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.db.backends.mysql&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;NAME&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;myproject&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;HOST&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;dbreplica&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;TEST&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;MIRROR&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n        <span class=\"c1\"># ... plus some other settings</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>この設定では、2つのデータベースサーバーがあります。 <code class=\"docutils literal notranslate\"><span class=\"pre\">dbprimary</span></code> はデータベースのエイリアス <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> で、 <code class=\"docutils literal notranslate\"><span class=\"pre\">dbreplica</span></code> はエイリアス <code class=\"docutils literal notranslate\"><span class=\"pre\">replica</span></code> で表します。期待の通り、 <code class=\"docutils literal notranslate\"><span class=\"pre\">dbreplica</span></code> はデータベース管理者によって <code class=\"docutils literal notranslate\"><span class=\"pre\">dbprimary</span></code> の読み込み用レプリカとして設定されているので、通常の操作では <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> への書き込みは <code class=\"docutils literal notranslate\"><span class=\"pre\">replica</span></code> に反映されます。</p>\n<p>Django で2つの独立したテスト用データベースを作成した場合、レプリケーションを期待したテストが壊れてしまいます。しかし、 <code class=\"docutils literal notranslate\"><span class=\"pre\">replica</span></code> データベースはテスト用ミラーとして設定されており (テスト設定 <a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-TEST_MIRROR\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIRROR</span></code></a> を使っています)、テストでは <code class=\"docutils literal notranslate\"><span class=\"pre\">replica</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> のミラーとして扱われるはずです。</p>\n<p>テスト環境が設定されると、テストバージョンの <code class=\"docutils literal notranslate\"><span class=\"pre\">replica</span></code> は作成されません。代わりに <code class=\"docutils literal notranslate\"><span class=\"pre\">replica</span></code> への接続は <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> を指すようにリダイレクトされます。その結果、<code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> への書き込みは <code class=\"docutils literal notranslate\"><span class=\"pre\">replica</span></code> に表示されますが、これは実際には同じデータベースであることが原因であり、2つのデータベース間でデータの複製が行われていることが原因ではありません。これはトランザクションに依存しているので、テストでは <a class=\"reference internal\" href=\"/ja/6.0/topics/testing/tools/#django.test.TestCase\" title=\"django.test.TestCase\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TestCase</span></code></a> ではなく <a class=\"reference internal\" href=\"/ja/6.0/topics/testing/tools/#django.test.TransactionTestCase\" title=\"django.test.TransactionTestCase\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TransactionTestCase</span></code></a> を使う必要があります。</p>\n</section>\n<section id=\"controlling-creation-order-for-test-databases\">\n<span id=\"topics-testing-creation-dependencies\"></span><h3>テストデータベースの作成順をコントロールする<a class=\"heading-anchor\" href=\"#controlling-creation-order-for-test-databases\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>デフォルトでは、 Django は全てのデータベースが <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> データベースに依存しているとみなすので、常に <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> データベースを最初に作成します。しかし、テストセットアップの他のデータベースの作成順は保証されません。</p>\n<p>データベース構成が特定の作成順序を必要とする場合、<a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-TEST_DEPENDENCIES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEPENDENCIES</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=\"n\">DATABASES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"c1\"># ... db settings</span>\n        <span class=\"s2\">&quot;TEST&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;DEPENDENCIES&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;diamonds&quot;</span><span class=\"p\">],</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n    <span class=\"s2\">&quot;diamonds&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"c1\"># ... db settings</span>\n        <span class=\"s2\">&quot;TEST&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;DEPENDENCIES&quot;</span><span class=\"p\">:</span> <span class=\"p\">[],</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n    <span class=\"s2\">&quot;clubs&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"c1\"># ... db settings</span>\n        <span class=\"s2\">&quot;TEST&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;DEPENDENCIES&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;diamonds&quot;</span><span class=\"p\">],</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n    <span class=\"s2\">&quot;spades&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"c1\"># ... db settings</span>\n        <span class=\"s2\">&quot;TEST&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;DEPENDENCIES&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;diamonds&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;hearts&quot;</span><span class=\"p\">],</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n    <span class=\"s2\">&quot;hearts&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"c1\"># ... db settings</span>\n        <span class=\"s2\">&quot;TEST&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;DEPENDENCIES&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;diamonds&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;clubs&quot;</span><span class=\"p\">],</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>この設定では、依存関係のない唯一のエイリアスである <code class=\"docutils literal notranslate\"><span class=\"pre\">diamonds</span></code> データベースが最初に作成されます。次に <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">clubs</span></code> のエイリアスが作成され（このペアの作成順序は保証されていません）、次に <code class=\"docutils literal notranslate\"><span class=\"pre\">hearts</span></code> が作成され、最後に <code class=\"docutils literal notranslate\"><span class=\"pre\">spades</span></code> が作成されます。</p>\n<p><a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-TEST_DEPENDENCIES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEPENDENCIES</span></code></a> の定義に循環依存がある場合、 <a class=\"reference internal\" href=\"/ja/6.0/ref/exceptions/#django.core.exceptions.ImproperlyConfigured\" title=\"django.core.exceptions.ImproperlyConfigured\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">ImproperlyConfigured</span></code></a> 例外が発生します。</p>\n</section>\n</section>\n<section id=\"advanced-features-of-transactiontestcase\">\n<h2><code class=\"docutils literal notranslate\"><span class=\"pre\">TransactionTestCase</span></code> の高度な機能<a class=\"heading-anchor\" href=\"#advanced-features-of-transactiontestcase\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.test.TransactionTestCase.available_apps\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">TransactionTestCase.</span></span><span class=\"sig-name descname\"><span class=\"pre\">available_apps</span></span><a class=\"heading-anchor\" href=\"#django.test.TransactionTestCase.available_apps\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p>この属性はプライベートAPIです。例えば、アプリケーションの読み込みの変更に対応するために、将来、非推奨期間なしに変更または削除される可能性があります。</p>\n<p>これは Django 自身のテストスイートを最適化するために使われます。このテストスイート には何百ものモデルが含まれますが、異なるアプリケーションのモデル間のリレーションはありません。</p>\n</aside>\n<p>デフォルトでは、<code class=\"docutils literal notranslate\"><span class=\"pre\">available_apps</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> に設定されています。各テスト後、Django は <a class=\"reference internal\" href=\"/ja/6.0/ref/django-admin/#django-admin-flush\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">flush</span></code></a> を呼び出して、データベースの状態をリセットします。これにより、すべてのテーブルが空になります。そして、<a class=\"reference internal\" href=\"/ja/6.0/ref/signals/#django.db.models.signals.post_migrate\" title=\"django.db.models.signals.post_migrate\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">post_migrate</span></code></a> シグナルが送信されることにより、各モデルごとに、1つのコンテンツタイプと4つのパーミッションが再生成されます。この操作にかかるコストは、モデル数に比例して増大します。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">available_apps</span></code> にアプリケーションのリストを指定すると、 Django はこれらのアプリケーションのモデルだけが利用可能であるかのように動作します。 <code class=\"docutils literal notranslate\"><span class=\"pre\">TransactionTestCase</span></code> の動作は以下のように変わります:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/ja/6.0/ref/signals/#django.db.models.signals.post_migrate\" title=\"django.db.models.signals.post_migrate\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">post_migrate</span></code></a> は、利用可能なアプリケーションの各モデルに対して、存在しない場合にコンテンツタイプやアクセス権を作成するために、各テストの前に起動します。</p></li>\n<li><p>各テストの後、 Django は利用可能なアプリのモデルに対応するテーブルだけを空にします。しかし、データベースレベルでは、切り捨て（truncation）が利用できないアプリのリレーション先モデルにカスケードするかもしれません。さらに、 <a class=\"reference internal\" href=\"/ja/6.0/ref/signals/#django.db.models.signals.post_migrate\" title=\"django.db.models.signals.post_migrate\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">post_migrate</span></code></a> は起動されません。正しいアプリケーションのセットが選択された後、次の <code class=\"docutils literal notranslate\"><span class=\"pre\">TransactionTestCase</span></code> で起動されます。</p></li>\n</ul>\n<p>データベースは完全には flush されないので、テストが <code class=\"docutils literal notranslate\"><span class=\"pre\">available_apps</span></code> に含まれていないモデルのインスタンスを作成すると、そのインスタンスが漏れて無関係なテストが失敗する可能性があります。セッションを使用するテストには注意してください。デフォルトのセッションエンジンはセッションをデータベースに保存します。</p>\n<p>データベースをフラッシュした後には <a class=\"reference internal\" href=\"/ja/6.0/ref/signals/#django.db.models.signals.post_migrate\" title=\"django.db.models.signals.post_migrate\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">post_migrate</span></code></a> が発行されないため、<code class=\"docutils literal notranslate\"><span class=\"pre\">TransactionTestCase</span></code> の後の状態は <code class=\"docutils literal notranslate\"><span class=\"pre\">TestCase</span></code> の後の状態と同じではありません。つまり、<a class=\"reference internal\" href=\"/ja/6.0/ref/signals/#django.db.models.signals.post_migrate\" title=\"django.db.models.signals.post_migrate\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">post_migrate</span></code></a> のリスナーによって作成された行が欠落しています。テストの実行順序に関する <a class=\"reference internal\" href=\"/ja/6.0/topics/testing/overview/#order-of-tests\"><span class=\"std std-ref\">注意事項</span></a> を踏まえると、与えられたテストスイート内のすべての <code class=\"docutils literal notranslate\"><span class=\"pre\">TransactionTestCase</span></code> が <code class=\"docutils literal notranslate\"><span class=\"pre\">available_apps</span></code> を宣言しているか、または一つも宣言していない場合、これは問題ではありません。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">available_apps</span></code> は Django 自身のテストスイートでは必須です。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.test.TransactionTestCase.reset_sequences\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">TransactionTestCase.</span></span><span class=\"sig-name descname\"><span class=\"pre\">reset_sequences</span></span><a class=\"heading-anchor\" href=\"#django.test.TransactionTestCase.reset_sequences\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\"><span class=\"pre\">TransactionTestCase</span></code> で <code class=\"docutils literal notranslate\"><span class=\"pre\">reset_sequences</span> <span class=\"pre\">=</span> <span class=\"pre\">True</span></code> を設定すると、テスト実行前にシーケンスが常にリセットされます:</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=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">TestsThatDependsOnPrimaryKeySequences</span><span class=\"p\">(</span><span class=\"n\">TransactionTestCase</span><span class=\"p\">):</span>\n    <span class=\"n\">reset_sequences</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_animal_pk</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">lion</span> <span class=\"o\">=</span> <span class=\"n\">Animal</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;lion&quot;</span><span class=\"p\">,</span> <span class=\"n\">sound</span><span class=\"o\">=</span><span class=\"s2\">&quot;roar&quot;</span><span class=\"p\">)</span>\n        <span class=\"c1\"># lion.pk is guaranteed to always be 1</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assertEqual</span><span class=\"p\">(</span><span class=\"n\">lion</span><span class=\"o\">.</span><span class=\"n\">pk</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Unless you are explicitly testing primary keys sequence numbers, it is\nrecommended that you do not hardcode primary key values in tests.</p>\n<p>主キーのリセットは比較的高コストなデータベース操作なので、 <code class=\"docutils literal notranslate\"><span class=\"pre\">reset_sequences</span> <span class=\"pre\">=</span> <span class=\"pre\">True</span></code> を使用するとテストが遅くなります。</p>\n</dd></dl>\n\n</section>\n<section id=\"enforce-running-test-classes-sequentially\">\n<span id=\"topics-testing-enforce-run-sequentially\"></span><h2>テストクラスを強制的に逐次実行する<a class=\"heading-anchor\" href=\"#enforce-running-test-classes-sequentially\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>並列に実行できないテストクラスがある場合 (共通のリソースを共有している場合など)、 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.test.testcases.SerializeMixin</span></code> を使って逐次実行できます。このミックスインはファイルシステムの <code class=\"docutils literal notranslate\"><span class=\"pre\">lockfile</span></code> を使用します。</p>\n<p>たとえば、 <code class=\"docutils literal notranslate\"><span class=\"pre\">__file__</span></code> を使用すると、同じファイルにある <code class=\"docutils literal notranslate\"><span class=\"pre\">SerializeMixin</span></code> を継承したすべてのテストクラスが順番に実行されるようにすることができます:</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\">import</span><span class=\"w\"> </span><span class=\"nn\">os</span>\n\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\">TestCase</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.test.testcases</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">SerializeMixin</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ImageTestCaseMixin</span><span class=\"p\">(</span><span class=\"n\">SerializeMixin</span><span class=\"p\">):</span>\n    <span class=\"n\">lockfile</span> <span class=\"o\">=</span> <span class=\"vm\">__file__</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">setUp</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\">filename</span> <span class=\"o\">=</span> <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">temp_storage_dir</span><span class=\"p\">,</span> <span class=\"s2\">&quot;my_file.png&quot;</span><span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">file</span> <span class=\"o\">=</span> <span class=\"n\">create_file</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">filename</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">RemoveImageTests</span><span class=\"p\">(</span><span class=\"n\">ImageTestCaseMixin</span><span class=\"p\">,</span> <span class=\"n\">TestCase</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_remove_image</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">remove</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">filename</span><span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assertFalse</span><span class=\"p\">(</span><span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">exists</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">filename</span><span class=\"p\">))</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ResizeImageTests</span><span class=\"p\">(</span><span class=\"n\">ImageTestCaseMixin</span><span class=\"p\">,</span> <span class=\"n\">TestCase</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_resize_image</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">resize_image</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">file</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"mi\">48</span><span class=\"p\">,</span> <span class=\"mi\">48</span><span class=\"p\">))</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assertEqual</span><span class=\"p\">(</span><span class=\"n\">get_image_size</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">file</span><span class=\"p\">),</span> <span class=\"p\">(</span><span class=\"mi\">48</span><span class=\"p\">,</span> <span class=\"mi\">48</span><span class=\"p\">))</span>\n</code></pre></div>\n</section>\n<section id=\"using-the-django-test-runner-to-test-reusable-applications\">\n<span id=\"testing-reusable-applications\"></span><h2>Django テストランナーを使って再利用可能なアプリケーションをテストする<a class=\"heading-anchor\" href=\"#using-the-django-test-runner-to-test-reusable-applications\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><a class=\"reference internal\" href=\"/ja/6.0/intro/reusable-apps/\"><span class=\"doc\">再利用可能なアプリケーション</span></a> を書いているのなら、 Django テストランナーを使って独自のテストスイートを実行し、Django のテスト基盤の恩恵を受けたいと思うかもしれません。</p>\n<p>一般的な慣習は、アプリケーションコードの隣に <em>tests</em> ディレクトリを置き、以下のような構成にすることです:</p>\n<div class=\"code-block\" data-language=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</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=\"Text code\"><code>runtests.py\npolls/\n    __init__.py\n    models.py\n    ...\ntests/\n    __init__.py\n    models.py\n    test_settings.py\n    tests.py\n</code></pre></div>\n<p>いくつかのファイルの中身を見てみましょう:</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\">runtests.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=\"ch\">#!/usr/bin/env python</span>\n<span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">os</span>\n<span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">sys</span>\n\n<span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">django</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.conf</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">settings</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\">get_runner</span>\n\n<span class=\"k\">if</span> <span class=\"vm\">__name__</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;__main__&quot;</span><span class=\"p\">:</span>\n    <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">environ</span><span class=\"p\">[</span><span class=\"s2\">&quot;DJANGO_SETTINGS_MODULE&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;tests.test_settings&quot;</span>\n    <span class=\"n\">django</span><span class=\"o\">.</span><span class=\"n\">setup</span><span class=\"p\">()</span>\n    <span class=\"n\">TestRunner</span> <span class=\"o\">=</span> <span class=\"n\">get_runner</span><span class=\"p\">(</span><span class=\"n\">settings</span><span class=\"p\">)</span>\n    <span class=\"n\">test_runner</span> <span class=\"o\">=</span> <span class=\"n\">TestRunner</span><span class=\"p\">()</span>\n    <span class=\"n\">failures</span> <span class=\"o\">=</span> <span class=\"n\">test_runner</span><span class=\"o\">.</span><span class=\"n\">run_tests</span><span class=\"p\">([</span><span class=\"s2\">&quot;tests&quot;</span><span class=\"p\">])</span>\n    <span class=\"n\">sys</span><span class=\"o\">.</span><span class=\"n\">exit</span><span class=\"p\">(</span><span class=\"nb\">bool</span><span class=\"p\">(</span><span class=\"n\">failures</span><span class=\"p\">))</span>\n</code></pre></figure>\n<p>これはテストスイートを実行するために呼び出すスクリプトです。Django 環境をセットアップし、テストデータベースを作成し、テストを実行します。</p>\n<p>わかりやすくするために、この例では Django テストランナーを使うために必要な最低限のものだけを含んでいます。冗長性を制御したり、実行する特定のテストラベルを渡したりするためのコマンドラインオプションを追加しても構いません。</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/test_settings.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=\"n\">SECRET_KEY</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;fake-key&quot;</span>\n<span class=\"n\">INSTALLED_APPS</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"s2\">&quot;tests&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></figure>\n<p>このファイルには、アプリのテストを実行するために必要な <a class=\"reference internal\" href=\"/ja/6.0/topics/settings/\"><span class=\"doc\">Django の設定</span></a> が含まれています。</p>\n<p>繰り返しますが、これは最小限の例です。テストを実行するには、さらに別の設定が必要になるかもしれません。</p>\n<p><em>tests</em> パッケージはテストを実行する際に <a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> に含まれるので、その <code class=\"docutils literal notranslate\"><span class=\"pre\">models.py</span></code> ファイルにテスト専用のモデルを定義することもできます。</p>\n</section>\n<section id=\"using-different-testing-frameworks\">\n<span id=\"other-testing-frameworks\"></span><h2>ほかのテストフレームワークを使う<a class=\"heading-anchor\" href=\"#using-different-testing-frameworks\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>明らかに、<a class=\"reference external\" href=\"https://docs.python.org/3/library/unittest.html#module-unittest\" title=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">unittest</span></code></a> は唯一のPythonテストフレームワークではありません。Djangoは代替フレームワークに対する明示的なサポートを提供していませんが、代替フレームワーク向けに構築されたテストを通常のDjangoテストのように呼び出す方法に対応しています。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">./manage.py</span> <span class=\"pre\">test</span></code> を実行するとき、Django は <a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-TEST_RUNNER\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TEST_RUNNER</span></code></a> 設定を見て、何をするかを決定します。デフォルトでは、 <a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-TEST_RUNNER\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TEST_RUNNER</span></code></a> は <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.test.runner.DiscoverRunner'</span></code> を指します。このクラスは Django のデフォルトのテスト動作を定義します。この動作には下記が含まれます:</p>\n<ol class=\"arabic simple\">\n<li><p>テスト前のグローバルなセットアップの実行。</p></li>\n<li><p>現在のディレクトリ以下のファイルの中から、名前が <code class=\"docutils literal notranslate\"><span class=\"pre\">test*.py</span></code> と一致するテストを探す。</p></li>\n<li><p>テストデータベースの作成。</p></li>\n<li><p>テストデータベースにモデルと初期データをインストールするために <code class=\"docutils literal notranslate\"><span class=\"pre\">migrate</span></code> を実行する。</p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/6.0/topics/checks/\"><span class=\"doc\">システムチェック</span></a> の実行。</p></li>\n<li><p>見つかったテストを実行する。</p></li>\n<li><p>テストデータベースの破棄。</p></li>\n<li><p>テスト後のグローバルな後処理の実行。</p></li>\n</ol>\n<p>独自のテストランナークラスを定義し、 <a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-TEST_RUNNER\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TEST_RUNNER</span></code></a> をそのクラスに向けると、 Django は常に <code class=\"docutils literal notranslate\"><span class=\"pre\">./manage.py</span> <span class=\"pre\">test</span></code> を実行するときに、あなたのテストランナを実行します。この方法なら、 Python コードから実行できるテストフレームワークを使ったり、 Django のテスト実行プロセスを変更して、どんなテスト要件でも満たすことができます。</p>\n<section id=\"defining-a-test-runner\">\n<span id=\"topics-testing-test-runner\"></span><h3>テストランナーを定義する<a class=\"heading-anchor\" href=\"#defining-a-test-runner\"><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\">run_tests()</span></code> メソッドを定義したクラスです。Django には、デフォルトの Django のテスト動作を定義する <code class=\"docutils literal notranslate\"><span class=\"pre\">DiscoverRunner</span></code> クラスが同梱されています。このクラスは <code class=\"docutils literal notranslate\"><span class=\"pre\">run_tests()</span></code> のエントリーポイントを定義し、さらに <code class=\"docutils literal notranslate\"><span class=\"pre\">run_tests()</span></code> がテストスイートのセットアップ、実行、終了に使用する他のメソッドも定義します。</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.test.runner.DiscoverRunner\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">DiscoverRunner</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">pattern</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">'test*.py'</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">top_level</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">verbosity</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">1</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">interactive</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">True</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">failfast</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">keepdb</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">reverse</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">debug_mode</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">debug_sql</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">parallel</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">0</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">tags</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">exclude_tags</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">test_name_patterns</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">pdb</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">buffer</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">enable_faulthandler</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">True</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">timing</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">True</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">shuffle</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">logger</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">durations</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.runner.DiscoverRunner\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\"><span class=\"pre\">DiscoverRunner</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">pattern</span></code> にマッチするファイル内のテストを検索します。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">top_level</span></code> を使うと、トップレベルの Python モジュールを含むディレクトリを指定できます。通常、 Django はこれを自動的に判別するので、このオプションを指定する必要はありません。もし指定するなら、通常は <code class=\"docutils literal notranslate\"><span class=\"pre\">manage.py</span></code> ファイルがあるディレクトリを指定します。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code> はコンソールに出力される通知とデバッグ情報の量を決定します。 <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code> は出力なし、 <code class=\"docutils literal notranslate\"><span class=\"pre\">1</span></code> は通常の出力、 <code class=\"docutils literal notranslate\"><span class=\"pre\">2</span></code> は冗長 (verbose) な出力です。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">interactive</span></code> が <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> の場合、テストスイートが実行されるときにユーザーに指示を求める権限があります。この動作の例は、既存のテストデータベースを削除する許可を求めるようなものです。もし <code class=\"docutils literal notranslate\"><span class=\"pre\">interactive</span></code> が <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> なら、テストスイートは手動で操作しなくても実行できる必要があります。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">failfast</span></code> が <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> の場合、テストスイートは最初のテストの失敗を検出した後に実行を停止します。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">keepdb</span></code> が <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> の場合、テストスイートは既存のデータベースを使用します。 <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> の場合は、新しいデータベースを作成し、既存のデータベースを削除するようユーザに促します。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">reverse</span></code> が <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> の場合、テストケースは逆の順番で実行されます。これは適切に分離されておらず、副作用があるテストをデバッグするのに便利です。 <a class=\"reference internal\" href=\"/ja/6.0/topics/testing/overview/#order-of-tests\"><span class=\"std std-ref\">テストクラス</span></a> によるグループ化は、このオプションを使用しても保持されます。このオプションは <code class=\"docutils literal notranslate\"><span class=\"pre\">--shuffle</span></code> と組み合わせて、特定のランダムシードの順序を逆にするために使用できます。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">debug_mode</span></code> は、テストを実行する前に <a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> 設定を何に設定するべきかを指定します。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">parallel</span></code> specifies the number of processes. If <code class=\"docutils literal notranslate\"><span class=\"pre\">parallel</span></code> is greater\nthan <code class=\"docutils literal notranslate\"><span class=\"pre\">1</span></code>, the test suite will run in <code class=\"docutils literal notranslate\"><span class=\"pre\">parallel</span></code> processes. If there are\nfewer test case classes than configured processes, Django will reduce the\nnumber of processes accordingly. Each process gets its own database. This\noption requires the third-party <code class=\"docutils literal notranslate\"><span class=\"pre\">tblib</span></code> package to display tracebacks\ncorrectly.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">tags</span></code> は <a class=\"reference internal\" href=\"/ja/6.0/topics/testing/tools/#topics-tagging-tests\"><span class=\"std std-ref\">テストをフィルタリングするタグ</span></a> に使用できます。 <code class=\"docutils literal notranslate\"><span class=\"pre\">exclude_tags</span></code> と併用できます。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">exclude_tags</span></code> は、テストを除外するための <a class=\"reference internal\" href=\"/ja/6.0/topics/testing/tools/#topics-tagging-tests\"><span class=\"std std-ref\">タグのセット</span></a> の指定に使用できます。 <code class=\"docutils literal notranslate\"><span class=\"pre\">tags</span></code> と併用できます。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">debug_sql</span></code> が <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> の場合、失敗したテストケースはトレースバックと同様に <a class=\"reference internal\" href=\"/ja/6.0/ref/logging/#django-db-logger\"><span class=\"std std-ref\">django.db.backends のロガー</span></a> に記録された SQL クエリを出力します。もし <code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code> が <code class=\"docutils literal notranslate\"><span class=\"pre\">2</span></code> なら、すべてのテストのクエリが出力されます。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">test_name_patterns</span></code> を使うと、テストメソッドやクラスを名前でフィルタするためのパターンセットを指定できます。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">pdb</span></code> が <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> の場合、デバッガ (<code class=\"docutils literal notranslate\"><span class=\"pre\">pdb</span></code> または <code class=\"docutils literal notranslate\"><span class=\"pre\">ipdb</span></code>) がテストのエラーや失敗のたびに起動されます。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">buffer</span></code> が <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> の場合、合格したテストの出力は破棄されます。</p>\n<p>If <code class=\"docutils literal notranslate\"><span class=\"pre\">enable_faulthandler</span></code> is <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, <a class=\"reference external\" href=\"https://docs.python.org/3/library/faulthandler.html#module-faulthandler\" title=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">faulthandler</span></code></a> will be\nenabled.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">timing</span></code> が <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> の場合、データベースのセットアップと総実行時間を含むテスト時間が表示されます。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">shuffle</span></code> が整数の場合、その整数はランダムシードとして使用され、テストケースが実行前にランダムな順序でシャッフルされます。 <code class=\"docutils literal notranslate\"><span class=\"pre\">shuffle</span></code> が <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> の場合、シードはランダムに生成されます。どちらの場合も、シードはテスト実行前に記録され、 <code class=\"docutils literal notranslate\"><span class=\"pre\">self.shuffle_seed</span></code> に設定されます。このオプションは、適切に分離されていないテストを検出するのに役立つことがあります。このオプションを使用する場合、 <a class=\"reference internal\" href=\"/ja/6.0/topics/testing/overview/#order-of-tests\"><span class=\"std std-ref\">テストクラスによるグルーピング</span></a> が保持されます。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">logger</span></code> can be used to pass a Python <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#logger\" title=\"(in Python v3.14)\"><span class=\"xref std std-ref\">Logger object</span></a>.\nIf provided, the logger will be used to log messages instead of printing to\nthe console. The logger object will respect its logging level rather than\nthe <code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code>.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">durations</span></code> will show a list of the N slowest test cases. Setting this\noption to <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code> will result in the duration for all tests being shown.</p>\n<p>Django では、新しい引数を追加することで、テストランナーの機能を拡張するこ とがあります。この拡張を可能にするのが <code class=\"docutils literal notranslate\"><span class=\"pre\">**kwargs</span></code> 宣言です。もし <code class=\"docutils literal notranslate\"><span class=\"pre\">DiscoverRunner</span></code> をサブクラス化したり、独自のテストランナーを書いたりする場合は、 <code class=\"docutils literal notranslate\"><span class=\"pre\">**kwargs</span></code> を受け付けるようにしてください。</p>\n<p>テストランナーでは、追加のコマンドラインオプションを定義することもできます。 <code class=\"docutils literal notranslate\"><span class=\"pre\">add_arguments(cls,</span> <span class=\"pre\">parser)</span></code> クラスメソッドを作成またはオーバーライドし、そのメソッド内で <code class=\"docutils literal notranslate\"><span class=\"pre\">parser.add_argument()</span></code> を呼び出すときにカスタム引数を追加することで、 <a class=\"reference internal\" href=\"/ja/6.0/ref/django-admin/#django-admin-test\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">test</span></code></a> コマンドがそれらの引数を使用できるようになります。</p>\n</dd></dl>\n\n<section id=\"attributes\">\n<h4>属性<a class=\"heading-anchor\" href=\"#attributes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.test.runner.DiscoverRunner.test_suite\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">DiscoverRunner.</span></span><span class=\"sig-name descname\"><span class=\"pre\">test_suite</span></span><a class=\"heading-anchor\" href=\"#django.test.runner.DiscoverRunner.test_suite\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>テストスイートのビルドに使用するクラス。デフォルトでは <code class=\"docutils literal notranslate\"><span class=\"pre\">unittest.TestSuite</span></code> に設定されています。テストを収集するために別のロジックを実装したい場合は、これをオーバーライドできます。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.test.runner.DiscoverRunner.test_runner\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">DiscoverRunner.</span></span><span class=\"sig-name descname\"><span class=\"pre\">test_runner</span></span><a class=\"heading-anchor\" href=\"#django.test.runner.DiscoverRunner.test_runner\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>これは低レベルテストランナーのクラスで、個々のテストを実行し、結果をフォーマットするために使用されます。デフォルトでは <code class=\"docutils literal notranslate\"><span class=\"pre\">unittest.TextTestRunner</span></code> に設定されています。似たような名前になっていますが、残念ながらこれは <code class=\"docutils literal notranslate\"><span class=\"pre\">DiscoverRunner</span></code> と同じ種類のクラスではありません。この属性をオーバーライドすることで、テストの実行方法やレポート方法を変更できます。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.test.runner.DiscoverRunner.test_loader\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">DiscoverRunner.</span></span><span class=\"sig-name descname\"><span class=\"pre\">test_loader</span></span><a class=\"heading-anchor\" href=\"#django.test.runner.DiscoverRunner.test_loader\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>これは、TestCases やモジュールなどからテストを読み込んで、ランナーが実行するテストスイートにバンドルするクラスです。デフォルトでは <code class=\"docutils literal notranslate\"><span class=\"pre\">unittest.defaultTestLoader</span></code> に設定されています。通常とは異なる方法でテストを読み込む場合は、この属性をオーバーライドします。</p>\n</dd></dl>\n\n</section>\n<section id=\"methods\">\n<h4>メソッド<a class=\"heading-anchor\" href=\"#methods\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.test.runner.DiscoverRunner.run_tests\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">DiscoverRunner.</span></span><span class=\"sig-name descname\"><span class=\"pre\">run_tests</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">test_labels</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.runner.DiscoverRunner.run_tests\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>テストスイートを実行します。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">test_labels</span></code> は実行するテストを指定するもので、いくつかのフォーマットをサポートしています (サポートされているフォーマットのリストについては <a class=\"reference internal\" href=\"#django.test.runner.DiscoverRunner.build_suite\" title=\"django.test.runner.DiscoverRunner.build_suite\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">DiscoverRunner.build_suite()</span></code></a> を参照してください)。</p>\n<p>このメソッドは、失敗したテストの数を返す必要があります。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.test.runner.DiscoverRunner.add_arguments\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">classmethod</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">DiscoverRunner.</span></span><span class=\"sig-name descname\"><span class=\"pre\">add_arguments</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">parser</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.runner.DiscoverRunner.add_arguments\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Override this class method to add custom arguments accepted by the\n<a class=\"reference internal\" href=\"/ja/6.0/ref/django-admin/#django-admin-test\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">test</span></code></a> management command. See\n<a class=\"reference external\" href=\"https://docs.python.org/3/library/argparse.html#argparse.ArgumentParser.add_argument\" title=\"(in Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">argparse.ArgumentParser.add_argument()</span></code></a> for details about adding\narguments to a parser.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.test.runner.DiscoverRunner.setup_test_environment\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">DiscoverRunner.</span></span><span class=\"sig-name descname\"><span class=\"pre\">setup_test_environment</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.runner.DiscoverRunner.setup_test_environment\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><a class=\"reference internal\" href=\"#django.test.utils.setup_test_environment\" title=\"django.test.utils.setup_test_environment\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">setup_test_environment()</span></code></a> を呼び出して、 <a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> を <code class=\"docutils literal notranslate\"><span class=\"pre\">self.debug_mode</span></code> (デフォルトは <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>) に設定することで、テスト環境をセットアップできます。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.test.runner.DiscoverRunner.build_suite\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">DiscoverRunner.</span></span><span class=\"sig-name descname\"><span class=\"pre\">build_suite</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">test_labels</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.runner.DiscoverRunner.build_suite\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>指定されたテストラベルにマッチするテストスイートを構築（コンストラクト）します。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">test_labels</span></code> は実行するテストを説明する文字列のリストです。テストラベルには下記の 4 つのうち、いずれかの形式が指定できます:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">path.to.test_module.TestCase.test_method</span></code> -- テストケースクラスのテストメソッドを実行します。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">path.to.test_module.TestCase</span></code> -- テストケースのすべてのテストメソッドを実行します。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">path.to.module</span></code> -- 指定した Python パッケージまたはモジュール内のすべてのテストを検索して実行します。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">path/to/directory</span></code> -- 指定したディレクトリ以下のすべてのテストを検索し、実行します。</p></li>\n</ul>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">test_labels</span></code> の値が <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> の場合、テストランナーはカレントディレクトリ以下のすべてのファイルの中から、 <code class=\"docutils literal notranslate\"><span class=\"pre\">pattern</span></code> (上記参照) にマッチする名前のテストを探します。</p>\n<p>実行可能な <code class=\"docutils literal notranslate\"><span class=\"pre\">TestSuite</span></code> インスタンスを返します。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.test.runner.DiscoverRunner.setup_databases\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">DiscoverRunner.</span></span><span class=\"sig-name descname\"><span class=\"pre\">setup_databases</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.runner.DiscoverRunner.setup_databases\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><a class=\"reference internal\" href=\"#django.test.utils.setup_databases\" title=\"django.test.utils.setup_databases\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">setup_databases()</span></code></a> を呼び出して、テスト用データベースを作成します。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.test.runner.DiscoverRunner.run_checks\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">DiscoverRunner.</span></span><span class=\"sig-name descname\"><span class=\"pre\">run_checks</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">databases</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.runner.DiscoverRunner.run_checks\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><a class=\"reference internal\" href=\"/ja/6.0/topics/checks/\"><span class=\"doc\">システムチェック</span></a> をテスト用の <code class=\"docutils literal notranslate\"><span class=\"pre\">databases</span></code> に対して実行します。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.test.runner.DiscoverRunner.run_suite\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">DiscoverRunner.</span></span><span class=\"sig-name descname\"><span class=\"pre\">run_suite</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">suite</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.runner.DiscoverRunner.run_suite\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>テストスイートを実行します。</p>\n<p>テストスイートの実行結果を返します。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.test.runner.DiscoverRunner.get_test_runner_kwargs\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">DiscoverRunner.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_test_runner_kwargs</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.runner.DiscoverRunner.get_test_runner_kwargs\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\"><span class=\"pre\">DiscoverRunner.test_runner</span></code> をインスタンス化するためのキーワード引数を返します。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.test.runner.DiscoverRunner.teardown_databases\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">DiscoverRunner.</span></span><span class=\"sig-name descname\"><span class=\"pre\">teardown_databases</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">old_config</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.runner.DiscoverRunner.teardown_databases\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><a class=\"reference internal\" href=\"#django.test.utils.teardown_databases\" title=\"django.test.utils.teardown_databases\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">teardown_databases()</span></code></a> を呼び出すことで、テストデータベースを破棄し、テスト前の状態に戻します。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.test.runner.DiscoverRunner.teardown_test_environment\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">DiscoverRunner.</span></span><span class=\"sig-name descname\"><span class=\"pre\">teardown_test_environment</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.runner.DiscoverRunner.teardown_test_environment\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>テスト前の環境を復元します。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.test.runner.DiscoverRunner.suite_result\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">DiscoverRunner.</span></span><span class=\"sig-name descname\"><span class=\"pre\">suite_result</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">suite</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">result</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.runner.DiscoverRunner.suite_result\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>テストスイートを基にリターンコードを計算し、その結果を返します。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.test.runner.DiscoverRunner.log\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">DiscoverRunner.</span></span><span class=\"sig-name descname\"><span class=\"pre\">log</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">msg</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">level</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.runner.DiscoverRunner.log\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>もし <code class=\"docutils literal notranslate\"><span class=\"pre\">logger</span></code> が設定されている場合、与えられた整数の <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#levels\">logging level</a> (例えば <code class=\"docutils literal notranslate\"><span class=\"pre\">logging.DEBUG</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">logging.INFO</span></code> または <code class=\"docutils literal notranslate\"><span class=\"pre\">logging.WARNING</span></code>) でメッセージをログに記録します。そうでない場合は、現在の <code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code> に従ってコンソールにメッセージが出力されます。例えば、 <code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code> が 0 の場合はメッセージは表示されず、 <code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code> が 1 以上の場合は <code class=\"docutils literal notranslate\"><span class=\"pre\">INFO</span></code> 以上のメッセージが表示され、2 以上の場合は <code class=\"docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code> のメッセージが表示されます。 <code class=\"docutils literal notranslate\"><span class=\"pre\">level</span></code> のデフォルトは <code class=\"docutils literal notranslate\"><span class=\"pre\">logging.INFO</span></code> です。</p>\n</dd></dl>\n\n</section>\n</section>\n<section id=\"testing-utilities\">\n<h3>テスト用ユーティリティ<a class=\"heading-anchor\" href=\"#testing-utilities\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"module-django.test.utils\">\n<span id=\"django-test-utils\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">django.test.utils</span></code><a class=\"heading-anchor\" href=\"#module-django.test.utils\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>独自のテストランナーの作成を支援するために、Django は <code class=\"docutils literal notranslate\"><span class=\"pre\">django.test.utils</span></code> モジュールで多くのユーティリティメソッドを提供しています。</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.test.utils.setup_test_environment\">\n<span class=\"sig-name descname\"><span class=\"pre\">setup_test_environment</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">debug</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.utils.setup_test_environment\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>グローバルな前処理テストセットアップを実行します。これには、テンプレートレンダリングシステム用の計測ツールのインストールや、ダミーのメールアウトボックスのセットアップが含まれます。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">debug</span></code> が <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> 以外の場合、 <a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> 設定はその値に更新されます。</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.test.utils.teardown_test_environment\">\n<span class=\"sig-name descname\"><span class=\"pre\">teardown_test_environment</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.utils.teardown_test_environment\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>グローバルな後処理テストのテアダウン（解体）を実行します。これには、テンプレートシステムから計測ツールを削除し、通常のメールサービスを復元することが含まれます。</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.test.utils.setup_databases\">\n<span class=\"sig-name descname\"><span class=\"pre\">setup_databases</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">verbosity</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">interactive</span></span></em>, <em class=\"sig-param\"><span class=\"keyword-only-separator o\"><abbr title=\"Keyword-only parameters separator (PEP 3102)\"><span class=\"pre\">*</span></abbr></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">time_keeper</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">keepdb</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">debug_sql</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">parallel</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">0</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">aliases</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">serialized_aliases</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.utils.setup_databases\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>テスト用データベースを作成します。</p>\n<p>行われた変更を元に戻すのに十分な詳細情報を提供するデータ構造を返します。このデータはテスト終了時に <a class=\"reference internal\" href=\"#django.test.utils.teardown_databases\" title=\"django.test.utils.teardown_databases\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">teardown_databases()</span></code></a> 関数に渡されます。</p>\n<p>引数 <code class=\"docutils literal notranslate\"><span class=\"pre\">aliases</span></code> はどの <a class=\"reference internal\" href=\"/ja/6.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=\"/ja/6.0/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a> の全てのエイリアスです。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">serialized_aliases</span></code> 引数は、 <code class=\"docutils literal notranslate\"><span class=\"pre\">aliases</span></code> テストデータベースのどのサブセットがその状態をシリアライズすべきかを特定し、 <a class=\"reference internal\" href=\"/ja/6.0/topics/testing/overview/#test-case-serialized-rollback\"><span class=\"std std-ref\">serialized_rollback</span></a> 機能が利用できるようにします。指定しなかった場合、デフォルトは <code class=\"docutils literal notranslate\"><span class=\"pre\">aliases</span></code> になります。</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.test.utils.teardown_databases\">\n<span class=\"sig-name descname\"><span class=\"pre\">teardown_databases</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">old_config</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">parallel</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">0</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">keepdb</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.utils.teardown_databases\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>テスト データベースを破棄し、テスト前の状態に戻します。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">old_config</span></code> は元に戻すべきデータベース設定の変更を定義したデータ構造です。これは <a class=\"reference internal\" href=\"#django.test.utils.setup_databases\" title=\"django.test.utils.setup_databases\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">setup_databases()</span></code></a> メソッドの戻り値です。</p>\n</dd></dl>\n\n</section>\n<section id=\"django-db-connection-creation\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.connection.creation</span></code><a class=\"heading-anchor\" href=\"#django-db-connection-creation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>データベースバックエンドの作成モジュールは、テスト中に役立つユーティリティも提供しています。</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.db.connection.creation.create_test_db\">\n<span class=\"sig-name descname\"><span class=\"pre\">create_test_db</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">verbosity</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">1</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">autoclobber</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">keepdb</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.connection.creation.create_test_db\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>新しいテストデータベースを作成し、それに対して <code class=\"docutils literal notranslate\"><span class=\"pre\">migrate</span></code> を実行します。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">run_tests()</span></code> と同じ動作です。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">autoclobber</span></code> はテストデータベースと同じ名前のデータベースを見つけた場合の動作を表します:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">autoclobber</span></code> が <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> の場合、ユーザは既存のデータベースを破棄することを承認するよう求められます。ユーザーが承認しない場合は <code class=\"docutils literal notranslate\"><span class=\"pre\">sys.exit</span></code> が呼び出されます。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">autoclobber</span></code> が <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> の場合、ユーザーに通知することなくデータベースを破棄します。</p></li>\n</ul>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">keepdb</span></code> はテスト実行時に既存のデータベースを使用するか、新しいデータベースを作成するかを決定します。もし <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> なら、既存のデータベースが使用され、存在しない場合は作成されます。もし <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> ならば、新しいデータベースが作成され、既存のデータベースを削除するようにユーザに促します。</p>\n<p>作成したテスト用データベースの名前を返します。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">create_test_db()</span></code> は <a class=\"reference internal\" href=\"/ja/6.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=\"/ja/6.0/ref/settings/#std-setting-NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">NAME</span></code></a> の値をテストデータベースの名前と一致するように変更するという副作用があります。</p>\n<aside class=\"version-note version-deprecated\" data-version=\"6.0\">\n<p class=\"version-note-title\">Deprecated since Django 6.0</p><p><span class=\"versionmodified deprecated\">バージョン 6.0 で非推奨: </span>The <code class=\"docutils literal notranslate\"><span class=\"pre\">serialize</span></code> keyword argument is deprecated. Passing\n<code class=\"docutils literal notranslate\"><span class=\"pre\">serialize=True</span></code> would automatically call\n<a class=\"reference internal\" href=\"#django.db.connection.creation.serialize_db_to_string\" title=\"django.db.connection.creation.serialize_db_to_string\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">serialize_db_to_string()</span></code></a> but it was deprecated as it could result\nin queries against non-test databases during serialization.</p>\n</aside>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.db.connection.creation.destroy_test_db\">\n<span class=\"sig-name descname\"><span class=\"pre\">destroy_test_db</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">old_database_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">verbosity</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">1</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">keepdb</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.connection.creation.destroy_test_db\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><a class=\"reference internal\" href=\"/ja/6.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=\"/ja/6.0/ref/settings/#std-setting-NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">NAME</span></code></a> の値を名前とするデータベースを破棄し、 <a class=\"reference internal\" href=\"/ja/6.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\">old_database_name</span></code> の値をセットします。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code> 引数は <a class=\"reference internal\" href=\"#django.test.runner.DiscoverRunner\" title=\"django.test.runner.DiscoverRunner\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DiscoverRunner</span></code></a> と同じ動作です。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">keepdb</span></code> 引数が <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> の場合、データベースへの接続は閉じられますが、データベースは破棄されません。</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.db.connection.creation.serialize_db_to_string\">\n<span class=\"sig-name descname\"><span class=\"pre\">serialize_db_to_string</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.connection.creation.serialize_db_to_string\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>データベースの内容をメモリ上の JSON 文字列としてシリアライズします。これは、使用しているバックエンドがトランザクションをサポートしていない場合や、テストスイートに <a class=\"reference internal\" href=\"/ja/6.0/topics/testing/overview/#test-case-serialized-rollback\"><span class=\"std std-ref\">serialized_rollback=True</span></a> を有効にしたテストクラスが含まれている場合に、テスト間でデータベースの状態を復元するために使用されます。</p>\n<p>この関数は、すべてのテスト用データベースが作成された後にのみ呼び出すべきです。シリアライズ処理中に、 <a class=\"reference internal\" href=\"/ja/6.0/topics/db/multi-db/#topics-db-multi-db-routing\"><span class=\"std std-ref\">ルーティングの設定</span></a> によってテスト用でないデータベースに対してクエリが発行される可能性があるためです。</p>\n</dd></dl>\n\n</section>\n</section>\n</section>\n<section id=\"integration-with-coverage-py\">\n<span id=\"topics-testing-code-coverage\"></span><h2><code class=\"docutils literal notranslate\"><span class=\"pre\">coverage.py</span></code> との統合<a class=\"heading-anchor\" href=\"#integration-with-coverage-py\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>コードカバレッジは、ソースコードがどれだけテストされたかを表します。コードカバレッジは、コードのどの部分がテストで実施され、 どの部分が実施されていないのかを表します。アプリケーションをテストする上で重要な要素なので、テストのカバレッジをチェックすることを強く推奨します。</p>\n<p>Django は Python プログラムのコードカバレッジを測定するツール <a class=\"reference external\" href=\"https://coverage.readthedocs.io/\">coverage.py</a> と簡単に統合できます。まず、 <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/coverage/\">coverage</a> をインストールします。次に、 <code class=\"docutils literal notranslate\"><span class=\"pre\">manage.py</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>coverage<span class=\"w\"> </span>run<span class=\"w\"> </span>--source<span class=\"o\">=</span><span class=\"s1\">&#39;.&#39;</span><span class=\"w\"> </span>manage.py<span class=\"w\"> </span><span class=\"nb\">test</span><span class=\"w\"> </span>myapp\n</code></pre></div>\n<p>これはテストを実行し、プロジェクト内で実行されたファイルのカバレッジデータを収集します。次のコマンドを入力すると、このデータのレポートを見ることができます:</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>coverage<span class=\"w\"> </span>report\n</code></pre></div>\n<p>テストの実行中に、いくつかの Django コードが実行されましたが、前のコマンドに <code class=\"docutils literal notranslate\"><span class=\"pre\">source</span></code> フラグが渡されたため、ここには記載されていないことに注意してください。</p>\n<p>テストに失敗した行の詳細を注釈を付けてHTMLに表示するなどのオプションについては、 <a class=\"reference external\" href=\"https://coverage.readthedocs.io/\">coverage.py</a> のドキュメントを参照してください。</p>\n</section>","rootId":"advanced-testing-topics","toc":[{"title":"RequestFactory（リクエスト ファクトリ）","anchor":"the-request-factory","children":[{"title":"カスタマイズ例","anchor":"example","children":[]},{"title":"AsyncRequestFactory","anchor":"asyncrequestfactory","children":[]}]},{"title":"クラスベースのビューをテストする","anchor":"testing-class-based-views","children":[]},{"title":"テストとマルチホスト名","anchor":"tests-and-multiple-host-names","children":[]},{"title":"テストと複数データベース","anchor":"tests-and-multiple-databases","children":[{"title":"プライマリ/レプリカ構成のテスト","anchor":"testing-primary-replica-configurations","children":[]},{"title":"テストデータベースの作成順をコントロールする","anchor":"controlling-creation-order-for-test-databases","children":[]}]},{"title":"TransactionTestCase の高度な機能","anchor":"advanced-features-of-transactiontestcase","children":[]},{"title":"テストクラスを強制的に逐次実行する","anchor":"enforce-running-test-classes-sequentially","children":[]},{"title":"Django テストランナーを使って再利用可能なアプリケーションをテストする","anchor":"using-the-django-test-runner-to-test-reusable-applications","children":[]},{"title":"ほかのテストフレームワークを使う","anchor":"using-different-testing-frameworks","children":[{"title":"テストランナーを定義する","anchor":"defining-a-test-runner","children":[{"title":"属性","anchor":"attributes","children":[]},{"title":"メソッド","anchor":"methods","children":[]}]},{"title":"テスト用ユーティリティ","anchor":"testing-utilities","children":[{"title":"django.test.utils","anchor":"module-django.test.utils","children":[]},{"title":"django.db.connection.creation","anchor":"django-db-connection-creation","children":[]}]}]},{"title":"coverage.py との統合","anchor":"integration-with-coverage-py","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Django を使う","url":"/ja/6.0/topics/"},{"docname":"topics/testing/index","title":"Django におけるテスト","url":"/ja/6.0/topics/testing/"}],"prev":{"docname":"topics/testing/tools","title":"テストツール","url":"/ja/6.0/topics/testing/tools/"},"next":{"docname":"topics/auth/index","title":"Django でのユーザー認証","url":"/ja/6.0/topics/auth/"},"formats":{"html":"/ja/6.0/topics/testing/advanced/","markdown":"/ja/6.0/topics/testing/advanced.md","json":"/ja/6.0/topics/testing/advanced.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/topics/testing/advanced.txt","official":"https://docs.djangoproject.com/ja/6.0/topics/testing/advanced/","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"]}