{"title":"Advanced testing topics","version":"6.0","locale":"id","docname":"topics/testing/advanced","url":"/id/6.0/topics/testing/advanced/","canonical":"https://djangodocs.dev/id/6.0/topics/testing/advanced/","summary":"The request factory Link to this heading # class RequestFactory Link to this definition # The RequestFactory shares the same API as the test client. However,…","html":"<h1>Advanced testing topics<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>The request factory<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>The <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> shares the same API as\nthe test client. However, instead of behaving like a browser, the\nRequestFactory provides a way to generate a request instance that can\nbe used as the first argument to any view. This means you can test a\nview function the same way as you would test any other function -- as\na black box, with exactly known inputs, testing for specific outputs.</p>\n<p>The API for the <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> is a slightly\nrestricted subset of the test client API:</p>\n<ul class=\"simple\">\n<li><p>It only has access to the HTTP methods <a class=\"reference internal\" href=\"/id/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=\"/id/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=\"/id/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=\"/id/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=\"/id/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=\"/id/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=\"/id/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>These methods accept all the same arguments <em>except</em> for\n<code class=\"docutils literal notranslate\"><span class=\"pre\">follow</span></code>. Since this is just a factory for producing\nrequests, it's up to you to handle the response.</p></li>\n<li><p>It does not support middleware. Session and authentication\nattributes must be supplied by the test itself if required\nfor the view to function properly.</p></li>\n</ul>\n<section id=\"example\">\n<h3>Contoh<a class=\"heading-anchor\" href=\"#example\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>The following is a unit test using the request factory:</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> creates WSGI-like requests. If you want to create ASGI-like\nrequests, including having a correct ASGI <code class=\"docutils literal notranslate\"><span class=\"pre\">scope</span></code>, you can instead use\n<code class=\"docutils literal notranslate\"><span class=\"pre\">django.test.AsyncRequestFactory</span></code>.</p>\n<p>This class is directly API-compatible with <code class=\"docutils literal notranslate\"><span class=\"pre\">RequestFactory</span></code>, with the only\ndifference being that it returns <code class=\"docutils literal notranslate\"><span class=\"pre\">ASGIRequest</span></code> instances rather than\n<code class=\"docutils literal notranslate\"><span class=\"pre\">WSGIRequest</span></code> instances. All of its methods are still synchronous callables.</p>\n<p>Arbitrary keyword arguments in <code class=\"docutils literal notranslate\"><span class=\"pre\">defaults</span></code> are added directly into the ASGI\nscope.</p>\n</section>\n</section>\n<section id=\"testing-class-based-views\">\n<h2>Testing class-based views<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>In order to test class-based views outside of the request/response cycle you\nmust ensure that they are configured correctly, by calling\n<a class=\"reference internal\" href=\"/id/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> after instantiation.</p>\n<p>For example, assuming the following class-based view:</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>You may directly test the <code class=\"docutils literal notranslate\"><span class=\"pre\">get_context_data()</span></code> method by first instantiating\nthe view, then passing a <code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code> to <code class=\"docutils literal notranslate\"><span class=\"pre\">setup()</span></code>, before proceeding with\nyour test's 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>Tests and multiple host names<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>The <a class=\"reference internal\" href=\"/id/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> setting is validated when running tests. This\nallows the test client to differentiate between internal and external URLs.</p>\n<p>Projects that support multitenancy or otherwise alter business logic based on\nthe request's host and use custom host names in tests must include those hosts\nin <a class=\"reference internal\" href=\"/id/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>The first option to do so is to add the hosts to your settings file. For\nexample, the test suite for docs.djangoproject.com includes the following:</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>and the settings file includes a list of the domains supported by the project:</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=\"/id/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=\"/id/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=\"/id/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>Disabling <a class=\"reference internal\" href=\"/id/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> checking (<code class=\"docutils literal notranslate\"><span class=\"pre\">ALLOWED_HOSTS</span> <span class=\"pre\">=</span> <span class=\"pre\">['*']</span></code>) when\nrunning tests prevents the test client from raising a helpful error message if\nyou follow a redirect to an external URL.</p>\n</section>\n<section id=\"tests-and-multiple-databases\">\n<span id=\"topics-testing-advanced-multidb\"></span><h2>Uji coba  dan multi database<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>Testing primary/replica configurations<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>If you're testing a multiple database configuration with primary/replica\n(referred to as master/slave by some databases) replication, this strategy of\ncreating test databases poses a problem.\nWhen the test databases are created, there won't be any replication,\nand as a result, data created on the primary won't be seen on the\nreplica.</p>\n<p>To compensate for this, Django allows you to define that a database is\na <em>test mirror</em>. Consider the following (simplified) example database\nconfiguration:</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>In this setup, we have two database servers: <code class=\"docutils literal notranslate\"><span class=\"pre\">dbprimary</span></code>, described\nby the database alias <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code>, and <code class=\"docutils literal notranslate\"><span class=\"pre\">dbreplica</span></code> described by the\nalias <code class=\"docutils literal notranslate\"><span class=\"pre\">replica</span></code>. As you might expect, <code class=\"docutils literal notranslate\"><span class=\"pre\">dbreplica</span></code> has been configured\nby the database administrator as a read replica of <code class=\"docutils literal notranslate\"><span class=\"pre\">dbprimary</span></code>, so in\nnormal activity, any write to <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> will appear on <code class=\"docutils literal notranslate\"><span class=\"pre\">replica</span></code>.</p>\n<p>If Django created two independent test databases, this would break any\ntests that expected replication to occur. However, the <code class=\"docutils literal notranslate\"><span class=\"pre\">replica</span></code>\ndatabase has been configured as a test mirror (using the\n<a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-TEST_MIRROR\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIRROR</span></code></a> test setting), indicating that under\ntesting, <code class=\"docutils literal notranslate\"><span class=\"pre\">replica</span></code> should be treated as a mirror of <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code>.</p>\n<p>When the test environment is configured, a test version of <code class=\"docutils literal notranslate\"><span class=\"pre\">replica</span></code>\nwill <em>not</em> be created. Instead the connection to <code class=\"docutils literal notranslate\"><span class=\"pre\">replica</span></code>\nwill be redirected to point at <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code>. As a result, writes to\n<code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> will appear on <code class=\"docutils literal notranslate\"><span class=\"pre\">replica</span></code> -- but because they are actually\nthe same database, not because there is data replication between the\ntwo databases. As this depends on transactions, the tests must use\n<a class=\"reference internal\" href=\"/id/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> instead of\n<a class=\"reference internal\" href=\"/id/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>.</p>\n</section>\n<section id=\"controlling-creation-order-for-test-databases\">\n<span id=\"topics-testing-creation-dependencies\"></span><h3>Mengendalikan pembuatan urutan untuk basisdata percobaan<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>By default, Django will assume all databases depend on the <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code>\ndatabase and therefore always create the <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> database first.\nHowever, no guarantees are made on the creation order of any other\ndatabases in your test setup.</p>\n<p>If your database configuration requires a specific creation order, you\ncan specify the dependencies that exist using the <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-TEST_DEPENDENCIES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEPENDENCIES</span></code></a> test setting. Consider the following (simplified)\nexample database configuration:</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>Under this configuration, the <code class=\"docutils literal notranslate\"><span class=\"pre\">diamonds</span></code> database will be created first,\nas it is the only database alias without dependencies. The <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">clubs</span></code> alias will be created next (although the order of creation of this\npair is not guaranteed), then <code class=\"docutils literal notranslate\"><span class=\"pre\">hearts</span></code>, and finally <code class=\"docutils literal notranslate\"><span class=\"pre\">spades</span></code>.</p>\n<p>If there are any circular dependencies in the <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-TEST_DEPENDENCIES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEPENDENCIES</span></code></a> definition, an\n<a class=\"reference internal\" href=\"/id/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> exception will be raised.</p>\n</section>\n</section>\n<section id=\"advanced-features-of-transactiontestcase\">\n<h2>Fitus-fitur lanjutan dari <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\">Peringatan</p>\n<p>Atribut ini adalah API pribadi. Itu mungkin berubah atau dipindahkan tanpa masa pengusangan di masa datang, sebagai contoh untuk menampung perubahan-perubahan dalam memuat aplikasi.</p>\n<p>Itu digunakan untuk memaksimalkan deretan percobaan sendiri Djangom, yang mengandung ratusan dari model-model tetapi tidak ada hubungan diantara model-model dalam aplikasi berbeda.</p>\n</aside>\n<p>By default, <code class=\"docutils literal notranslate\"><span class=\"pre\">available_apps</span></code> is set to <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>. After each test, Django\ncalls <a class=\"reference internal\" href=\"/id/6.0/ref/django-admin/#django-admin-flush\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">flush</span></code></a> to reset the database state. This empties all tables\nand emits the <a class=\"reference internal\" href=\"/id/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> signal, which\nrecreates one content type and four permissions for each model. This\noperation gets expensive proportionally to the number of models.</p>\n<p>Setting <code class=\"docutils literal notranslate\"><span class=\"pre\">available_apps</span></code> to a list of applications instructs Django to\nbehave as if only the models from these applications were available. The\nbehavior of <code class=\"docutils literal notranslate\"><span class=\"pre\">TransactionTestCase</span></code> changes as follows:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/id/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> dinyalakan sebelum setiap percobaan membuat jenis-jenis isi dan perizinan untuk setiap model dalam aplikasi tersedia, dalam kasus mereka hilang.</p></li>\n<li><p>Setelah setiap percobaan, Django mengkosongkan hanya tabel-tabel sesuai ke model dalam aplikasi tersedia. Bagaimanapun, pada tingkat basisdata, pemotongan mungkin menurun pada model-model terkait dalam aplikasi tidak tersedia. Lebih lanjut <a class=\"reference internal\" href=\"/id/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> tidak dinyalakan. Itu akan dinyalakan oleh <code class=\"docutils literal notranslate\"><span class=\"pre\">TransactionTestCase</span></code> selanjutnya, setelah kumpulan benar dari aplikasi-aplikasi dipilih.</p></li>\n</ul>\n<p>Since the database isn't fully flushed, if a test creates instances of\nmodels not included in <code class=\"docutils literal notranslate\"><span class=\"pre\">available_apps</span></code>, they will leak and they may\ncause unrelated tests to fail. Be careful with tests that use sessions;\nthe default session engine stores them in the database.</p>\n<p>Since <a class=\"reference internal\" href=\"/id/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> isn't emitted after\nflushing the database, its state after a <code class=\"docutils literal notranslate\"><span class=\"pre\">TransactionTestCase</span></code> isn't the\nsame as after a <code class=\"docutils literal notranslate\"><span class=\"pre\">TestCase</span></code>: it's missing the rows created by listeners\nto <a class=\"reference internal\" href=\"/id/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>. Considering the\n<a class=\"reference internal\" href=\"/id/6.0/topics/testing/overview/#order-of-tests\"><span class=\"std std-ref\">order in which tests are executed</span></a>, this isn't an\nissue, provided either all <code class=\"docutils literal notranslate\"><span class=\"pre\">TransactionTestCase</span></code> in a given test suite\ndeclare <code class=\"docutils literal notranslate\"><span class=\"pre\">available_apps</span></code>, or none of them.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">available_apps</span></code> adalah wajib dalam deretan percobaan Django sendiri.</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>Setting <code class=\"docutils literal notranslate\"><span class=\"pre\">reset_sequences</span> <span class=\"pre\">=</span> <span class=\"pre\">True</span></code> on a <code class=\"docutils literal notranslate\"><span class=\"pre\">TransactionTestCase</span></code> will make\nsure sequences are always reset before the test run:</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>Using <code class=\"docutils literal notranslate\"><span class=\"pre\">reset_sequences</span> <span class=\"pre\">=</span> <span class=\"pre\">True</span></code> will slow down the test, since the primary\nkey reset is a relatively expensive database operation.</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>Enforce running test classes sequentially<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>If you have test classes that cannot be run in parallel (e.g. because they\nshare a common resource), you can use <code class=\"docutils literal notranslate\"><span class=\"pre\">django.test.testcases.SerializeMixin</span></code>\nto run them sequentially. This mixin uses a filesystem <code class=\"docutils literal notranslate\"><span class=\"pre\">lockfile</span></code>.</p>\n<p>For example, you can use <code class=\"docutils literal notranslate\"><span class=\"pre\">__file__</span></code> to determine that all test classes in the\nsame file that inherit from <code class=\"docutils literal notranslate\"><span class=\"pre\">SerializeMixin</span></code> will run sequentially:</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>Menggunakan penjalan percobaan Django untuk menjalankan aplikasi digunakan kembali<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>If you are writing a <a class=\"reference internal\" href=\"/id/6.0/intro/reusable-apps/\"><span class=\"doc\">reusable application</span></a>\nyou may want to use the Django test runner to run your own test suite\nand thus benefit from the Django testing infrastructure.</p>\n<p>A common practice is a <em>tests</em> directory next to the application code, with the\nfollowing structure:</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>Mari kita lihat didalam sepasang berkas-berkas tersebut:</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>Ini adalah tulisan yang anda minta menjalankan deretan percobaan. itu menyetel lingkungan Django, membuat basisdata percobaan dan menjalankan percobaan.</p>\n<p>For the sake of clarity, this example contains only the bare minimum\nnecessary to use the Django test runner. You may want to add\ncommand-line options for controlling verbosity, passing in specific test\nlabels to run, etc.</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>Berkas ini mengandung <a class=\"reference internal\" href=\"/id/6.0/topics/settings/\"><span class=\"doc\">Django settings</span></a> dibutuhkan untuk menjalankan aplikasi percobaan anda.</p>\n<p>Kembali, ini adalah cotoh minimal; percobaan anda mungkin membutuhkan pengaturan tambahan untuk berjalan.</p>\n<p>Karena paket <em>tests</em> disertakan dalam <a class=\"reference internal\" href=\"/id/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> saat menjalankan pengujian, anda dapat menentukan model khusus pengujian dalam berkas <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>Menggunakan kerangka percobaan berbeda<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>Clearly, <a class=\"reference external\" href=\"https://docs.python.org/3/library/unittest.html#module-unittest\" title=\"(di Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">unittest</span></code></a> is not the only Python testing framework. While Django\ndoesn't provide explicit support for alternative frameworks, it does provide a\nway to invoke tests constructed for an alternative framework as if they were\nnormal Django tests.</p>\n<p>Ketika anda menjalankan <code class=\"docutils literal notranslate\"><span class=\"pre\">./manage.py</span> <span class=\"pre\">test</span></code>, Django melihat pengaturan <a class=\"reference internal\" href=\"/id/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> untuk menentukan apa yang harus dilakukan. Secara awalan, <a class=\"reference internal\" href=\"/id/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> menunjuk ke <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.test.runner.DiscoverRunner'</span></code>. Kelas ini mendefinisikan perilaku pengujian Django awalan. Perilaku ini melibatkan:</p>\n<ol class=\"arabic simple\">\n<li><p>Performing global pre-test setup.</p></li>\n<li><p>Mencari pengujian di berkas apa pun di bawah direktori saat ini yang namanya cocok dengan pola <code class=\"docutils literal notranslate\"><span class=\"pre\">test*.py</span></code>.</p></li>\n<li><p>Membuat basisdata percobaan.</p></li>\n<li><p>Running <code class=\"docutils literal notranslate\"><span class=\"pre\">migrate</span></code> to install models and initial data into the test\ndatabases.</p></li>\n<li><p>Menjalankan <a class=\"reference internal\" href=\"/id/6.0/topics/checks/\"><span class=\"doc\">system checks</span></a>.</p></li>\n<li><p>Menjalankan percobaan yang ditemukan.</p></li>\n<li><p>Menghancurkan basisdata percobaan.</p></li>\n<li><p>Performing global post-test teardown.</p></li>\n</ol>\n<p>Jika Anda mendefinisikan kelas runner pengujian anda sendiri dan titik <a class=\"reference internal\" href=\"/id/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> pada kelas itu, Django akan mengeksekusi runner pengujian anda setiap kali anda menjalankan <code class=\"docutils literal notranslate\"><span class=\"pre\">./manage.py</span> <span class=\"pre\">test</span></code>. Dengan cara ini, dimungkinkan untuk menggunakan kerangka pengujian yang dapat dijalankan dari kode Python, atau untuk merubah proses eksekusi pengujian Django untuk memenuhi persyaratan pengujian apa pun yang mungkin anda miliki.</p>\n<section id=\"defining-a-test-runner\">\n<span id=\"topics-testing-test-runner\"></span><h3>Defining a test runner<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>A test runner is a class defining a <code class=\"docutils literal notranslate\"><span class=\"pre\">run_tests()</span></code> method. Django ships\nwith a <code class=\"docutils literal notranslate\"><span class=\"pre\">DiscoverRunner</span></code> class that defines the default Django testing\nbehavior. This class defines the <code class=\"docutils literal notranslate\"><span class=\"pre\">run_tests()</span></code> entry point, plus a\nselection of other methods that are used by <code class=\"docutils literal notranslate\"><span class=\"pre\">run_tests()</span></code> to set up, execute\nand tear down the test suite.</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> will search for tests in any file matching <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> dapat digunakan untuk menentukan direktori yang berisi modul Python tingkat atas anda. Biasanya Django dapat mengetahui ini secara otomatis, jadi tidak perlu menentukan opsi ini. Jika ditentukan, biasanya ini adalah direktori yang berisi file <code class=\"docutils literal notranslate\"><span class=\"pre\">manage.py</span></code> anda.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code> determines the amount of notification and debug information\nthat will be printed to the console; <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code> is no output, <code class=\"docutils literal notranslate\"><span class=\"pre\">1</span></code> is normal\noutput, and <code class=\"docutils literal notranslate\"><span class=\"pre\">2</span></code> is verbose output.</p>\n<p>If <code class=\"docutils literal notranslate\"><span class=\"pre\">interactive</span></code> is <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, the test suite has permission to ask the\nuser for instructions when the test suite is executed. An example of this\nbehavior would be asking for permission to delete an existing test\ndatabase. If <code class=\"docutils literal notranslate\"><span class=\"pre\">interactive</span></code> is <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>, the test suite must be able to\nrun without any manual intervention.</p>\n<p>If <code class=\"docutils literal notranslate\"><span class=\"pre\">failfast</span></code> is <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, the test suite will stop running after the\nfirst test failure is detected.</p>\n<p>If <code class=\"docutils literal notranslate\"><span class=\"pre\">keepdb</span></code> is <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, the test suite will use the existing database,\nor create one if necessary. If <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>, a new database will be created,\nprompting the user to remove the existing one, if present.</p>\n<p>If <code class=\"docutils literal notranslate\"><span class=\"pre\">reverse</span></code> is <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, test cases will be executed in the opposite\norder. This could be useful to debug tests that aren't properly isolated\nand have side effects. <a class=\"reference internal\" href=\"/id/6.0/topics/testing/overview/#order-of-tests\"><span class=\"std std-ref\">Grouping by test class</span></a> is\npreserved when using this option. This option can be used in conjunction\nwith <code class=\"docutils literal notranslate\"><span class=\"pre\">--shuffle</span></code> to reverse the order for a particular random seed.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">debug_mode</span></code> specifies what the <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> setting should be\nset to prior to running tests.</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> can be used to specify a set of <a class=\"reference internal\" href=\"/id/6.0/topics/testing/tools/#topics-tagging-tests\"><span class=\"std std-ref\">tags for filtering tests</span></a>. May be combined with <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> can be used to specify a set of\n<a class=\"reference internal\" href=\"/id/6.0/topics/testing/tools/#topics-tagging-tests\"><span class=\"std std-ref\">tags for excluding tests</span></a>. May be combined\nwith <code class=\"docutils literal notranslate\"><span class=\"pre\">tags</span></code>.</p>\n<p>If <code class=\"docutils literal notranslate\"><span class=\"pre\">debug_sql</span></code> is <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, failing test cases will output SQL queries\nlogged to the <a class=\"reference internal\" href=\"/id/6.0/ref/logging/#django-db-logger\"><span class=\"std std-ref\">django.db.backends logger</span></a> as well\nas the traceback. If <code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code> is <code class=\"docutils literal notranslate\"><span class=\"pre\">2</span></code>, then queries in all tests are\noutput.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">test_name_patterns</span></code> can be used to specify a set of patterns for\nfiltering test methods and classes by their names.</p>\n<p>If <code class=\"docutils literal notranslate\"><span class=\"pre\">pdb</span></code> is <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, a debugger (<code class=\"docutils literal notranslate\"><span class=\"pre\">pdb</span></code> or <code class=\"docutils literal notranslate\"><span class=\"pre\">ipdb</span></code>) will be spawned at\neach test error or failure.</p>\n<p>If <code class=\"docutils literal notranslate\"><span class=\"pre\">buffer</span></code> is <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, outputs from passing tests will be discarded.</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=\"(di 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>If <code class=\"docutils literal notranslate\"><span class=\"pre\">timing</span></code> is <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, test timings, including database setup and total\nrun time, will be shown.</p>\n<p>If <code class=\"docutils literal notranslate\"><span class=\"pre\">shuffle</span></code> is an integer, test cases will be shuffled in a random order\nprior to execution, using the integer as a random seed. If <code class=\"docutils literal notranslate\"><span class=\"pre\">shuffle</span></code> is\n<code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>, the seed will be generated randomly. In both cases, the seed will\nbe logged and set to <code class=\"docutils literal notranslate\"><span class=\"pre\">self.shuffle_seed</span></code> prior to running tests. This\noption can be used to help detect tests that aren't properly isolated.\n<a class=\"reference internal\" href=\"/id/6.0/topics/testing/overview/#order-of-tests\"><span class=\"std std-ref\">Grouping by test class</span></a> is preserved when using this\noption.</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=\"(di 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 may, from time to time, extend the capabilities of the test runner\nby adding new arguments. The <code class=\"docutils literal notranslate\"><span class=\"pre\">**kwargs</span></code> declaration allows for this\nexpansion. If you subclass <code class=\"docutils literal notranslate\"><span class=\"pre\">DiscoverRunner</span></code> or write your own test\nrunner, ensure it accepts <code class=\"docutils literal notranslate\"><span class=\"pre\">**kwargs</span></code>.</p>\n<p>Your test runner may also define additional command-line options.\nCreate or override an <code class=\"docutils literal notranslate\"><span class=\"pre\">add_arguments(cls,</span> <span class=\"pre\">parser)</span></code> class method and add\ncustom arguments by calling <code class=\"docutils literal notranslate\"><span class=\"pre\">parser.add_argument()</span></code> inside the method, so\nthat the <a class=\"reference internal\" href=\"/id/6.0/ref/django-admin/#django-admin-test\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">test</span></code></a> command will be able to use those arguments.</p>\n</dd></dl>\n\n<section id=\"attributes\">\n<h4>Atribut<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>The class used to build the test suite. By default it is set to\n<code class=\"docutils literal notranslate\"><span class=\"pre\">unittest.TestSuite</span></code>. This can be overridden if you wish to implement\ndifferent logic for collecting tests.</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>This is the class of the low-level test runner which is used to execute\nthe individual tests and format the results. By default it is set to\n<code class=\"docutils literal notranslate\"><span class=\"pre\">unittest.TextTestRunner</span></code>. Despite the unfortunate similarity in\nnaming conventions, this is not the same type of class as\n<code class=\"docutils literal notranslate\"><span class=\"pre\">DiscoverRunner</span></code>, which covers a broader set of responsibilities. You\ncan override this attribute to modify the way tests are run and reported.</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>This is the class that loads tests, whether from TestCases or modules or\notherwise and bundles them into test suites for the runner to execute.\nBy default it is set to <code class=\"docutils literal notranslate\"><span class=\"pre\">unittest.defaultTestLoader</span></code>. You can override\nthis attribute if your tests are going to be loaded in unusual ways.</p>\n</dd></dl>\n\n</section>\n<section id=\"methods\">\n<h4>Cara<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>Jalankan deretan percobaan.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">test_labels</span></code> allows you to specify which tests to run and supports\nseveral formats (see <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> for a list of\nsupported formats).</p>\n<p>Cara ini harus mengembalikan angka dari percobaan yang gagal.</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=\"/id/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=\"(di 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>Sets up the test environment by calling\n<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> and setting\n<a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> to <code class=\"docutils literal notranslate\"><span class=\"pre\">self.debug_mode</span></code> (defaults to <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>Membangun rangkaian percobaan yang cocok dengan label percobaan disediakan.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">test_labels</span></code> adalah daftar dari string menggambarkan percobaan untuk dijalankan. Sebuah label percobaan dapat mengambil satu dari empat bentuk:</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> -- Run a single test method\nin a test case class.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">path.to.test_module.TestCase</span></code> -- Jalankan semua metode percobaan dalam kasus percobaan.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">path.to.module</span></code> -- Cari dan jalankan semua percobaan yang bernama paket atau modul Python.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">path/to/directory</span></code> -- Cari dan jalankan semua percobaan dibawan direktori dinamai.</p></li>\n</ul>\n<p>If <code class=\"docutils literal notranslate\"><span class=\"pre\">test_labels</span></code> has a value of <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>, the test runner will search for\ntests in all files below the current directory whose names match its\n<code class=\"docutils literal notranslate\"><span class=\"pre\">pattern</span></code> (see above).</p>\n<p>Mengembalikan sebuah instance <code class=\"docutils literal notranslate\"><span class=\"pre\">TestSuite</span></code> untuk dijalankan.</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>Membuat basisdata percobaan dengan memanggil <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>Runs the <a class=\"reference internal\" href=\"/id/6.0/topics/checks/\"><span class=\"doc\">system checks</span></a> on the test <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>Jalankan deretan percobaan.</p>\n<p>Mengembalikan hasil dihasilkan dari menjalankan deretan percobaan.</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>Mengembalikan argumen kata kunci untuk menginstansiasi dengan <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>Menghancurkan basisdata percobaan, menyimpan kembali keadaan pra-percobaan dengan memanggil <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>Menyimpan kembali lingkungan pra-percobaan.</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>Menghitung dan mengembalikan kode balikan berdasarkan pada deretan percobaan, dan hasil dari deretan percobaan itu.</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>If a <code class=\"docutils literal notranslate\"><span class=\"pre\">logger</span></code> is set, logs the message at the given integer\n<a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#levels\">logging level</a> (e.g. <code class=\"docutils literal notranslate\"><span class=\"pre\">logging.DEBUG</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">logging.INFO</span></code>, or\n<code class=\"docutils literal notranslate\"><span class=\"pre\">logging.WARNING</span></code>). Otherwise, the message is printed to the console,\nrespecting the current <code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code>. For example, no message will be\nprinted if the <code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code> is 0, <code class=\"docutils literal notranslate\"><span class=\"pre\">INFO</span></code> and above will be printed if\nthe <code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code> is at least 1, and <code class=\"docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code> will be printed if it is at\nleast 2. The <code class=\"docutils literal notranslate\"><span class=\"pre\">level</span></code> defaults to <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>Percobaan keperluan<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>Untuk membantu dalam pembuatan dari pejalan percobaan anda sendiri, Django menyediakan sejumlah metode utilitas dalam modul <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>Performs global pre-test setup, such as installing instrumentation for the\ntemplate rendering system and setting up the dummy email outbox.</p>\n<p>Jika <code class=\"docutils literal notranslate\"><span class=\"pre\">debug</span></code> bukan <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>, pengaturan <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> diperbaharui pada nilainya.</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>Performs global post-test teardown, such as removing instrumentation from\nthe template system and restoring normal email services.</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>Membuat basisdata percobaan.</p>\n<p>Returns a data structure that provides enough detail to undo the changes\nthat have been made. This data will be provided to the\n<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> function at the conclusion of testing.</p>\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">aliases</span></code> argument determines which <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a> aliases test\ndatabases should be set up for. If it's not provided, it defaults to all of\n<a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a> aliases.</p>\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">serialized_aliases</span></code> argument determines what subset of <code class=\"docutils literal notranslate\"><span class=\"pre\">aliases</span></code>\ntest databases should have their state serialized to allow usage of the\n<a class=\"reference internal\" href=\"/id/6.0/topics/testing/overview/#test-case-serialized-rollback\"><span class=\"std std-ref\">serialized_rollback</span></a> feature. If\nit's not provided, it defaults to <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>Menghancurkan basisdata percobaan, menyimpan kembali keadaan pra-pengujian.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">old_config</span></code> adalah struktur data menentukan peribahan dalam konfigurasi basisdata yang butuh di balik. Nilai kembaliannya dari metode <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>django.db.connection.creation`<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>The creation module of the database backend also provides some utilities that\ncan be useful during testing.</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>Membuat percobaan basisdata baru dan menjalankan <code class=\"docutils literal notranslate\"><span class=\"pre\">migrate</span></code> terhadapnya.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code> mempunyai perilaku sama seperti dalam <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> describes the behavior that will occur if a\ndatabase with the same name as the test database is discovered:</p>\n<ul class=\"simple\">\n<li><p>If <code class=\"docutils literal notranslate\"><span class=\"pre\">autoclobber</span></code> is <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>, the user will be asked to\napprove destroying the existing database. <code class=\"docutils literal notranslate\"><span class=\"pre\">sys.exit</span></code> is\ncalled if the user does not approve.</p></li>\n<li><p>If <code class=\"docutils literal notranslate\"><span class=\"pre\">autoclobber</span></code> is <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, the database will be destroyed\nwithout consulting the user.</p></li>\n</ul>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">keepdb</span></code> determines if the test run should use an existing\ndatabase, or create a new one. If <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, the existing\ndatabase will be used, or created if not present. If <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>,\na new database will be created, prompting the user to remove\nthe existing one, if present.</p>\n<p>Mengembalikan nama dari basisdata percobaan yang dia buat.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">create_test_db()</span></code> has the side effect of modifying the value of\n<a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">NAME</span></code></a> in <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a> to match the name of the test\ndatabase.</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\">Ditinggalkan sejak versi 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>Destroys the database whose name is the value of <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">NAME</span></code></a> in\n<a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a>, and sets <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">NAME</span></code></a> to the value of\n<code class=\"docutils literal notranslate\"><span class=\"pre\">old_database_name</span></code>.</p>\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code> argument has the same behavior as for\n<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>If the <code class=\"docutils literal notranslate\"><span class=\"pre\">keepdb</span></code> argument is <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, then the connection to the\ndatabase will be closed, but the database will not be destroyed.</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>Serializes the database into an in-memory JSON string that can be used to\nrestore the database state between tests if the backend doesn't support\ntransactions or if your suite contains test classes with\n<a class=\"reference internal\" href=\"/id/6.0/topics/testing/overview/#test-case-serialized-rollback\"><span class=\"std std-ref\">serialized_rollback=True</span></a> enabled.</p>\n<p>This function should only be called once all test databases have been\ncreated as the serialization process could result in queries against\nnon-test databases depending on your\n<a class=\"reference internal\" href=\"/id/6.0/topics/db/multi-db/#topics-db-multi-db-routing\"><span class=\"std std-ref\">routing configuration</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>Perpaduan dengan <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>Code coverage describes how much source code has been tested. It shows which\nparts of your code are being exercised by tests and which are not. It's an\nimportant part of testing applications, so it's strongly recommended to check\nthe coverage of your tests.</p>\n<p>Django dapat dengan mudah diintegrasikan dengan <a class=\"reference external\" href=\"https://coverage.readthedocs.io/\">coverage.py</a>, alat untuk mengukur cakupan kode program Python. Pertama, instal <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/coverage/\">coverage</a>. Selanjutnya, jalankan perintah berikut dari folder proyek anda yang berisi <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>This runs your tests and collects coverage data of the executed files in your\nproject. You can see a report of this data by typing following command:</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>Catat bahwa beberapa kode Django telah dijalankan selagi menjalankan percobaan, tetapi itu tidak didaftarkan disini karena bendera <code class=\"docutils literal notranslate\"><span class=\"pre\">source</span></code> dilewatkan ke perintah sebelumnya.</p>\n<p>Untuk piihan lainnya seperti cantuman HTML beranotasi yang memerinci baris yang terlewat, lihat dokumen <a class=\"reference external\" href=\"https://coverage.readthedocs.io/\">coverage.py</a>.</p>\n</section>","rootId":"advanced-testing-topics","toc":[{"title":"The request factory","anchor":"the-request-factory","children":[{"title":"Contoh","anchor":"example","children":[]},{"title":"AsyncRequestFactory","anchor":"asyncrequestfactory","children":[]}]},{"title":"Testing class-based views","anchor":"testing-class-based-views","children":[]},{"title":"Tests and multiple host names","anchor":"tests-and-multiple-host-names","children":[]},{"title":"Uji coba  dan multi database","anchor":"tests-and-multiple-databases","children":[{"title":"Testing primary/replica configurations","anchor":"testing-primary-replica-configurations","children":[]},{"title":"Mengendalikan pembuatan urutan untuk basisdata percobaan","anchor":"controlling-creation-order-for-test-databases","children":[]}]},{"title":"Fitus-fitur lanjutan dari TransactionTestCase","anchor":"advanced-features-of-transactiontestcase","children":[]},{"title":"Enforce running test classes sequentially","anchor":"enforce-running-test-classes-sequentially","children":[]},{"title":"Menggunakan penjalan percobaan Django untuk menjalankan aplikasi digunakan kembali","anchor":"using-the-django-test-runner-to-test-reusable-applications","children":[]},{"title":"Menggunakan kerangka percobaan berbeda","anchor":"using-different-testing-frameworks","children":[{"title":"Defining a test runner","anchor":"defining-a-test-runner","children":[{"title":"Atribut","anchor":"attributes","children":[]},{"title":"Cara","anchor":"methods","children":[]}]},{"title":"Percobaan keperluan","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":"Perpaduan dengan coverage.py","anchor":"integration-with-coverage-py","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Menggunakan Django","url":"/id/6.0/topics/"},{"docname":"topics/testing/index","title":"Percobaan di Django","url":"/id/6.0/topics/testing/"}],"prev":{"docname":"topics/testing/tools","title":"Alat percobaan","url":"/id/6.0/topics/testing/tools/"},"next":{"docname":"topics/auth/index","title":"Otentifikasi pengguna di Django","url":"/id/6.0/topics/auth/"},"formats":{"html":"/id/6.0/topics/testing/advanced/","markdown":"/id/6.0/topics/testing/advanced.md","json":"/id/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/id/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"]}