Satuan percobaanLink to this heading

Django datang dengan deretan percobaan dia sendiri, di pelipat tests dari kode dasar. Itu kebijakan kami untuk memastikan semua percobaan selalu lolos.

Kami menghargai apapun dan semua bantuan pada deretan percobaan!

Percobaan Django semua menggunakan infrastruktur percobaan yang dikirim dengan Django untuk aplikasi percobaan. Lihat Menulis dan menjalankan percobaan untuk sebuah penjelasan bagaimana menulis percobaan baru.

Menjalankan satuan percobaanLink to this heading

Mulai cepatLink to this heading

Pertama, fork Django on GitHub.

Kedua, buat dan aktifkan lingkungan maya. Jika anda tidak akrab dengan bagaimana melakukan itu, baca contributing tutorial kami.

Selanjutnya, kloning cabang anda, pasang beberapa persyaratan, dan jalankan percobaan:

Linux / macOS

Shell
$ git clone https://github.com/YourGitHubName/django.git django-repo
$ cd django-repo/tests
$ python -m pip install -e ..
$ python -m pip install -r requirements/py3.txt
$ ./runtests.py

Windows

Windows
...\> git clone https://github.com/YourGitHubName/django.git django-repo
...\> cd django-repo\tests
...\> py -m pip install -e ..
...\> py -m pip install -r requirements\py3.txt
...\> runtests.py 

Installing the requirements will likely require some operating system packages that your computer doesn't have installed. You can usually figure out which package to install by doing a web search for the last line or so of the error message. Try adding your operating system to the search query if needed.

Jika anda mempunyai masalah memasang persyaratan, anda dapat melewatkan langkah itu. Lihat Menjalankan semua percobaan untuk rincian pada memasang pilihan percobaan ketergantungan. Jika anda tidak mempunyai pilihan ketergantungan terpasang, percobaan yang membutuhkan itu akan dilewatkan.

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 Gunakan modul pengaturan lain untuk mempelajari bagaimana menggunakan modul pengaturan berbeda untuk menjalankan percobaan dengan basisdata berbeda.

Mempunyai masalah? Lihat Menyelesaikan masalah untuk beberapa masalah umum.

Menjalankan percobaan menggunakan toxLink to this heading

Tox is a tool for running tests in different virtual environments. Django includes a basic tox.ini that automates some checks that our build server performs on pull requests. To run the unit tests and other checks (such as import sorting, the documentation spelling checker, and code formatting), install and run the tox command from any place in the Django source tree:

Linux / macOS

Shell
$ python -m pip install tox
$ tox

Windows

Windows
...\> py -m pip install tox
...\> tox

By default, tox runs the test suite with the bundled test settings file for SQLite, black, blacken-docs, flake8, isort, zizmor, and the documentation spelling checker. In addition to the system dependencies noted elsewhere in this documentation, the command python3 must be on your path and linked to the appropriate version of Python. A list of default environments can be seen as follows:

Linux / macOS

Shell
$ tox -l
py3
black
blacken-docs
flake8>=3.7.0
docs
isort>=7.0.0
zizmor>=1.16.3

Windows

Windows
...\> tox -l
py3
black
blacken-docs
flake8>=3.7.0
docs
isort>=7.0.0
zizmor>=1.16.3

Mencoba versi Python lain dan backend basisdataLink to this heading

In addition to the default environments, tox supports running unit tests for other versions of Python and other database backends. Since Django's test suite doesn't bundle a settings file for database backends other than SQLite, however, you must create and provide your own test settings. For example, to run the tests on Python 3.10 using PostgreSQL:

Linux / macOS

Shell
$ tox -e py310-postgres -- --settings=my_postgres_settings

Windows

Windows
...\> tox -e py310-postgres -- --settings=my_postgres_settings

This command sets up a Python 3.10 virtual environment, installs Django's test suite dependencies (including those for PostgreSQL), and calls runtests.py with the supplied arguments (in this case, --settings=my_postgres_settings).

Sisa dari dokumentasi ini menunjukkan perintah untuk menjalankan percobaan tanpa tox, bagaimanapun, pilihan apapun dilewatkan ke runtests.py dapat juga dilewatkan ke tox dengan menaruh di awalan daftar argumen dengan --, seperti diatas.

Tox also respects the DJANGO_SETTINGS_MODULE environment variable, if set. For example, the following is equivalent to the command above:

Shell
$ DJANGO_SETTINGS_MODULE=my_postgres_settings tox -e py310-postgres

Pengguna Windows harus menggunakan:

Windows
...\> set DJANGO_SETTINGS_MODULE=my_postgres_settings
...\> tox -e py310-postgres

Menjalankan percobaan JavaScriptLink to this heading

Django includes a set of JavaScript unit tests for functions in certain contrib apps. The JavaScript tests aren't run by default using tox because they require Node.js to be installed and aren't necessary for the majority of patches. To run the JavaScript tests using tox:

Linux / macOS

Shell
$ tox -e javascript

Windows

Windows
...\> tox -e javascript

Perintah ini menjalankan npm install untuk memastikan persyaratan percobaan terperbaharui dan kemudian menjalankan npm test.

Menjalankan percobaan menggunakan django-docker-boxLink to this heading

django-docker-box mengizinkan anda menjalankan deretan percobaan terhadap semua basisdata yang didukung dan versi python. Lihat halaman proyek django-docker-box untuk pemasangan dan petunjuk penggunaan.

Gunakan modul pengaturan lainLink to this heading

The included settings module (tests/test_sqlite.py) allows you to run the test suite using SQLite. If you want to run the tests using a different database, you'll need to define your own settings file. Some tests, such as those for contrib.postgres, are specific to a particular database backend and will be skipped if run with a different backend. Some tests are skipped or expected failures on a particular database backend (see DatabaseFeatures.django_test_skips and DatabaseFeatures.django_test_expected_failures on each backend).

To run the tests with different settings, ensure that the module is on your PYTHONPATH and pass the module with --settings.

Pengaturan DATABASES dalam modul pengaturan percobaan apapun butuh menentukan dua basisdata:

  • Basisdata default. Basisdata ini harus menggunakan backend yang anda ingin menggunakan untuk percobaan utama.

  • Sebuah basisdata dengan nama lain other. Basisdata other digunakan untuk mencoba permintaan itu dapat dialihkan ke basisdata berbeda. Basisdata ini harus menggunakan backend sama seperti default, dan itu harus mempunyai nama berbeda.

Jika anda menggunakan backend yang bukan SQLite, anda akan butuh menyediakan rincian lain untuk setiap basisdata:

  • Pilihan USER butuh menentukan akun pengguna yang ada ntuk basisdata. Bahwa pengguna butuh perizinan untuk menjalankan CREATE DATABASE sehingga basisdata percobaan dapat dibuat.

  • Pilihan PASSWORD butuh disediakan sandi untuk the USER yang telah ditentukan.

Basisdata percobaan mendapatkan nama-nama mereka dengan mengawali test_ pada nilai dari pengaturan NAME untuk basisdata ditentukan di DATABASES. Basisdata percobaan ini dihapus ketika percobaan selesai.

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 CHARSET di kamus pengaturan untuk basisdata yang berlaku.

Menjalankan hanya beberapa untuk percobaanLink to this heading

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 runtests.py di baris perintah.

Sebagai contoh, jika anda ingin menjalankan percobaan hanya untuk hubugnan umum dan internasionalisasi, ketik:

Linux / macOS

Shell
$ ./runtests.py --settings=path.to.settings generic_relations i18n

Windows

Windows
...\> runtests.py --settings=path.to.settings generic_relations i18n

Bagaimana anda menemukan nama-nama dari percobaan perorangan? Lihat di tests/ — setiap nama pelipat ada nama dari percobaan.

Jika anda hanya ingin menjalankan hanya kelas tertentu dari percobaan, anda dapat menentukan daftar jalur pada masing-masing kelas percobaan. Sebgai contoh, untuk menjalankan TranslationTests dari modul i18n, ketik:

Linux / macOS

Shell
$ ./runtests.py --settings=path.to.settings i18n.tests.TranslationTests

Windows

Windows
...\> runtests.py --settings=path.to.settings i18n.tests.TranslationTests

Melampaui itu, anda dapat menentukan metode percobaan sendiri seperti ini:

Linux / macOS

Shell
$ ./runtests.py --settings=path.to.settings i18n.tests.TranslationTests.test_lazy_objects

Windows

Windows
...\> runtests.py --settings=path.to.settings i18n.tests.TranslationTests.test_lazy_objects

Anda dapat menjalankan percobaan dimulai pada menentukan modul tingkat-atas dengan pilihan --start-at. Sebagai contoh:

Linux / macOS

Shell
$ ./runtests.py --start-at=wsgi

Windows

Windows
...\> runtests.py --start-at=wsgi

Anda dapat juga menjalankan percobaan dimulai setelah modul tingkat-atas ditentukan dengan pilihan --start-after. Sebagai contoh:

Linux / macOS

Shell
$ ./runtests.py --start-after=wsgi

Windows

Windows
...\> runtests.py --start-after=wsgi

Catat bahwa pilihan --reverse tidak berpengaruh pada pilihan --start-at atau --start-after. Bahkan pilihan ini tidak dapat digunakan dengan label percobaan.

Menjalankan percobaan SeleniumLink to this heading

Some tests require Selenium and a web browser. To run these tests, you must install the selenium package and run the tests with the --selenium=<BROWSERS> option. For example, if you have Firefox and Google Chrome installed:

Linux / macOS

Shell
$ ./runtests.py --selenium=firefox,chrome

Windows

Windows
...\> runtests.py --selenium=firefox,chrome

Lihat paket selenium.webdriver untuk daftar perambah tersedia.

Menentukan --selenium otomatis menyetel --tags=selenium untuk berjalan hanya percobaan yang membutuhkan selenium.

Beberapa peramban (yaitu Chrome atau Firefox) mendukung percobaan tanpa kepala, yang dapat lebih cepat dan lebih stabil. Tambah pilihan --headless untuk mengaktifkan suasana ini.

Screenshot testsLink to this heading

For testing changes to the admin UI, the selenium tests can be run with the --screenshots option enabled. Screenshots will be saved to the tests/screenshots/ directory.

To define when screenshots should be taken during a selenium test, the test class must use the @django.test.selenium.screenshot_cases decorator with a list of supported screenshot types ("desktop_size", "mobile_size", "small_screen_size", "rtl", "dark", and "high_contrast"). It can then call self.take_screenshot("unique-screenshot-name") at the desired point to generate the screenshots. For example:

Code
from django.test.selenium import SeleniumTestCase, screenshot_cases
from django.urls import reverse


class SeleniumTests(SeleniumTestCase):
    @screenshot_cases(["desktop_size", "mobile_size", "rtl", "dark", "high_contrast"])
    def test_login_button_centered(self):
        self.selenium.get(self.live_server_url + reverse("admin:login"))
        self.take_screenshot("login")
        ...

This generates multiple screenshots of the login page - one for a desktop screen, one for a mobile screen, one for right-to-left languages on desktop, one for the dark mode on desktop, and one for high contrast mode on desktop when using chrome.

Menjalankan semua percobaanLink to this heading

Jika anda ingin menjalankan deretan lengkap dari percobaan, anda akan butuh memasang sejumlah ketergantungan:

You can find these dependencies in pip requirements files inside the tests/requirements directory of the Django source tree and install them like so:

Linux / macOS

Shell
$ python -m pip install -r tests/requirements/py3.txt

Windows

Windows
...\> py -m pip install -r tests\requirements\py3.txt

Jika anda mengalami sebuah kesalahan selama pemasangan, sisem anda mungkin kehilangan ketergantungan untuk satu atau lebih paket Python. Obrolkan dokumentasi paket yang gagal atau cari di jaringan dengan pesan kesalahan yang anda alami.

Anda dapat juga memasang pencocok basisdata dari pilihan anda menggunakan oracle.txt`, mysql.txt, atau postgres.txt.

If you want to test the memcached or Redis cache backends, you'll also need to define a CACHES setting that points at your memcached or Redis instance respectively.

To run the GeoDjango tests, you will need to set up a spatial database and install the Geospatial libraries.

Masing-masing ketergantungan ini adalah pilihan. Jika anda kehilangan salah satu dari mereka, percobaan terkait akan dilewati.

To run some of the autoreload tests, you'll need to install the Watchman service.

Cakupan kodeLink to this heading

Pembantu mendorong menjalankan cakupan pada deretan percobaan untuk mencirikan kawasan yang butuh percobaan tambahan. Pemasangan alat cakupan dan penggunaan digambarkan dalam testing code coverage.

To run coverage on the Django test suite using the standard test settings:

Linux / macOS

Shell
$ coverage run ./runtests.py --settings=test_sqlite

Windows

Windows
...\> coverage run runtests.py --settings=test_sqlite

After running coverage, combine all coverage statistics by running:

Linux / macOS

Shell
$ coverage combine

Windows

Windows
...\> coverage combine

After that generate the html report by running:

Linux / macOS

Shell
$ coverage html

Windows

Windows
...\> coverage html

Ketika menjalankan cakupan untuk percobaan Django, pengaturan .coveragerc yang disertakan menentukan coverage_html sebagai pelipat keluaran untuk laporan dan juga mengecualikan beberapa pelipat tidak terkait pada hasil (kode percobaan atau kode dikecualikan disertakan di Django).

Aplikasi bantuanLink to this heading

Tests for contrib apps can be found in the tests/ directory, typically under <app_name>_tests. For example, tests for contrib.auth are located in tests/auth_tests.

Menyelesaikan masalahLink to this heading

Test suite hangs or shows failures on main branchLink to this heading

Pastikan anda memiliki titik terbitan terakhir dari supported Python version, sejak sering ada kesalahan dalam versi sebelumnya yang mungkin menyebabkan deretan percobaan gagal atau menggantung.

On macOS (High Sierra and newer versions), you might see this message logged, after which the tests hang:

Pytb
objc[42074]: +[__NSPlaceholderDate initialize] may have been in progress in
another thread when fork() was called.

Untuk menghindari ini setel variabel lingkungan OBJC_DISABLE_INITIALIZE_FORK_SAFETY, sebagai contoh:

Shell
$ OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES ./runtests.py

Atau tambah export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES ke berkas awal shell anda (contoh ~/.profile).

Banyak percobaan gagal dengan UnicodeEncodeErrorLink to this heading

Jika paket locales tidak terpasang, beberapa percobaan akan gagal dengan UnicodeEncodeError.

Anda dapat menyelesaikan ini pada sistem berdasarkan-Debian, sebagai contoh, dengan menjalankan:

Shell
$ apt-get install locales
$ dpkg-reconfigure locales

Anda dapat mengatasi ini untuk sistem macOS dengan mengkonfigurasi lokal shell anda:

Shell
$ export LANG="en_US.UTF-8"
$ export LC_ALL="en_US.UTF-8"

Jalankan perintah locale untuk menegaskan perubahan. Pilihannya, tambah perintah ekpos tersebut pada berkas awalan shell anda (sebagai contoh ~/.bashrc untuk Bash) untuk menghindari mengetik kembali mereka.

Percobaan hanya gagal di kombinasiLink to this heading

Dalam hal sebuah percobaan lulus ketika berjalan di pemisahan tetapi gagal dalam deretan keseluruhan, kami mempunyai beberapa alat untuk membantu menganalisa masalah.

Pilihan --bisect dari runtests.py 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.

Sebagai contoh, misalkan bahwa percobaan gagal yang berkerja pada miliknya sendiri adalah ModelTest.test_eq, kemudian menggunakan:

Linux / macOS

Shell
$ ./runtests.py --bisect basic.tests.ModelTest.test_eq

Windows

Windows
...\> runtests.py --bisect basic.tests.ModelTest.test_eq

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.

Pilihan --pair menjalankan percobaan diberikan bersama setiap percobaan lain dari deretan, membiarkan anda memeriksa jika percobaan lain mempunyai pengaruh-samping yang menyebabkan kegagalan. Jadi:

Linux / macOS

Shell
$ ./runtests.py --pair basic.tests.ModelTest.test_eq

Windows

Windows
...\> runtests.py --pair basic.tests.ModelTest.test_eq

akan memperbaiki test_eq dengan setiap label percobaan.

Dengan kedua --bisect dan --pair, jika anda sudah menduga kasus mana yang mungkin bertanggung jawab terhadap kegagalan, anda mungkin membatasi percobaan pada analisa-silang dengan specifying further test labels setelah yang pertama:

Linux / macOS

Shell
$ ./runtests.py --pair basic.tests.ModelTest.test_eq queries transactions

Windows

Windows
...\> runtests.py --pair basic.tests.ModelTest.test_eq queries transactions

You can also try running any set of tests in a random or reverse order using the --shuffle and --reverse options. This can help verify that executing tests in a different order does not cause any trouble:

Linux / macOS

Shell
$ ./runtests.py basic --shuffle
$ ./runtests.py basic --reverse

Windows

Windows
...\> runtests.py basic --shuffle
...\> runtests.py basic --reverse

Melihat permintaan SQL berjalan selama percobaanLink to this heading

Jika anda berharap menguji SQL yang sedang berjalan dalam kegagalan percobaan, anda dapat menyalakan SQL logging menggunakan pilihan --debug-sql. Jika anda menggabungkan ini dengan --verbosity=2, semua permintaan SQL akan mengeluarkan:

Linux / macOS

Shell
$ ./runtests.py basic --debug-sql

Windows

Windows
...\> runtests.py basic --debug-sql

Melihat melacak kembali penuh dari kegagalan percobaanLink to this heading

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 --parallel:

Linux / macOS

Shell
$ ./runtests.py basic --parallel=1

Windows

Windows
...\> runtests.py basic --parallel=1

Anda dapat menggunakan lingkungan variabel DJANGO_TEST_PROCESSES untuk tujuan ini.

Tip untuk menulis percobaanLink to this heading

Mengasingkan pendaftaran modelLink to this heading

To avoid polluting the global apps registry and prevent unnecessary table creation, models defined in a test method should be bound to a temporary Apps instance. To do this, use the isolate_apps() decorator:

Code
from django.db import models
from django.test import SimpleTestCase
from django.test.utils import isolate_apps


class TestModelDefinition(SimpleTestCase):
    @isolate_apps("app_label")
    def test_model_definition(self):
        class TestModel(models.Model):
            pass

        ...