{"title":"Satuan percobaan","version":"3.0","locale":"id","docname":"internals/contributing/writing-code/unit-tests","url":"/id/3.0/internals/contributing/writing-code/unit-tests/","canonical":"https://djangodocs.dev/id/3.0/internals/contributing/writing-code/unit-tests/","summary":"Django datang dengan deretan percobaan dia sendiri, di pelipat tests dari kode dasar. Itu kebijakan kami untuk memastikan semua percobaan selalu lolos. Kami…","html":"<h1>Satuan percobaan<a class=\"heading-anchor\" href=\"#unit-tests\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Django datang dengan deretan percobaan dia sendiri, di pelipat <code class=\"docutils literal notranslate\"><span class=\"pre\">tests</span></code> dari kode dasar. Itu kebijakan kami untuk memastikan semua percobaan selalu lolos.</p>\n<p>Kami menghargai apapun dan semua bantuan pada deretan percobaan!</p>\n<p>Percobaan Django semua menggunakan infrastruktur percobaan yang dikirim dengan Django untuk aplikasi percobaan. Lihat <a class=\"reference internal\" href=\"/id/3.0/topics/testing/overview/\"><span class=\"doc\">Menulis dan menjalankan percobaan</span></a> untuk sebuah penjelasan bagaimana menulis percobaan baru.</p>\n<section id=\"running-the-unit-tests\">\n<span id=\"running-unit-tests\"></span><h2>Menjalankan satuan percobaan<a class=\"heading-anchor\" href=\"#running-the-unit-tests\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"quickstart\">\n<h3>Mulai cepat<a class=\"heading-anchor\" href=\"#quickstart\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Pertama, <a class=\"reference external\" href=\"https://github.com/django/django/fork\">fork Django on GitHub</a>.</p>\n<p>Kedua, buat dan aktifkan lingkungan maya. Jika anda tidak akrab dengan bagaimana melakukan itu, baca <a class=\"reference internal\" href=\"/id/3.0/intro/contributing/\"><span class=\"doc\">contributing tutorial</span></a> kami.</p>\n<p>Selanjutnya, kloning cabang anda, pasang beberapa persyaratan, dan jalankan percobaan:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-0-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>git<span class=\"w\"> </span>clone<span class=\"w\"> </span>https://github.com/YourGitHubName/django.git<span class=\"w\"> </span>django-repo\n<span class=\"gp\">$ </span><span class=\"nb\">cd</span><span class=\"w\"> </span>django-repo/tests\n<span class=\"gp\">$ </span>python<span class=\"w\"> </span>-m<span class=\"w\"> </span>pip<span class=\"w\"> </span>install<span class=\"w\"> </span>-e<span class=\"w\"> </span>..\n<span class=\"gp\">$ </span>python<span class=\"w\"> </span>-m<span class=\"w\"> </span>pip<span class=\"w\"> </span>install<span class=\"w\"> </span>-r<span class=\"w\"> </span>requirements/py3.txt\n<span class=\"gp\">$ </span>./runtests.py\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-0-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> git clone https://github.com/YourGitHubName/django.git django-repo\n<span class=\"gp\">...\\&gt;</span> <span class=\"k\">cd</span> django-repo\\tests\n<span class=\"gp\">...\\&gt;</span> py -m pip install -e ..\n<span class=\"gp\">...\\&gt;</span> py -m pip install -r requirements\\py3.txt\n<span class=\"gp\">...\\&gt;</span> runtests.py \n</code></pre></div></div></div>\n<p>Memasang membutuhkan akan sepertinya membutuhkan beberapa paket sistem operasi dimana komputer anda tidak dipasang. Anda dapat biasanya mencari tahu paket mana untuk dipasang dengan melakukan pencarian Jaringan untuk baris terakhir atau selanjutnya dari pesan kesalahan. Coba menambahkan sistem operasi anda pada permintaan pencarian jika dibutuhkan.</p>\n<p>Jika anda mempunyai masalah memasang persyaratan, anda dapat melewatkan langkah itu. Lihat <a class=\"reference internal\" href=\"#running-unit-tests-dependencies\"><span class=\"std std-ref\">Menjalankan semua percobaan</span></a> untuk rincian pada memasang pilihan percobaan ketergantungan. Jika anda tidak mempunyai pilihan ketergantungan terpasang, percobaan yang membutuhkan itu akan dilewatkan.</p>\n<p>Menjalankan percobaan membutuhkan modul pengaturan Django yang menentukan basisdata yang digunakan. Untuk membantu anda memulai, Django menyediakan dan menggunakan contoh modul pengaturan yang menggunakan basisdata SQLite. Lihat <a class=\"reference internal\" href=\"#running-unit-tests-settings\"><span class=\"std std-ref\">Gunakan modul pengaturan lain</span></a> untuk mempelajari bagaimana menggunakan modul pengaturan berbeda untuk menjalankan percobaan dengan basisdata berbeda.</p>\n<p>Mempunyai masalah? Lihat <a class=\"reference internal\" href=\"#troubleshooting-unit-tests\"><span class=\"std std-ref\">Menyelesaikan masalah</span></a> untuk beberapa masalah umum.</p>\n</section>\n<section id=\"running-tests-using-tox\">\n<h3>Menjalankan percobaan menggunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">tox</span></code><a class=\"heading-anchor\" href=\"#running-tests-using-tox\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><a class=\"reference external\" href=\"https://tox.readthedocs.io/\">Tox</a> adalah sebuah alat untuk menjalankan lingkungan maya berbeda. Django menyertakan <code class=\"docutils literal notranslate\"><span class=\"pre\">tox.ini</span></code> dasar yang mengotomatisasi beberapa pemeriksaan dimanapeladen pembangun kami berkinerja pada pull request. Untuk menjalankan satuan percobaan dan pemeriksaan lain (seperti <a class=\"reference internal\" href=\"/id/3.0/internals/contributing/writing-code/coding-style/#coding-style-imports\"><span class=\"std std-ref\">import sorting</span></a>, the <a class=\"reference internal\" href=\"/id/3.0/internals/contributing/writing-documentation/#documentation-spelling-check\"><span class=\"std std-ref\">documentation spelling checker</span></a>, and <a class=\"reference internal\" href=\"/id/3.0/internals/contributing/writing-code/coding-style/#coding-style-python\"><span class=\"std std-ref\">code formatting</span></a>), pasang dan jalankan perintah <code class=\"docutils literal notranslate\"><span class=\"pre\">tox</span></code> dari tempat appun dalam pohon sumber Django:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-1-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>-m<span class=\"w\"> </span>pip<span class=\"w\"> </span>install<span class=\"w\"> </span>tox\n<span class=\"gp\">$ </span>tox\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-1-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py -m pip install tox\n<span class=\"gp\">...\\&gt;</span> tox\n</code></pre></div></div></div>\n<p>Secara awalan, <code class=\"docutils literal notranslate\"><span class=\"pre\">tox</span></code> menjalankan deretan percobaan dengan gabungan berkas pengaturan untuk SQLite, <code class=\"docutils literal notranslate\"><span class=\"pre\">flake8</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">isort</span></code>, dan dokumentasi pemeriksa pengejaan. Sebagai tambahan pada ketergantungan sistem dicatat ditempat lain dalam dokumentasi ini, perintah <code class=\"docutils literal notranslate\"><span class=\"pre\">python3</span></code> harus di jalur anda dan terkait ke versi sesuai dari Python. Daftar dari lingkungan awalan dapat dilihat sebagai berikut:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-2-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>tox<span class=\"w\"> </span>-l\n<span class=\"go\">py3</span>\n<span class=\"go\">flake8</span>\n<span class=\"go\">docs</span>\n<span class=\"go\">isort</span>\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-2-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> tox -l\n<span class=\"go\">py3</span>\n<span class=\"go\">flake8</span>\n<span class=\"go\">docs</span>\n<span class=\"go\">isort</span>\n</code></pre></div></div></div>\n<section id=\"testing-other-python-versions-and-database-backends\">\n<h4>Mencoba versi Python lain dan backend basisdata<a class=\"heading-anchor\" href=\"#testing-other-python-versions-and-database-backends\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Sebagai tambahan pada lingkungan awal, <code class=\"docutils literal notranslate\"><span class=\"pre\">tox</span></code> mendukung menjalankan deretan satuan percobaan untuk versi lain Python dan backend basisdata lain. Sejak deretan percobaan Django tidak menggabungkan berkas pengaturan untuk backend basisdata selain dari SQLite, bagaimanapun, anda harus <a class=\"reference internal\" href=\"#running-unit-tests-settings\"><span class=\"std std-ref\">create and provide your own test settings</span></a>. Sebagai contoh, untuk menjalankan percobaan pada Python 3.7 menggunakan PostgreSQL:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-3-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>tox<span class=\"w\"> </span>-e<span class=\"w\"> </span>py37-postgres<span class=\"w\"> </span>--<span class=\"w\"> </span>--settings<span class=\"o\">=</span>my_postgres_settings\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-3-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> tox -e py37-postgres -- --settings=my_postgres_settings\n</code></pre></div></div></div>\n<p>Perintah ini menyetel lingkungan maya Python 3.7, memasang ketergantungan deretan percobaan Django (termasuk untuk PostgreSQL), dan memanggil <code class=\"docutils literal notranslate\"><span class=\"pre\">runtests.py</span></code> dengan argumen didukung (dalam kasus ini, <code class=\"docutils literal notranslate\"><span class=\"pre\">--settings=my_postgres_settings</span></code>).</p>\n<p>Sisa dari dokumentasi ini menunjukkan perintah untuk menjalankan percobaan tanpa <code class=\"docutils literal notranslate\"><span class=\"pre\">tox</span></code>, bagaimanapun, pilihan apapun dilewatkan ke <code class=\"docutils literal notranslate\"><span class=\"pre\">runtests.py</span></code> dapat juga dilewatkan ke <code class=\"docutils literal notranslate\"><span class=\"pre\">tox</span></code> dengan menaruh di awalan daftar argumen dengan <code class=\"docutils literal notranslate\"><span class=\"pre\">--</span></code>, seperti diatas.</p>\n<p>Tox juga menghormati variabel lingkungan <code class=\"docutils literal notranslate\"><span class=\"pre\">DJANGO_SETTINGS_MODULE</span></code>, jika disetel. Sebagai contoh, berikut setara oada perintah diatas:</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span><span class=\"nv\">DJANGO_SETTINGS_MODULE</span><span class=\"o\">=</span>my_postgres_settings<span class=\"w\"> </span>tox<span class=\"w\"> </span>-e<span class=\"w\"> </span>py35-postgres\n</code></pre></div>\n<p>Pengguna Windows harus menggunakan:</p>\n<div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows code\"><code><span class=\"gp\">...\\&gt;</span> <span class=\"k\">set</span> <span class=\"nv\">DJANGO_SETTINGS_MODULE</span><span class=\"p\">=</span>my_postgres_settings\n<span class=\"gp\">...\\&gt;</span> tox -e py35-postgres\n</code></pre></div>\n</section>\n<section id=\"running-the-javascript-tests\">\n<h4>Menjalankan percobaan JavaScript<a class=\"heading-anchor\" href=\"#running-the-javascript-tests\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Django includes a set of <a class=\"reference internal\" href=\"/id/3.0/internals/contributing/writing-code/javascript/#javascript-tests\"><span class=\"std std-ref\">JavaScript unit tests</span></a> for\nfunctions in certain contrib apps. The JavaScript tests aren't run by default\nusing <code class=\"docutils literal notranslate\"><span class=\"pre\">tox</span></code> because they require <code class=\"docutils literal notranslate\"><span class=\"pre\">Node.js</span></code> to be installed and aren't\nnecessary for the majority of patches. To run the JavaScript tests using\n<code class=\"docutils literal notranslate\"><span class=\"pre\">tox</span></code>:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-4-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>tox<span class=\"w\"> </span>-e<span class=\"w\"> </span>javascript\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-4-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> tox -e javascript\n</code></pre></div></div></div>\n<p>Perintah ini menjalankan <code class=\"docutils literal notranslate\"><span class=\"pre\">npm</span> <span class=\"pre\">install</span></code> untuk memastikan persyaratan percobaan terperbaharui dan kemudian menjalankan <code class=\"docutils literal notranslate\"><span class=\"pre\">npm</span> <span class=\"pre\">test</span></code>.</p>\n</section>\n</section>\n<section id=\"running-tests-using-django-docker-box\">\n<h3>Menjalankan percobaan menggunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">django-docker-box</span></code><a class=\"heading-anchor\" href=\"#running-tests-using-django-docker-box\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><a class=\"reference external\" href=\"https://github.com/django/django-docker-box\">django-docker-box</a> mengizinkan anda menjalankan deretan percobaan terhadap semua basisdata yang didukung dan versi python. Lihat halaman proyek <a class=\"reference external\" href=\"https://github.com/django/django-docker-box\">django-docker-box</a> untuk pemasangan dan petunjuk penggunaan.</p>\n</section>\n<section id=\"using-another-settings-module\">\n<span id=\"running-unit-tests-settings\"></span><h3>Gunakan modul <code class=\"docutils literal notranslate\"><span class=\"pre\">pengaturan</span></code> lain<a class=\"heading-anchor\" href=\"#using-another-settings-module\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Modul pengaturan disertakan (<code class=\"docutils literal notranslate\"><span class=\"pre\">tests/test_sqlite.py</span></code>) mengizinkan anda menjalankan deretan percobaan menggunakan SQLite. Jika anda ingin menjalankan percobaan menggunakan basisdata berbeda, anda akan butuh menentukan berkas pengaturan anda. Beberapa percobaan, seperti itu untuk <code class=\"docutils literal notranslate\"><span class=\"pre\">contrib.postgres</span></code>, adalah khusus untuk backend basisdata tertentu dan akan dilewati jika berjalan dengan backend berbeda.</p>\n<p>Untuk menjalankan percobaan dengan pengaturan berbeda, pastikan bahwa modul berada di <code class=\"docutils literal notranslate\"><span class=\"pre\">PYTHONPATH</span></code> anda dan lewati modul dengan <code class=\"docutils literal notranslate\"><span class=\"pre\">--settings</span></code>.</p>\n<p>Pengaturan <a class=\"reference internal\" href=\"/id/3.0/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a> dalam modul pengaturan percobaan apapun butuh menentukan dua basisdata:</p>\n<ul class=\"simple\">\n<li><p>Basisdata <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code>. Basisdata ini harus menggunakan backend yang anda ingin menggunakan untuk percobaan utama.</p></li>\n<li><p>Sebuah basisdata dengan nama lain <code class=\"docutils literal notranslate\"><span class=\"pre\">other</span></code>. Basisdata <code class=\"docutils literal notranslate\"><span class=\"pre\">other</span></code> digunakan untuk mencoba permintaan itu dapat dialihkan ke basisdata berbeda. Basisdata ini harus menggunakan backend sama seperti <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code>, dan itu harus mempunyai nama berbeda.</p></li>\n</ul>\n<p>Jika anda menggunakan backend yang bukan SQLite, anda akan butuh menyediakan rincian lain untuk setiap basisdata:</p>\n<ul class=\"simple\">\n<li><p>Pilihan <a class=\"reference internal\" href=\"/id/3.0/ref/settings/#std-setting-USER\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USER</span></code></a> butuh menentukan akun pengguna yang ada ntuk basisdata. Bahwa pengguna butuh perizinan untuk menjalankan <code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">DATABASE</span></code> sehingga basisdata percobaan dapat dibuat.</p></li>\n<li><p>Pilihan <a class=\"reference internal\" href=\"/id/3.0/ref/settings/#std-setting-PASSWORD\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">PASSWORD</span></code></a> butuh disediakan sandi untuk the <a class=\"reference internal\" href=\"/id/3.0/ref/settings/#std-setting-USER\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USER</span></code></a> yang telah ditentukan.</p></li>\n</ul>\n<p>Basisdata percobaan mendapatkan nama-nama mereka dengan mengawali <code class=\"docutils literal notranslate\"><span class=\"pre\">test_</span></code> pada nilai dari pengaturan <a class=\"reference internal\" href=\"/id/3.0/ref/settings/#std-setting-NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">NAME</span></code></a> untuk basisdata ditentukan di <a class=\"reference internal\" href=\"/id/3.0/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a>. Basisdata percobaan ini dihapus ketika percobaan selesai.</p>\n<p>Anda akan juga butuh memastikan bahwa basisdata anda menggunakan UTF-8 sebagai kumpulan karakter awal. Jika peladen basisdata anda tidak menggunakan UTF-8 sebagai kumpulan karakter awal, anda akan butuh menyertakan sebuah nilai untuk <a class=\"reference internal\" href=\"/id/3.0/ref/settings/#std-setting-TEST_CHARSET\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CHARSET</span></code></a> di kamus pengaturan untuk basisdata yang berlaku.</p>\n</section>\n<section id=\"running-only-some-of-the-tests\">\n<span id=\"runtests-specifying-labels\"></span><h3>Menjalankan hanya beberapa untuk percobaan<a class=\"heading-anchor\" href=\"#running-only-some-of-the-tests\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Deretan percobaan keseluruhan Django perlu waktu untuk berjalan, dan menjalankan setiap percobaan tunggal yang dapat berulang jika, katakan, anda cukup menambahkan percobaan pada Django yang anda ingin jalankan secara cepat tanpa menjalankan yang lainnya. Anda dapat menjalankan subkumpulan dari satuan percobaan dengan menambahkan nama-nama dari modul percobaan pada <code class=\"docutils literal notranslate\"><span class=\"pre\">runtests.py</span></code> di baris perintah.</p>\n<p>Sebagai contoh, jika anda ingin menjalankan percobaan hanya untuk hubugnan umum dan internasionalisasi, ketik:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-5-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>./runtests.py<span class=\"w\"> </span>--settings<span class=\"o\">=</span>path.to.settings<span class=\"w\"> </span>generic_relations<span class=\"w\"> </span>i18n\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-5-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> runtests.py --settings=path.to.settings generic_relations i18n\n</code></pre></div></div></div>\n<p>Bagaimana anda menemukan nama-nama dari percobaan perorangan? Lihat di <code class=\"docutils literal notranslate\"><span class=\"pre\">tests/</span></code> — setiap nama pelipat ada nama dari percobaan.</p>\n<p>Jika anda hanya ingin menjalankan hanya kelas tertentu dari percobaan, anda dapat menentukan daftar jalur pada masing-masing kelas percobaan. Sebgai contoh, untuk menjalankan <code class=\"docutils literal notranslate\"><span class=\"pre\">TranslationTests</span></code> dari modul <code class=\"docutils literal notranslate\"><span class=\"pre\">i18n</span></code>, ketik:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-6-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>./runtests.py<span class=\"w\"> </span>--settings<span class=\"o\">=</span>path.to.settings<span class=\"w\"> </span>i18n.tests.TranslationTests\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-6-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> runtests.py --settings=path.to.settings i18n.tests.TranslationTests\n</code></pre></div></div></div>\n<p>Melampaui itu, anda dapat menentukan metode percobaan sendiri seperti ini:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-7-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>./runtests.py<span class=\"w\"> </span>--settings<span class=\"o\">=</span>path.to.settings<span class=\"w\"> </span>i18n.tests.TranslationTests.test_lazy_objects\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-7-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> runtests.py --settings=path.to.settings i18n.tests.TranslationTests.test_lazy_objects\n</code></pre></div></div></div>\n<p>Anda dapat menjalankan percobaan dimulai pada menentukan modul tingkat-atas dengan pilihan <code class=\"docutils literal notranslate\"><span class=\"pre\">--start-at</span></code>. Sebagai contoh:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-8-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>./runtests.py<span class=\"w\"> </span>--start-at<span class=\"o\">=</span>wsgi\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-8-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> runtests.py --start-at=wsgi\n</code></pre></div></div></div>\n<p>Anda dapat juga menjalankan percobaan dimulai setelah modul tingkat-atas ditentukan dengan pilihan <code class=\"docutils literal notranslate\"><span class=\"pre\">--start-after</span></code>. Sebagai contoh:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-9-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>./runtests.py<span class=\"w\"> </span>--start-after<span class=\"o\">=</span>wsgi\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-9-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> runtests.py --start-after=wsgi\n</code></pre></div></div></div>\n<p>Catat bahwa pilihan <code class=\"docutils literal notranslate\"><span class=\"pre\">--reverse</span></code> tidak berpengaruh pada pilihan <code class=\"docutils literal notranslate\"><span class=\"pre\">--start-at</span></code> atau <code class=\"docutils literal notranslate\"><span class=\"pre\">--start-after</span></code>. Bahkan pilihan ini tidak dapat digunakan dengan label percobaan.</p>\n</section>\n<section id=\"running-the-selenium-tests\">\n<h3>Menjalankan percobaan Selenium<a class=\"heading-anchor\" href=\"#running-the-selenium-tests\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Beberapa percobaan membutuhkan Selenium dan peramban Jaringan. Untuk menjalankan percobaan ini, anda harus memasang paket <a class=\"reference external\" href=\"https://pypi.org/project/selenium/\">selenium</a> dan menjalankan percobaan dengan pilihan <code class=\"docutils literal notranslate\"><span class=\"pre\">--selenium=&lt;BROWSERS&gt;</span></code>. Sebagai contoh, jika anda memiliki Firefox dan Google Chrome terpasang:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-10-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>./runtests.py<span class=\"w\"> </span>--selenium<span class=\"o\">=</span>firefox,chrome\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-10-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> runtests.py --selenium=firefox,chrome\n</code></pre></div></div></div>\n<p>Lihat paket <a class=\"reference external\" href=\"https://github.com/SeleniumHQ/selenium/tree/master/py/selenium/webdriver\">selenium.webdriver</a> untuk daftar perambah tersedia.</p>\n<p>Menentukan <code class=\"docutils literal notranslate\"><span class=\"pre\">--selenium</span></code> otomatis menyetel <code class=\"docutils literal notranslate\"><span class=\"pre\">--tags=selenium</span></code> untuk berjalan hanya percobaan yang membutuhkan selenium.</p>\n<p>Beberapa peramban (yaitu Chrome atau Firefox) mendukung percobaan tanpa kepala, yang dapat lebih cepat dan lebih stabil. Tambah pilihan <code class=\"docutils literal notranslate\"><span class=\"pre\">--headless</span></code> untuk mengaktifkan suasana ini.</p>\n</section>\n<section id=\"running-all-the-tests\">\n<span id=\"running-unit-tests-dependencies\"></span><h3>Menjalankan semua percobaan<a class=\"heading-anchor\" href=\"#running-all-the-tests\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Jika anda ingin menjalankan deretan lengkap dari percobaan, anda akan butuh memasang sejumlah ketergantungan:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference external\" href=\"https://pypi.org/project/argon2_cffi/\">argon2-cffi</a> 16.1.0+</p></li>\n<li><p><a class=\"reference external\" href=\"https://pypi.org/project/asgiref/\">asgiref</a> 3.2+ (dibutuhkan)</p></li>\n<li><p><a class=\"reference external\" href=\"https://pypi.org/project/bcrypt/\">bcrypt</a></p></li>\n<li><p><a class=\"reference external\" href=\"https://pypi.org/project/docutils/\">docutils</a></p></li>\n<li><p><a class=\"reference external\" href=\"https://pypi.org/project/geoip2/\">geoip2</a></p></li>\n<li><p><a class=\"reference external\" href=\"https://pypi.org/project/jinja2/\">jinja2</a> 2.7+</p></li>\n<li><p><a class=\"reference external\" href=\"https://pypi.org/project/numpy/\">numpy</a></p></li>\n<li><p><a class=\"reference external\" href=\"https://pypi.org/project/Pillow/\">Pillow</a> 4.2.0+</p></li>\n<li><p><a class=\"reference external\" href=\"https://pyyaml.org/wiki/PyYAML\">PyYAML</a></p></li>\n<li><p><a class=\"reference external\" href=\"https://pypi.org/project/pytz/\">pytz</a> (wajib)</p></li>\n<li><p><a class=\"reference external\" href=\"https://pypi.org/project/pywatchman/\">pywatchman</a></p></li>\n<li><p><a class=\"reference external\" href=\"https://pypi.org/project/setuptools/\">setuptools</a></p></li>\n<li><p><a class=\"reference external\" href=\"https://memcached.org/\">memcached</a>, ditambah <a class=\"reference internal\" href=\"/id/3.0/topics/cache/#memcached\"><span class=\"std std-ref\">supported Python binding</span></a></p></li>\n<li><p><a class=\"reference external\" href=\"https://www.gnu.org/software/gettext/manual/gettext.html\">gettext</a> (<a class=\"reference internal\" href=\"/id/3.0/topics/i18n/translation/#gettext-on-windows\"><span class=\"std std-ref\">gettext pada Windows</span></a>)</p></li>\n<li><p><a class=\"reference external\" href=\"https://pypi.org/project/selenium/\">selenium</a></p></li>\n<li><p><a class=\"reference external\" href=\"https://pypi.org/project/sqlparse/\">sqlparse</a> 0.2.2+ (dibutuhkan)</p></li>\n<li><p><a class=\"reference external\" href=\"https://pypi.org/project/tblib/\">tblib</a> 1.5.0+</p></li>\n</ul>\n<p>Anda dapat menemukan ketergantungan ini di <a class=\"reference external\" href=\"https://pip.pypa.io/en/latest/user_guide/#requirements-files\">pip requirements files</a> didalam direktori <code class=\"docutils literal notranslate\"><span class=\"pre\">tests/requirements</span></code> dari pohon sumber Django dan pasang mereka seperti itu:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-11-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>-m<span class=\"w\"> </span>pip<span class=\"w\"> </span>install<span class=\"w\"> </span>-r<span class=\"w\"> </span>tests/requirements/py3.txt\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-11-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py -m pip install -r tests\\requirements\\py3.txt\n</code></pre></div></div></div>\n<p>Jika anda menjumpai sebuah kesalahan selama pemasangan, sistem anda mungkin kehilangan ketergantungan dari satu atau lebih paket-paket Python. Rundingkan dokumentasi paket-paket gagal atau cari Jaringan dengan pesan kesalahan yang anda jumpai.</p>\n<p>Anda dapat juga memasang pencocok basisdata dari pilihan anda menggunakan oracle.txt`, <code class=\"docutils literal notranslate\"><span class=\"pre\">mysql.txt</span></code>, atau <code class=\"docutils literal notranslate\"><span class=\"pre\">postgres.txt</span></code>.</p>\n<p>Jika anda ingin mencoba backend penyimpanan memcache, anda akan juga butuh menentukan pengaturan <a class=\"reference internal\" href=\"/id/3.0/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> yang menunjuk pada contoh memcache anda.</p>\n<p>Untuk menjalankan percobaan GeoDjango, anda akan butuh untuk <a class=\"reference internal\" href=\"/id/3.0/ref/contrib/gis/install/\"><span class=\"doc\">setup a spatial database and install the Geospatial libraries</span></a>.</p>\n<p>Masing-masing ketergantungan ini adalah pilihan. Jika anda kehilangan salah satu dari mereka, percobaan terkait akan dilewati.</p>\n<p>Untuk menjalankan beberapa percobaan dimuat otomatis, anda akan butuh memasang layanan <a class=\"reference external\" href=\"https://facebook.github.io/watchman/\">Watchman</a>.</p>\n</section>\n<section id=\"code-coverage\">\n<h3>Cakupan kode<a class=\"heading-anchor\" href=\"#code-coverage\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Pembantu mendorong menjalankan cakupan pada deretan percobaan untuk mencirikan kawasan yang butuh percobaan tambahan. Pemasangan alat cakupan dan penggunaan digambarkan dalam <a class=\"reference internal\" href=\"/id/3.0/topics/testing/advanced/#topics-testing-code-coverage\"><span class=\"std std-ref\">testing code coverage</span></a>.</p>\n<p>Cakupan harus berjalan dalam proses tunggal untuk mendapatkan statistik akurat. Untuk menjalankan cakupan pada deretan percobaan Django menggunakan pengaturan percobaan standar:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-12-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>coverage<span class=\"w\"> </span>run<span class=\"w\"> </span>./runtests.py<span class=\"w\"> </span>--settings<span class=\"o\">=</span>test_sqlite<span class=\"w\"> </span>--parallel<span class=\"o\">=</span><span class=\"m\">1</span>\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-12-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> coverage run runtests.py --settings=test_sqlite --parallel=1\n</code></pre></div></div></div>\n<p>Setelah menjalankan cakupan, bangkitkan laporan html dengan menjalankan:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-13-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>coverage<span class=\"w\"> </span>html\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-13-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> coverage html\n</code></pre></div></div></div>\n<p>Ketika menjalankan cakupan untuk percobaan Django, pengaturan <code class=\"docutils literal notranslate\"><span class=\"pre\">.coveragerc</span></code> yang disertakan menentukan <code class=\"docutils literal notranslate\"><span class=\"pre\">coverage_html</span></code> sebagai pelipat keluaran untuk laporan dan juga mengecualikan beberapa pelipat tidak terkait pada hasil (kode percobaan atau kode dikecualikan disertakan di Django).</p>\n</section>\n</section>\n<section id=\"contrib-apps\">\n<span id=\"id1\"></span><h2>Aplikasi bantuan<a class=\"heading-anchor\" href=\"#contrib-apps\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Percobaan untuk aplikasi bantuan dapat ditemukan dalam pelipat <code class=\"docutils literal notranslate\"><span class=\"pre\">tests/</span></code>, khususnya dibawah <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;app_name&gt;_tests</span></code>. Sebagai contoh, percobaan untuk <code class=\"docutils literal notranslate\"><span class=\"pre\">contrib.auth</span></code> ditempatkan dalam <code class=\"docutils literal notranslate\"><span class=\"pre\">tests/auth_tests</span></code>.</p>\n</section>\n<section id=\"troubleshooting\">\n<span id=\"troubleshooting-unit-tests\"></span><h2>Menyelesaikan masalah<a class=\"heading-anchor\" href=\"#troubleshooting\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"test-suite-hangs-or-shows-failures-on-master-branch\">\n<h3>Deretan percobaan menggantung atau menunjukkan kegagalan pada cabang <code class=\"docutils literal notranslate\"><span class=\"pre\">master</span></code><a class=\"heading-anchor\" href=\"#test-suite-hangs-or-shows-failures-on-master-branch\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Pastikan anda memiliki titik terbitan terakhir dari <a class=\"reference internal\" href=\"/id/3.0/faq/install/#faq-python-version-support\"><span class=\"std std-ref\">supported Python version</span></a>, sejak sering ada kesalahan dalam versi sebelumnya yang mungkin menyebabkan deretan percobaan gagal atau menggantung.</p>\n<p>Pada <strong>macOS</strong> (High Sierra dan versi terbaru), anda mungkin melihat pesan ini tercatat, setelah itu percobaan menggantung:</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\">objc</span><span class=\"p\">[</span><span class=\"mi\">42074</span><span class=\"p\">]:</span> <span class=\"o\">+</span><span class=\"p\">[</span><span class=\"n\">__NSPlaceholderDate</span> <span class=\"n\">initialize</span><span class=\"p\">]</span> <span class=\"n\">may</span> <span class=\"n\">have</span> <span class=\"n\">been</span> <span class=\"ow\">in</span> <span class=\"n\">progress</span> <span class=\"ow\">in</span>\n<span class=\"n\">another</span> <span class=\"n\">thread</span> <span class=\"n\">when</span> <span class=\"n\">fork</span><span class=\"p\">()</span> <span class=\"n\">was</span> <span class=\"n\">called</span><span class=\"o\">.</span>\n</code></pre></div>\n<p>Untuk menghindari kumpulan variabel lingkungan <code class=\"docutils literal notranslate\"><span class=\"pre\">OBJC_DISABLE_INITIALIZE_FORK_SAFETY</span></code> ini, sebagai contoh:</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>$ OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES ./runtests.py\n</code></pre></div>\n<p>Atau tambah <code class=\"docutils literal notranslate\"><span class=\"pre\">export</span> <span class=\"pre\">OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES</span></code> ke berkas awal shell anda (contoh <code class=\"docutils literal notranslate\"><span class=\"pre\">~/.profile</span></code>).</p>\n</section>\n<section id=\"many-test-failures-with-unicodeencodeerror\">\n<h3>Banyak percobaan gagal dengan <code class=\"docutils literal notranslate\"><span class=\"pre\">UnicodeEncodeError</span></code><a class=\"heading-anchor\" href=\"#many-test-failures-with-unicodeencodeerror\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Jika paket <code class=\"docutils literal notranslate\"><span class=\"pre\">locales</span></code> tidak terpasang, beberapa percobaan akan gagal dengan <code class=\"docutils literal notranslate\"><span class=\"pre\">UnicodeEncodeError</span></code>.</p>\n<p>Anda dapat menyelesaikan ini pada sistem berdasarkan-Debian, sebagai contoh, dengan menjalankan:</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>apt-get<span class=\"w\"> </span>install<span class=\"w\"> </span>locales\n<span class=\"gp\">$ </span>dpkg-reconfigure<span class=\"w\"> </span>locales\n</code></pre></div>\n<p>Anda dapat mengatasi ini untuk sistem macOS dengan mengkonfigurasi lokal shell anda:</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span><span class=\"nb\">export</span><span class=\"w\"> </span><span class=\"nv\">LANG</span><span class=\"o\">=</span><span class=\"s2\">&quot;en_US.UTF-8&quot;</span>\n<span class=\"gp\">$ </span><span class=\"nb\">export</span><span class=\"w\"> </span><span class=\"nv\">LC_ALL</span><span class=\"o\">=</span><span class=\"s2\">&quot;en_US.UTF-8&quot;</span>\n</code></pre></div>\n<p>Jalankan perintah <code class=\"docutils literal notranslate\"><span class=\"pre\">locale</span></code> untuk menegaskan perubahan. Pilihannya, tambah perintah ekpos tersebut pada berkas awalan shell anda (sebagai contoh <code class=\"docutils literal notranslate\"><span class=\"pre\">~/.bashrc</span></code> untuk Bash) untuk menghindari mengetik kembali mereka.</p>\n</section>\n<section id=\"tests-that-only-fail-in-combination\">\n<h3>Percobaan hanya gagal di kombinasi<a class=\"heading-anchor\" href=\"#tests-that-only-fail-in-combination\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Dalam hal sebuah percobaan lulus ketika berjalan di pemisahan tetapi gagal dalam deretan keseluruhan, kami mempunyai beberapa alat untuk membantu menganalisa masalah.</p>\n<p>Pilihan <code class=\"docutils literal notranslate\"><span class=\"pre\">--bisect</span></code> dari <code class=\"docutils literal notranslate\"><span class=\"pre\">runtests.py</span></code> akan menjalankan  percobaan kegagalan selama separuh kumpulan percobaan yang dijalankan bersama-sama pada setiap putaran, sering membuatnya memungkinkan untuk mencirikan sejumlah kecil dari percobaan yang mungkin terkait terhadap kegagalan.</p>\n<p>Sebagai contoh, misalkan bahwa percobaan gagal yang berkerja pada miliknya sendiri adalah <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelTest.test_eq</span></code>, kemudian menggunakan:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-14-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>./runtests.py<span class=\"w\"> </span>--bisect<span class=\"w\"> </span>basic.tests.ModelTest.test_eq\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-14-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> runtests.py --bisect basic.tests.ModelTest.test_eq\n</code></pre></div></div></div>\n<p>akan mencoba menentukan percobaan yang mencampuri dengan satu yang diberikan. Pertama, percobaan berjalan dengan babak pertama dari deretan percobaan. Jika kegagalan muncul, babak pertama dari deretan percobaan dipisah dalam dua kelompok dan setiap kelompok berjalan dengan percobaan yang ditentukan. Jika tidak ada kegagalan dengan babak pertama dari deretan percobaan, babak kedua dari deretan percobaan berjalan dengan percobaan yang ditentukan dan dipisah dengan benar seperti digambarkan di awal. Pengolahan berulang sampai kumpulan percobaan kegagalan kecil.</p>\n<p>Pilihan <code class=\"docutils literal notranslate\"><span class=\"pre\">--pair</span></code> menjalankan percobaan diberikan bersama setiap percobaan lain dari deretan, membiarkan anda memeriksa jika percobaan lain mempunyai pengaruh-samping yang menyebabkan kegagalan. Jadi:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-15-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>./runtests.py<span class=\"w\"> </span>--pair<span class=\"w\"> </span>basic.tests.ModelTest.test_eq\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-15-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> runtests.py --pair basic.tests.ModelTest.test_eq\n</code></pre></div></div></div>\n<p>akan memperbaiki <code class=\"docutils literal notranslate\"><span class=\"pre\">test_eq</span></code> dengan setiap label percobaan.</p>\n<p>Dengan kedua <code class=\"docutils literal notranslate\"><span class=\"pre\">--bisect</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">--pair</span></code>, jika anda sudah menduga kasus mana yang mungkin bertanggung jawab terhadap kegagalan, anda mungkin membatasi percobaan pada analisa-silang dengan <a class=\"reference internal\" href=\"#runtests-specifying-labels\"><span class=\"std std-ref\">specifying further test labels</span></a> setelah yang pertama:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-16-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>./runtests.py<span class=\"w\"> </span>--pair<span class=\"w\"> </span>basic.tests.ModelTest.test_eq<span class=\"w\"> </span>queries<span class=\"w\"> </span>transactions\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-16-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> runtests.py --pair basic.tests.ModelTest.test_eq queries transactions\n</code></pre></div></div></div>\n<p>Anda dapat juga mencoba menjalankan kumpulan percobaan di kebalikan menggunakan pilihan <code class=\"docutils literal notranslate\"><span class=\"pre\">--reverse</span></code> agar mengecek bahwa penjalanan percobaan dalam urutan berbeda tidak menyebabkan masalah apapun:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-17-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>./runtests.py<span class=\"w\"> </span>basic<span class=\"w\"> </span>--reverse\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-17-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> runtests.py basic --reverse\n</code></pre></div></div></div>\n</section>\n<section id=\"seeing-the-sql-queries-run-during-a-test\">\n<h3>Melihat permintaan SQL berjalan selama percobaan<a class=\"heading-anchor\" href=\"#seeing-the-sql-queries-run-during-a-test\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Jika anda berharap menguji SQL yang sedang berjalan dalam kegagalan percobaan, anda dapat menyalakan <a class=\"reference internal\" href=\"/id/3.0/topics/logging/#django-db-logger\"><span class=\"std std-ref\">SQL logging</span></a> menggunakan pilihan <code class=\"docutils literal notranslate\"><span class=\"pre\">--debug-sql</span></code>. Jika anda menggabungkan ini dengan <code class=\"docutils literal notranslate\"><span class=\"pre\">--verbosity=2</span></code>, semua permintaan SQL akan mengeluarkan:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-18-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>./runtests.py<span class=\"w\"> </span>basic<span class=\"w\"> </span>--debug-sql\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-18-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> runtests.py basic --debug-sql\n</code></pre></div></div></div>\n</section>\n<section id=\"seeing-the-full-traceback-of-a-test-failure\">\n<h3>Melihat melacak kembali penuh dari kegagalan percobaan<a class=\"heading-anchor\" href=\"#seeing-the-full-traceback-of-a-test-failure\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Secara awalan percobaan berjalan paralel dengan satu proses per inti. Ketika percobaan berjalan secara paralel, anda hanya akan melihat potongan melacak belakang untuk kegagalan percobaan apapun. Anda dapat menyesuaikan perilaku ini dengan pilihan <code class=\"docutils literal notranslate\"><span class=\"pre\">--parallel</span></code>:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-19-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>./runtests.py<span class=\"w\"> </span>basic<span class=\"w\"> </span>--parallel<span class=\"o\">=</span><span class=\"m\">1</span>\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-19-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> runtests.py basic --parallel=1\n</code></pre></div></div></div>\n<p>Anda dapat juga menggunakan variabel lingkungan <code class=\"docutils literal notranslate\"><span class=\"pre\">DJANGO_TEST_PROCESSES</span></code> untuk tujuan ini.</p>\n</section>\n</section>\n<section id=\"tips-for-writing-tests\">\n<h2>Tip untuk menulis percobaan<a class=\"heading-anchor\" href=\"#tips-for-writing-tests\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"isolating-model-registration\">\n<h3>Mengasingkan pendaftaran model<a class=\"heading-anchor\" href=\"#isolating-model-registration\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Untuk menghindari registrar <a class=\"reference internal\" href=\"/id/3.0/ref/applications/#django.apps.apps\" title=\"django.apps.apps\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">apps</span></code></a> global dan mencegah pembuatan tabel tidak diperlukan, model ditentukan dalam cara percobaan harus diikat ke instance <code class=\"docutils literal notranslate\"><span class=\"pre\">Apps</span></code> sementara:</p>\n<div class=\"code-block\" data-language=\"python\"><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.apps.registry</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Apps</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.test</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">SimpleTestCase</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">TestModelDefinition</span><span class=\"p\">(</span><span class=\"n\">SimpleTestCase</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_model_definition</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">test_apps</span> <span class=\"o\">=</span> <span class=\"n\">Apps</span><span class=\"p\">([</span><span class=\"s1\">&#39;app_label&#39;</span><span class=\"p\">])</span>\n\n        <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">TestModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n            <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n                <span class=\"n\">apps</span> <span class=\"o\">=</span> <span class=\"n\">test_apps</span>\n        <span class=\"o\">...</span>\n</code></pre></div>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.test.utils.isolate_apps\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.test.utils.</span></span><span class=\"sig-name descname\"><span class=\"pre\">isolate_apps</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\">app_labels</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">attr_name</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\">kwarg_name</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.isolate_apps\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Sejak corak ini melibatkan banyak boilerplate, Django menyediakan penghias <a class=\"reference internal\" href=\"#django.test.utils.isolate_apps\" title=\"django.test.utils.isolate_apps\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">isolate_apps()</span></code></a>. Itu digunakan seperti ini:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.test</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">SimpleTestCase</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.test.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">isolate_apps</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">TestModelDefinition</span><span class=\"p\">(</span><span class=\"n\">SimpleTestCase</span><span class=\"p\">):</span>\n    <span class=\"nd\">@isolate_apps</span><span class=\"p\">(</span><span class=\"s1\">&#39;app_label&#39;</span><span class=\"p\">)</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_model_definition</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">TestModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n            <span class=\"k\">pass</span>\n        <span class=\"o\">...</span>\n</code></pre></div>\n<aside class=\"admonition-setting-app-label admonition\">\n<p class=\"admonition-title\">Mengatur <code class=\"docutils literal notranslate\"><span class=\"pre\">app_label</span></code></p>\n<p>Model ditentukan dalam cara percobaan dengan tidak eksplisit <a class=\"reference internal\" href=\"/id/3.0/ref/models/options/#django.db.models.Options.app_label\" title=\"django.db.models.Options.app_label\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">app_label</span></code></a> secara otomatis diberikan label dari aplikasi dimana kelas percobaan mereka ditempatkan.</p>\n<p>Untuk memastikan model ditentukan dalam konteks instance <a class=\"reference internal\" href=\"#django.test.utils.isolate_apps\" title=\"django.test.utils.isolate_apps\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">isolate_apps()</span></code></a> dengan benar dipasang, anda harus lolos kumpulan <code class=\"docutils literal notranslate\"><span class=\"pre\">app_label</span></code> ditargetkan sebagai argumen:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">tests/app_label/tests.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.test</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">SimpleTestCase</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.test.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">isolate_apps</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">TestModelDefinition</span><span class=\"p\">(</span><span class=\"n\">SimpleTestCase</span><span class=\"p\">):</span>\n    <span class=\"nd\">@isolate_apps</span><span class=\"p\">(</span><span class=\"s1\">&#39;app_label&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;other_app_label&#39;</span><span class=\"p\">)</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_model_definition</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"c1\"># This model automatically receives app_label=&#39;app_label&#39;</span>\n        <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">TestModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n            <span class=\"k\">pass</span>\n\n        <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">OtherAppModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n            <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n                <span class=\"n\">app_label</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;other_app_label&#39;</span>\n        <span class=\"o\">...</span>\n</code></pre></figure>\n</aside>\n<p>Penghias dapat juga diberlakukan ke kelas-kelas:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.test</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">SimpleTestCase</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.test.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">isolate_apps</span>\n\n<span class=\"nd\">@isolate_apps</span><span class=\"p\">(</span><span class=\"s1\">&#39;app_label&#39;</span><span class=\"p\">)</span>\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">TestModelDefinition</span><span class=\"p\">(</span><span class=\"n\">SimpleTestCase</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_model_definition</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">TestModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n            <span class=\"k\">pass</span>\n        <span class=\"o\">...</span>\n</code></pre></div>\n<p>Instance <code class=\"docutils literal notranslate\"><span class=\"pre\">Apps</span></code> sementara digunakan untuk mengasingkan pendaftaran model dapat ditarik sebagai sebuah atribut ketika digunakan sebagai kelas penghias dengan menggunakan parameter <code class=\"docutils literal notranslate\"><span class=\"pre\">attr_name</span></code>:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.test</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">SimpleTestCase</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.test.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">isolate_apps</span>\n\n<span class=\"nd\">@isolate_apps</span><span class=\"p\">(</span><span class=\"s1\">&#39;app_label&#39;</span><span class=\"p\">,</span> <span class=\"n\">attr_name</span><span class=\"o\">=</span><span class=\"s1\">&#39;apps&#39;</span><span class=\"p\">)</span>\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">TestModelDefinition</span><span class=\"p\">(</span><span class=\"n\">SimpleTestCase</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_model_definition</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">TestModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n            <span class=\"k\">pass</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assertIs</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">apps</span><span class=\"o\">.</span><span class=\"n\">get_model</span><span class=\"p\">(</span><span class=\"s1\">&#39;app_label&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;TestModel&#39;</span><span class=\"p\">),</span> <span class=\"n\">TestModel</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Atau sebagai sebuah argumen pada cara percobaan ketika digunakan sebagai cara penghias dengan menggunakan parameter <code class=\"docutils literal notranslate\"><span class=\"pre\">kwarg_name</span></code>:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.test</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">SimpleTestCase</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.test.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">isolate_apps</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">TestModelDefinition</span><span class=\"p\">(</span><span class=\"n\">SimpleTestCase</span><span class=\"p\">):</span>\n    <span class=\"nd\">@isolate_apps</span><span class=\"p\">(</span><span class=\"s1\">&#39;app_label&#39;</span><span class=\"p\">,</span> <span class=\"n\">kwarg_name</span><span class=\"o\">=</span><span class=\"s1\">&#39;apps&#39;</span><span class=\"p\">)</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_model_definition</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">apps</span><span class=\"p\">):</span>\n        <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">TestModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n            <span class=\"k\">pass</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assertIs</span><span class=\"p\">(</span><span class=\"n\">apps</span><span class=\"o\">.</span><span class=\"n\">get_model</span><span class=\"p\">(</span><span class=\"s1\">&#39;app_label&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;TestModel&#39;</span><span class=\"p\">),</span> <span class=\"n\">TestModel</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n</section>","rootId":"unit-tests","toc":[{"title":"Menjalankan satuan percobaan","anchor":"running-the-unit-tests","children":[{"title":"Mulai cepat","anchor":"quickstart","children":[]},{"title":"Menjalankan percobaan menggunakan tox","anchor":"running-tests-using-tox","children":[{"title":"Mencoba versi Python lain dan backend basisdata","anchor":"testing-other-python-versions-and-database-backends","children":[]},{"title":"Menjalankan percobaan JavaScript","anchor":"running-the-javascript-tests","children":[]}]},{"title":"Menjalankan percobaan menggunakan django-docker-box","anchor":"running-tests-using-django-docker-box","children":[]},{"title":"Gunakan modul pengaturan lain","anchor":"using-another-settings-module","children":[]},{"title":"Menjalankan hanya beberapa untuk percobaan","anchor":"running-only-some-of-the-tests","children":[]},{"title":"Menjalankan percobaan Selenium","anchor":"running-the-selenium-tests","children":[]},{"title":"Menjalankan semua percobaan","anchor":"running-all-the-tests","children":[]},{"title":"Cakupan kode","anchor":"code-coverage","children":[]}]},{"title":"Aplikasi bantuan","anchor":"contrib-apps","children":[]},{"title":"Menyelesaikan masalah","anchor":"troubleshooting","children":[{"title":"Deretan percobaan menggantung atau menunjukkan kegagalan pada cabang master","anchor":"test-suite-hangs-or-shows-failures-on-master-branch","children":[]},{"title":"Banyak percobaan gagal dengan UnicodeEncodeError","anchor":"many-test-failures-with-unicodeencodeerror","children":[]},{"title":"Percobaan hanya gagal di kombinasi","anchor":"tests-that-only-fail-in-combination","children":[]},{"title":"Melihat permintaan SQL berjalan selama percobaan","anchor":"seeing-the-sql-queries-run-during-a-test","children":[]},{"title":"Melihat melacak kembali penuh dari kegagalan percobaan","anchor":"seeing-the-full-traceback-of-a-test-failure","children":[]}]},{"title":"Tip untuk menulis percobaan","anchor":"tips-for-writing-tests","children":[{"title":"Mengasingkan pendaftaran model","anchor":"isolating-model-registration","children":[]}]}],"breadcrumbs":[{"docname":"internals/index","title":"Dalam Django","url":"/id/3.0/internals/"},{"docname":"internals/contributing/index","title":"Membantu untuk Django","url":"/id/3.0/internals/contributing/"},{"docname":"internals/contributing/writing-code/index","title":"Penulisan kode","url":"/id/3.0/internals/contributing/writing-code/"}],"prev":{"docname":"internals/contributing/writing-code/coding-style","title":"Gaya pengkodean","url":"/id/3.0/internals/contributing/writing-code/coding-style/"},"next":{"docname":"internals/contributing/writing-code/submitting-patches","title":"Mengajukan tambalan","url":"/id/3.0/internals/contributing/writing-code/submitting-patches/"},"formats":{"html":"/id/3.0/internals/contributing/writing-code/unit-tests/","markdown":"/id/3.0/internals/contributing/writing-code/unit-tests.md","json":"/id/3.0/internals/contributing/writing-code/unit-tests.json"},"source":"https://github.com/django/django/blob/stable/3.0.x/docs/internals/contributing/writing-code/unit-tests.txt","official":"https://docs.djangoproject.com/id/3.0/internals/contributing/writing-code/unit-tests/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}