


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!

Python dan C masing -masing mempunyai kelebihan sendiri, dan pilihannya harus berdasarkan keperluan projek. 1) Python sesuai untuk pembangunan pesat dan pemprosesan data kerana sintaks ringkas dan menaip dinamik. 2) C sesuai untuk prestasi tinggi dan pengaturcaraan sistem kerana menaip statik dan pengurusan memori manual.

Memilih Python atau C bergantung kepada keperluan projek: 1) Jika anda memerlukan pembangunan pesat, pemprosesan data dan reka bentuk prototaip, pilih Python; 2) Jika anda memerlukan prestasi tinggi, latensi rendah dan kawalan perkakasan yang rapat, pilih C.

Dengan melabur 2 jam pembelajaran python setiap hari, anda dapat meningkatkan kemahiran pengaturcaraan anda dengan berkesan. 1. Ketahui Pengetahuan Baru: Baca dokumen atau tutorial menonton. 2. Amalan: Tulis kod dan latihan lengkap. 3. Kajian: Menyatukan kandungan yang telah anda pelajari. 4. Amalan Projek: Sapukan apa yang telah anda pelajari dalam projek sebenar. Pelan pembelajaran berstruktur seperti ini dapat membantu anda menguasai Python secara sistematik dan mencapai matlamat kerjaya.

Kaedah untuk belajar python dengan cekap dalam masa dua jam termasuk: 1. Semak pengetahuan asas dan pastikan anda sudah biasa dengan pemasangan Python dan sintaks asas; 2. Memahami konsep teras python, seperti pembolehubah, senarai, fungsi, dan lain -lain; 3. Menguasai penggunaan asas dan lanjutan dengan menggunakan contoh; 4. Belajar kesilapan biasa dan teknik debugging; 5. Memohon pengoptimuman prestasi dan amalan terbaik, seperti menggunakan komprehensif senarai dan mengikuti panduan gaya PEP8.

Python sesuai untuk pemula dan sains data, dan C sesuai untuk pengaturcaraan sistem dan pembangunan permainan. 1. Python adalah mudah dan mudah digunakan, sesuai untuk sains data dan pembangunan web. 2.C menyediakan prestasi dan kawalan yang tinggi, sesuai untuk pembangunan permainan dan pengaturcaraan sistem. Pilihan harus berdasarkan keperluan projek dan kepentingan peribadi.

Python lebih sesuai untuk sains data dan perkembangan pesat, manakala C lebih sesuai untuk prestasi tinggi dan pengaturcaraan sistem. 1. Sintaks Python adalah ringkas dan mudah dipelajari, sesuai untuk pemprosesan data dan pengkomputeran saintifik. 2.C mempunyai sintaks kompleks tetapi prestasi yang sangat baik dan sering digunakan dalam pembangunan permainan dan pengaturcaraan sistem.

Adalah mungkin untuk melabur dua jam sehari untuk belajar Python. 1. Belajar Pengetahuan Baru: Ketahui konsep baru dalam satu jam, seperti senarai dan kamus. 2. Amalan dan Amalan: Gunakan satu jam untuk melakukan latihan pengaturcaraan, seperti menulis program kecil. Melalui perancangan dan ketekunan yang munasabah, anda boleh menguasai konsep teras Python dalam masa yang singkat.

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.


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

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

MinGW - GNU Minimalis untuk Windows
Projek ini dalam proses untuk dipindahkan ke osdn.net/projects/mingw, anda boleh terus mengikuti kami di sana. MinGW: Port Windows asli bagi GNU Compiler Collection (GCC), perpustakaan import yang boleh diedarkan secara bebas dan fail pengepala untuk membina aplikasi Windows asli termasuk sambungan kepada masa jalan MSVC untuk menyokong fungsi C99. Semua perisian MinGW boleh dijalankan pada platform Windows 64-bit.

PhpStorm versi Mac
Alat pembangunan bersepadu PHP profesional terkini (2018.2.1).

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)