2008-09-26 22 views
6

Veritabanımın benim models.py dosyamla senkronize olup olmadığını gösterebilecek testler yazmak istiyorum. Aslında bunları zaten yazdım, sadece django'nun testler her modelde çalıştırıldığında yeni bir veritabanı oluşturduğunu öğrenmek için models.py dosyasına dayanıyor. models.py testini mevcut veritabanı şemasını kullanabileceğim herhangi bir yol var mı? Mysql/postgresql'de olan ve /myapp/models.py dosyasındaki gibi değil mi?Django veritabanı şemasını nasıl sınayabilirim?

Veritabanındaki veriler umrumda değil, sadece şema olduğunu umuyorum, testlerimin veritabanındaki bir tablonun benim models.py dosyasındaki şemadan daha az alanı olup olmadığını fark etmesini istiyorum .

Herhangi bir alaka düzeyi varsa, doğru olmayan çerçeveyi (aslında django uzantısını) kullanıyorum.

sayesinde

cevap

8

Yaptıklarımız bunun karşı test etmek için yeni veritabanı oluşturmak olmaz ki varsayılan test_runner geçersiz oldu. Bu şekilde, mevcut yerel veritabanımızın neye benzediğine bakılmaksızın testi çalıştırır. Ancak bu yöntemi kullanırsanız çok dikkatli olun çünkü testlerinizde yaptığınız verilerde yapılacak değişiklikler kalıcı olacaktır. Tüm testlerimizin orijinal hallerine geri dönmesini ve veritabanımızın bozulmamış sürümünün sunucuda kalmasını ve yedeklenmesini sağladım. Yani

projenizde bir konuma django.test.simple gelen run_test yöntemini kopyalamanız gerekir bunu yapmak için - Ben

Ardından aşağıdaki değişiklikleri yapın myproject/test/test_runner.py mayın koymak bu yöntem:

// change 
old_name = settings.DATABASE_NAME 
from django.db import connection 
connection.creation.create_test_db(verbosity, autoclobber=not interactive) 
result = unittest.TextTestRunner(verbosity=verbosity).run(suite) 
connection.creation.destroy_test_db(old_name, verbosity) 

// to: 
result = unittest.TextTestRunner(verbosity=verbosity).run(suite) 

üstündeki tüm gerekli ithalat yapmak emin olun ve ardından ayarlarında ayarını file:

TEST_RUNNER = 'myproject.test.test_runner.run_tests' 

Şimdi çalıştırdığınızda. /manage.py testi Django, mevcut model tanımlarınıza dayalı yeni bir sürüm oluşturmak yerine, testleri veritabanınızın mevcut durumuna karşı çalıştırır. Böyle

Yapabileceğiniz başka bir şey, yeni run_test bir kontrol yapmak sonra yerel olarak veritabanının bir kopyasını oluşturmak ve olan() yöntemi:

if settings.DATABASE_NAME != 'my_test_db': 
    sys.exit("You cannot run tests using the %s database. Please switch DATABASE_NAME to my_test_db in settings.py" % settings.DATABASE_NAME) 

karşı testlerini gerçekleştirme tehlikesi yoktur Böylece senin ana veritabanı

İlgili konular