Django 1.7 memperkenalkan migrasi basis data .
Saat menjalankan pengujian unit di Django 1.7, ini memaksa migrasi , yang membutuhkan waktu lama. Jadi saya ingin melewatkan migrasi django, dan membuat database pada kondisi akhir.
Saya tahu bahwa mengabaikan migrasi bisa menjadi praktik yang buruk, karena bagian kode itu tidak akan diuji. Tapi bukan itu masalahnya: Saya menjalankan migrasi penuh di server pengujian CI (jenkins). Saya hanya ingin melewatkan migrasi dalam pengujian lokal saya, yang mengutamakan kecepatan.
Beberapa konteks:
Hingga Django 1.6 , ketika menggunakan Selatan, saya menggunakan pengaturan SOUTH_TESTS_MIGRATE :
Secara default, perintah syncdb South juga akan menerapkan migrasi jika dijalankan dalam mode non-interaktif, termasuk saat Anda menjalankan pengujian - perintah ini akan menjalankan setiap migrasi setiap kali Anda menjalankan pengujian.
Jika Anda ingin runner pengujian menggunakan syncdb daripada migrasi - misalnya, jika migrasi Anda memakan waktu terlalu lama untuk diterapkan - cukup setel SOUTH_TESTS_MIGRATE = False di settings.py.
Namun, syncdb tidak ada lagi, sekarang sudah dimigrasi .
Dan dari Django 1.8 saya akan menggunakan parameter --keepdb :
Opsi --keepdb dapat digunakan untuk mempertahankan database pengujian di antara pengujian yang dijalankan. Keuntungannya adalah melewatkan tindakan buat dan penghancuran yang sangat mengurangi waktu untuk menjalankan pengujian, terutama yang ada dalam rangkaian pengujian yang besar. Jika database pengujian tidak ada, database akan dibuat saat dijalankan pertama kali dan kemudian dipertahankan untuk setiap proses berikutnya. Migrasi apa pun yang belum diterapkan juga akan diterapkan ke database pengujian sebelum menjalankan rangkaian pengujian.
Jadi pertanyaan ini terbatas pada Django 1.7.
sumber
django-test-without-migrations
paket telah benar-benar berguna bagi saya, Anda mungkin ingin mengubah jawaban yang diterima untuk stackoverflow.com/a/28993456/200224Jawaban:
Lihat solusi ini , diposting oleh Bernie Sumption ke milis pengembang Django:
Dalam Django 1.9, situasi ini agak ditingkatkan , dan Anda dapat menyetel nilainya ke
None
:MIGRATION_MODULES = {"myapp": Tidak Ada}
sumber
myapp.migrations_not_used_in_tests
modul seharusnya tidak ada.Inilah akhir dari file pengaturan saya:
berdasarkan potongan ini
Saya menonaktifkan migrasi hanya ketika tes sedang berjalan
sumber
__setitem__(self, *_)
metode juga karena kami memiliki masalah dengan aplikasi yang mengatur migrasi mereka sendiri sepertisettings.MIGRATION_MODULES['chroniker'] = 'db_migrations'
django-test-without-migrations menambahkan sebuah
--nomigrations
tanda kemanage.py test
. Bekerja seperti pesona.sumber
Memperbarui : Tidak apa-apa, perubahan ini dikembalikan sebelum final 1,10 dirilis. Semoga ini akan kembali di versi yang akan datang.
Perhatikan bahwa pada Django 1.10 ini dapat dikontrol oleh pengaturan basis data percobaan.
sumber
https://gist.github.com/apollovy/22826f493ad2d06d9a9a22464730ce0b
sumber
Untuk django 1.9 dan yang lebih baru, jawaban Guillaume Vincent tidak berfungsi lagi, jadi inilah solusi baru:
Saya menggunakan potongan ini di file pengaturan saya, setelah definisi dari
INSTALLED_APPS
Ini mengulangi semua aplikasi yang diinstal dan menandai masing-masing sebagai tidak memiliki modul migrasi. Lihat dokumen django untuk informasi lebih lanjut .
Dengan menggunakan potongan ini Anda dapat menjalankan pengujian Anda, mengatur variabel lingkungan
TESTS_WITHOUT_MIGRATIONS
, misalnya:sumber
Saya baru saja memikirkan bagaimana menonaktifkan migrasi setelah django 1.10, semoga bisa membantu seseorang. Ini tautan di git
Migrasi untuk django 1.10 memiliki dua bagian, lihat load_disk dan perekam
Bagian dari
load_disk
untuk model migrasi aplikasi yang ditambahkan diINSTALL_APP
Dan bagian darirecorder
untuk koneksi database Untuk versi sebelum 1.9 kita perlu mengaturMIGRATION_MODULES={'do.not.migrate':'notmigrations'}
saat Anda menjalankan tes Sekarang kita perlu mengaturnya Tidak ada sepertiMIGRATION_MODULES={'do.not.migrate':None}
Jadi jika kita tidak ingin melakukan migrasi untuk aplikasi apa pun , hanya memperpanjang dict dan kembaliNone
untukgetitem
fungsi, dan melakukan hal yang sama diDATABASES
, itu adalah hal yang benar perlu Anda lakukanPS: Untuk perintah, Anda perlu menentukan
--setting=module.path.settings_test_snippet
setelahtest
PPS Jika Anda bekerja denganpycharm
, jangan setel--settings
opsi diRun/Debug configurations
, cukup tambahkan jalursettings_test_snippet.py
di pengaturan Kustom. Itu baik-baik saja !!Nikmati
sumber