


Mengendalikan Model Tidak Terurus dalam Pytest-Django
Cabaran Menguji Model Tidak Terurus
Dalam projek Django, kadangkala kami menemui model yang tidak terurus—model yang tidak terurus = Benar dalam pilihan meta mereka. Model ini boleh menyukarkan ujian, terutamanya apabila persediaan ujian anda melibatkan gabungan model terurus dan tidak terurus atau berbilang pangkalan data (mis., satu dengan model terurus dan satu lagi dengan model tidak terurus).
Siaran blog ini meneroka pendekatan untuk menguji model tidak terurus dengan pytest-django, menyerlahkan kebaikan, keburukan dan penyelesaian untuk membantu anda mengurus senario ini dengan berkesan.
Pendekatan 1: Tandakan Semua Model sebagai Terurus
Satu cara mudah untuk mengendalikan model yang tidak terurus semasa ujian adalah dengan menandai model tersebut sebagai terurus buat sementara waktu. Begini cara anda boleh melakukannya:
# Add this to conftest.py @pytest.hookimpl(tryfirst=True) def pytest_runtestloop(): from django.apps import apps unmanaged_models = [] for app in apps.get_app_configs(): unmanaged_models += [m for m in app.get_models() if not m._meta.managed] for m in unmanaged_models: m._meta.managed = True
Nota: Agar pendekatan ini berfungsi, anda perlu menambah pilihan --no-migrations pada tetapan pytest anda (atau pytest.ini)
Rujukan: Limpahan Tindanan
Kebaikan:
- Mudah untuk dilaksanakan.
Keburukan:
- Melangkau ujian migrasi, yang boleh menyebabkan masalah apabila berbilang pembangun sedang mengusahakan projek yang sama.
Pendekatan 2: Cipta Model Tidak Terurus Secara Manual
Sebagai alternatif, anda boleh membuat model tidak terurus secara manual semasa persediaan ujian. Pendekatan ini memastikan bahawa migrasi diuji:
@pytest.fixture(scope="session", autouse=True) def django_db_setup(django_db_blocker, django_db_setup): with django_db_blocker.unblock(): for _connection in connections.all(): with _connection.schema_editor() as schema_editor: setup_unmanaged_models(_connection, schema_editor) yield def setup_unmanaged_models(connection, schema_editor): from django.apps import apps unmanaged_models = [ model for model in apps.get_models() if model._meta.managed is False ] for model in unmanaged_models: if model._meta.db_table in connection.introspection.table_names(): schema_editor.delete_model(model) schema_editor.create_model(model)
Kebaikan:
- Menguji migrasi sebagai sebahagian daripada kes ujian anda.
Keburukan:
- Sedikit lebih kompleks.
- transaksi=True tidak berfungsi dengan pendekatan ini (dibincangkan dalam bahagian seterusnya).
Memahami Ujian Transaksional
Pytest-django menyediakan lekapan pangkalan data: django_db dan django_db(transaction=True). Begini perbezaannya:
django_db: Menggulung semula perubahan pada penghujung kes ujian, bermakna tiada komitmen sebenar dibuat pada pangkalan data.
django_db(transaction=True): Melakukan perubahan dan memotong jadual pangkalan data selepas setiap kes ujian. Memandangkan hanya model terurus dipotong selepas setiap ujian, inilah sebabnya model tidak terurus memerlukan pengendalian khas semasa ujian transaksi.
Contoh Kes Ujian
@pytest.mark.django_db def test_example(): # Test case logic here pass @pytest.mark.django_db(transaction=True) def test_transactional_example(): # Test case logic here pass
Membuat Ujian Transaksi Berfungsi dengan Model Tidak Terurus
Memandangkan ujian transaksi hanya memotong model terurus, kami boleh mengubah suai model yang tidak terurus untuk diurus semasa ujian dijalankan. Ini memastikan ia termasuk dalam pemangkasan:
# Add this to conftest.py @pytest.hookimpl(tryfirst=True) def pytest_runtestloop(): from django.apps import apps unmanaged_models = [] for app in apps.get_app_configs(): unmanaged_models += [m for m in app.get_models() if not m._meta.managed] for m in unmanaged_models: m._meta.managed = True
Mengelakkan transaksi=Benar dengan on_commit Hooks (jika boleh)
Dalam senario yang melibatkan cangkuk on_commit, anda boleh mengelak daripada menggunakan ujian transaksi dengan menangkap dan melaksanakan panggilan balik on_commit secara langsung, menggunakan lekapan django_capture_on_commit_callbacks daripada pytest-django(>= v.4.4):
@pytest.fixture(scope="session", autouse=True) def django_db_setup(django_db_blocker, django_db_setup): with django_db_blocker.unblock(): for _connection in connections.all(): with _connection.schema_editor() as schema_editor: setup_unmanaged_models(_connection, schema_editor) yield def setup_unmanaged_models(connection, schema_editor): from django.apps import apps unmanaged_models = [ model for model in apps.get_models() if model._meta.managed is False ] for model in unmanaged_models: if model._meta.db_table in connection.introspection.table_names(): schema_editor.delete_model(model) schema_editor.create_model(model)
Rujukan
- Dokumentasi pytest-django
- Limpahan Tindanan: Menguji Model Tidak Terurus
Adakah anda mempunyai pendekatan atau petua lain untuk mengendalikan model yang tidak terurus? Kongsi mereka dalam komen di bawah!
Atas ialah kandungan terperinci Mengendalikan Model Tidak Terurus dalam Pytest-Django. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas











Python sesuai untuk sains data, pembangunan web dan tugas automasi, manakala C sesuai untuk pengaturcaraan sistem, pembangunan permainan dan sistem tertanam. Python terkenal dengan kesederhanaan dan ekosistem yang kuat, manakala C dikenali dengan keupayaan kawalan dan keupayaan kawalan yang mendasari.

Anda boleh mempelajari konsep pengaturcaraan asas dan kemahiran Python dalam masa 2 jam. 1. Belajar Pembolehubah dan Jenis Data, 2.

Python cemerlang dalam permainan dan pembangunan GUI. 1) Pembangunan permainan menggunakan pygame, menyediakan lukisan, audio dan fungsi lain, yang sesuai untuk membuat permainan 2D. 2) Pembangunan GUI boleh memilih tkinter atau pyqt. TKInter adalah mudah dan mudah digunakan, PYQT mempunyai fungsi yang kaya dan sesuai untuk pembangunan profesional.

Anda boleh mempelajari asas -asas Python dalam masa dua jam. 1. Belajar pembolehubah dan jenis data, 2. Struktur kawalan induk seperti jika pernyataan dan gelung, 3 memahami definisi dan penggunaan fungsi. Ini akan membantu anda mula menulis program python mudah.

Python lebih mudah dipelajari dan digunakan, manakala C lebih kuat tetapi kompleks. 1. Sintaks Python adalah ringkas dan sesuai untuk pemula. Penaipan dinamik dan pengurusan memori automatik menjadikannya mudah digunakan, tetapi boleh menyebabkan kesilapan runtime. 2.C menyediakan kawalan peringkat rendah dan ciri-ciri canggih, sesuai untuk aplikasi berprestasi tinggi, tetapi mempunyai ambang pembelajaran yang tinggi dan memerlukan memori manual dan pengurusan keselamatan jenis.

Untuk memaksimumkan kecekapan pembelajaran Python dalam masa yang terhad, anda boleh menggunakan modul, masa, dan modul Python. 1. Modul DateTime digunakan untuk merakam dan merancang masa pembelajaran. 2. Modul Masa membantu menetapkan kajian dan masa rehat. 3. Modul Jadual secara automatik mengatur tugas pembelajaran mingguan.

Python digunakan secara meluas dalam bidang pembangunan web, sains data, pembelajaran mesin, automasi dan skrip. 1) Dalam pembangunan web, kerangka Django dan Flask memudahkan proses pembangunan. 2) Dalam bidang sains data dan pembelajaran mesin, numpy, panda, scikit-learn dan perpustakaan tensorflow memberikan sokongan yang kuat. 3) Dari segi automasi dan skrip, Python sesuai untuk tugas -tugas seperti ujian automatik dan pengurusan sistem.

Python cemerlang dalam automasi, skrip, dan pengurusan tugas. 1) Automasi: Sandaran fail direalisasikan melalui perpustakaan standard seperti OS dan Shutil. 2) Penulisan Skrip: Gunakan Perpustakaan Psutil untuk memantau sumber sistem. 3) Pengurusan Tugas: Gunakan perpustakaan jadual untuk menjadualkan tugas. Kemudahan penggunaan Python dan sokongan perpustakaan yang kaya menjadikannya alat pilihan di kawasan ini.
