2015-10-30 10 views
19

I2 veritabanı bağlantıları kullanan bir django uygulama vardır: bu benim kontrolü dışında tamamen korunur,Django testleri çalıştırırken yönlendiriciyi yoksayar mı?

  1. uygulama referans ana veri sistemi için
  2. üretmektir gerçek veri bağlanmak için

Yapmakta olduğum sorun, web sunucumun 2. veritabanındaki verilere kesinlikle değmeyeceğidir. Her bir veritabanı bağlantısı için bir tane olmak üzere 2 (alt) uygulama kullanarak sorunların çoğunu çözdüm. Ben

model.meta.managed = False 

seçeneğini kullanarak, ben de 2 uygulamasında tüm modeller olmayan yönetilen yapılan

ilk uygulamaya bir yönlendirici herhangi göç yönlendirici dosyası ve yazma yarattı.

emin olmak gerekirse, ben 2 veritabanına bağlanmak kullanıcı sadece okuma Bu göçler ve çalıştırmak için çalışıyor

erişin. Ancak, django testcase kullanarak testleri çalıştırmaya çalıştığımda, Django 2. veritabanı bağlantısında bir test_ veritabanı silmeye ve oluşturmaya çalışır. Django/güncellemek ekleme/bırakma/silme/2 bağlantı üzerinden keser ASLA emin olmak

Ben, ikinci veritabanıoluşturmaya çalışmayın testleri çalıştırmak nasıl ama nasıl yapabilirim

İlkini oluştur.

Teşekkürler!

düzenlendi: kodu

modeli (2 uygulama için, o yönetilen edilmemelidir):

from django.db import models 


class MdmMeta(object): 
    db_tablespace = 'MDM_ADM' 
    managed = False 
    ordering = ['name'] 


class ActiveManager(models.Manager): 
    def get_queryset(self): 
     return super(ActiveManager, self).get_queryset().filter(lifecyclestatus='active') 


class MdmType(models.Model): 
    entity_guid = models.PositiveIntegerField(db_column='ENTITYGUID') 
    entity_name = models.CharField(max_length=255, db_column='ENTITYNAME') 

    entry_guid = models.PositiveIntegerField(primary_key=True, db_column='ENTRYGUID') 

    name = models.CharField(max_length=255, db_column='NAME') 
    description = models.CharField(max_length=512, db_column='DESCRIPTION') 

    lifecyclestatus = models.CharField(max_length=255, db_column='LIFECYCLESTATUS') 

    # active_manager = ActiveManager() 

    def save(self, *args, **kwargs): 
     raise Exception('Do not save MDM models!') 

    def delete(self, *args, **kwargs): 
     raise Exception('Do not delete MDM models!') 

    def __str__(self): 
     return self.name 

    class Meta(MdmMeta): 
     abstract = True 


# Create your models here. 
class MdmSpecies(MdmType): 
    class Meta(MdmMeta): 
     db_table = 'MDM_SPECIES' 
     verbose_name = 'Species' 
     verbose_name_plural = 'Species' 


class MdmVariety(MdmType): 
    class Meta(MdmMeta): 
     db_table = 'MDM_VARIETY' 
     verbose_name = 'Variety' 
     verbose_name_plural = 'Varieties' 

... 

yönlendirici:

__author__ = 'CoesseWa' 

class MdmRouter(object): 

    def db_for_read(self, model, **hints): 
     if model._meta.app_label == 'mdm': 
      # return 'default' 
      return 'mdm_db' # trying to use one database connection 
     return 'default' 

    def db_for_write(self, model, **hints): 
     return 'default' 

    def allow_relation(self, obj1, obj2, **hints): 
     return None 

    def allow_migrate(self, db, model): 
     if model._meta.app_label == 'mdm': 
      return False 

ayarları:

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.oracle', 
     'NAME': '(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=%s)(PORT=1521)))(CONNECT_DATA=(SID=%s)))' 
       % (get_env_variable('LIMS_MIGRATION_HOST'), get_env_variable('LIMS_MIGRATION_SID')), 
     'USER': 'LIMS_MIGRATION', 
     'PASSWORD': get_env_variable('LIMS_MIGRATION_PASSWORD'), 
    }, 
    'mdm_db': { 
     'ENGINE': 'django.db.backends.oracle', 
     'NAME': '(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=GB3P)(PORT=1521)))' 
       '(CONNECT_DATA=(SID=GB3P)))', 
     'USER': 'MDM', 
     'PASSWORD': get_env_variable('MDM_DB_PASSWORD'), 
    }, 
} 

bir dizge: Bu testler çalıştırırken gelen

from django.test.testcases import TestCase 

__author__ = 'CoesseWa' 


class ModelTest(TestCase): 

    def test_getting_guid_for_mdm_field(self): 
     self.assertIsNotNone(1) 

çıkışı:

... 
Destroying old test user... 

(bu noktadan önce, Django benim ilk bağlantı için test veritabanı, = Tamam)

Creating test user... 

=> Bu sonraki satırlar asla olmamalıdır.Başarısız Ben salt okunur bir kullanıcıyı kullandıkları için (Neyse ki)

Creating test database for alias 'mdm_db'... 

Failed (ORA-01031: insufficient privileges 
Got an error creating the test database: ORA-01031: insufficient privileges 
+0

Daha fazla kod görmek istiyorum, testlerinizi ve modellerinizi gösterebilir misiniz? – Uri

cevap

10

Bunu, DATABASES.TEST tanımını değiştirerek çözdüm. TEST['MIRROR'] = 'default' ekini mdm_db veritabanı girdisine ekledim. ,

Ancak çoğaltma veritabanı (AYNA testi ayarını kullanarak) bir test ayna olarak yapılandırılmış belirten: documentation bu seçenek göre

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.oracle', 
     'NAME': '(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=%s)(PORT=1521)))(CONNECT_DATA=(SID=%s)))' 
       % (get_env_variable('LIMS_MIGRATION_HOST'), get_env_variable('LIMS_MIGRATION_SID')), 
     'USER': 'LIMS_MIGRATION', 
     'PASSWORD': get_env_variable('LIMS_MIGRATION_PASSWORD'), 
    }, 
    'mdm_db': { 
     'ENGINE': 'django.db.backends.oracle', 
     'NAME': '(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=GB3P)(PORT=1521)))' 
       '(CONNECT_DATA=(SID=GB3P)))', 
     'USER': 'MDM', 
     'PASSWORD': get_env_variable('MDM_DB_PASSWORD'), 
     'TEST': { 
      'MIRROR': 'default', # Added this setting 
     } 
    }, 
} 

veritabanı oluşturmayı atlamak kötüye kullanılabilir Test altında, çoğaltması, varsayılan bir ayna olarak ele alınmalıdır.

Test ortamı yapılandırıldığında, çoğaltmasının bir deneme sürümü oluşturulmayacaktır. Bunun yerine, çoğaltma bağlantısı varsayılan olarak noktaya yönlendirilecektir.

Şimdi sınamalarımı yürütmek, ikinci veritabanının oluşturulmasını atlıyor.

Tüm girişler için teşekkürler!

+0

teşekkürler bir ton! Bu çok yardımcı oldu! – TheLuminor

2

Test komutuyla --settings bayrağını kullanın. Path.to.test.py modülünde, bir la python manage.py test --settings=app.settings.test. Rotalarla uğraşmanıza gerek yok, sadece ayarları ne zaman ve nerede aradığınızı ayarlar bayrağıyla çağırdığınızdan emin olun.

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.sqlite3', 
     'NAME': '', 
     'USER': '', 
     'PASSWORD': '', 
    }, 
    'mdm_db': { 
     'ENGINE': 'django.db.backends.sqlite3', 
     'NAME': '', 
     'USER': '', 
     'PASSWORD': '', 
    }, 
} 

Bu testler çalıştırırken ayrı bir veritabanını kullanmak için izin verir: app.settings.test.py olarak

, senin DATABASES veri tipleri de yeniden tanımlamak. Ek olarak, sqlite3'ü motorunuz olarak kullanırsanız, veritabanı bellekte olduğu için bu testlerin çok hızlı çalıştığını görürsünüz.

Sınama için sqlite3 veritabanlarını kullanmak, yüzlerce sınamanın bile saniyeler içinde çalıştırılabileceği anlamına gelir. Sonuç olarak, testlerinizi çok sık çalıştırabilirsiniz. Çalışmamı kaydetmek ve testlerimi tek bir eylemle çalıştırmak için genellikle bir anahtar eşleştiriyorum:

map ,t :up\|!python manage.py test --settings=app.settings.test 

Yararlı olduğunu umuyorum!

+0

Farklı ayarlar dosyası kullanıyorum ... Sorun şu ki, testleri çalıştırmak için yerel veritabanına ikinci veritabanını pratik olarak kopyalayamıyorum. İkinci veritabanının içeriği mantığın bir parçasıdır, bu yüzden uygulamamın bununla iyi çalıştığını test etmem gerekiyor. – Ward

+0

TestCases'inizin setUp ve tearDown yöntemlerini kullanarak, karşı test edebileceğiniz nesneler oluşturabilirsiniz. Bu özellikle yararlı olup olmadığından emin değilim, ama bakmaya değer bir şey olabilir. –

İlgili konular