2017-05-02 13 views
2

我試過寫過a test on specific migration files。基本上我想測試一對遷移之間的數據庫和數據的當前狀態。我用MigrationExecutor如下:如何在Django中更快地測試遷移?

executor = MigrationExecutor(connection) 
old_apps = executor.loader.project_state(self.migrate_from).apps 
executor.migrate(self.migrate_from) 
# do something here 
executor.migrate(self.migrate_to) 

我們在這個項目這麼多的遷移文件,因此運行所有這些單元測試需要花費大量的時間。通常情況下,我會遷移模塊設置爲None在一個settings_test.py

MIGRATION_MODULES: { 
    'my_app': None 
} 

使用此設置,測試將運行的真快。問題是,遷移文件,以測試(self.migrate_fromself.migrate_to)不再能發現:

django.db.migrations.exceptions.NodeNotFoundError: Node ('poleluxe', '0090_auto_previous_migration') not a valid node 

所以我不得不在再次測試包括遷移模塊。

有沒有辦法包含遷移文件而不運行所有它們?在我的情況下,我想跳過從00010089的所有遷移並僅運行0090(如self.migration_from)和0091(如self.migrate_to)。

我在考慮壓縮前89次遷移,並將結果與​​00900091一起放在單獨的文件夾中,然後在測試中引用該遷移文件夾。不過,我不確定這是否是一個很好的解決方案。

+0

你讀過https://www.caktusgroup.com/blog/2016/02/02/writing-unit-tests-django-migrations/ for這種測試? –

+0

是的。事實上,我已經在帖子中列入了那個。 –

回答

0

這是我瞭解到目前爲止,請指導我,如果我不正確。

問題

  1. Migration test code需要遷移被施加。
  2. 的Django起步較早比任何其他工藝如@override_settingsetUpClass()

解決方案

覆蓋MIGRATION_MODULES在TestClass中的最開始設定,即使TestClass中沒有被完全初始化,因爲那是隻有我找到了正確的點。

通過這種方式,您不僅可以在運行測試時禁用所有遷移,還可以測試遷移文件。

  1. 禁止從所有settings.py遷移。

    MIGRATION_MODULES = {app: None for app in INSTALLED_APPS} 
    
  2. (可選)從pytest設置--nomigrations的選擇,如果您使用pytest,Django的。
  3. 覆蓋'MIGRATION_MODULES'設置並在測試後重新設置。

    class TestMigrations(TestCase): 
        origin_modules = getattr(settings, 'MIGRATION_MODULES', {}) 
        setattr(settings, 'MIGRATION_MODULES', {})  
    
        ... 
    
        @classmethod 
        def tearDownClass(cls): 
         setattr(settings, 'MIGRATION_MODULES', cls.origin_modules) 
         super().tearDownClass() 
    

試用信息

  1. @override_setting上的TestClass或TestMethod的不工作因爲Django的開始,並以--nomigrations不工作運行遷移早於@override_setting裝飾
  2. pytest-的Django不太確定,但我的解決方法是禁用從Django設置而不是pytest-django遷移
相關問題