2017-06-12 93 views
2

我有一個具有相當數量的遷移的應用程序,包括數據遷移以在某些模型上設置外鍵。在創建測試數據庫時禁用Django中的數據遷移

當我嘗試運行tests.py時,它失敗,因爲數據遷移正在查詢數據庫中是否存在測試數據庫中不存在的數據。

有沒有辦法禁用數據遷移? (我想保持模式遷移,而不是完全禁用遷移)。

或者在運行數據遷移之前從燈具加載數據?

+0

@ e4c5這與測試的速度或禁用遷移完全無關。在試圖說它是重複的之前,人們是否真的煩擾過要閱讀這個問題? –

回答

2

首先我應該注意到這個解決方案是一個骯髒的把戲:)

我認爲你應該檢查你的測試是否正在運行,並且如果答案爲真則排除你的數據遷移。 要檢查測試是否正在運行,您可以定義您自己的DiscoverRunner並設置一個變量,以顯示測試正在運行。

測試運行器是定義run_tests()方法的類。 Django附帶了一個DiscoverRunner類,該類定義了默認的Django測試行爲。該類定義run_tests()入口點以及run_tests()用於設置,執行和拆除測試套件的其他方法的選擇。

例如,在您的設置中定義TEST_RUNNER。

from django.conf import settings 
from django.test.runner import DiscoverRunner 

class MyTestSuiteRunner(DiscoverRunner): 
    def __init__(self, *args, **kwargs): 
     settings.TEST_RUN = True 
     super().__init__(*args, **kwargs) 

TEST_RUNNER = 'project_name.test_settings.MyTestSuiteRunner' 

假設那麼你只有兩個在您的應用程序遷移:

  • 0001_initial.py
  • 0002_data_migration.py

所以,你應該在你的data_migration是否化驗檢查正在運行,包括或不包括您的操作。

from your_app.settings import settings 
class Migration(migrations.Migration): 

    dependencies = [ 
     ('your_app', '0001_initial.py'), 
    ] 

    operations = [ 
     migrations.RunPython(data_migration_method), 
    ] if not settings.TEST_RUN else [] 

再來一次我注意到,在我看來這是一個骯髒的黑客,這將是有趣的閱讀應該如何以適當的方式作出,但這種解決方案可以幫助您解決問題節能遷移依賴。 請注意,您也可以在您的test_settings中添加TEST_RUNNER運行您的測試,因爲已建議使用AR7。

另請檢查TEST_RUNNER文檔(https://docs.djangoproject.com/en/1.11/topics/testing/advanced/#defining-a-test-runner)。我希望它能幫助你找到更好的解決方案。

另一種解決方案是使用django-pytest代替標準unittest模塊。 Pytest爲測試Django應用程序和項目提供了一組有用的工具。它還有助於禁用Django遷移並通過檢查所有模型來創建數據庫。只需使用--nomigrations標誌運行您的測試。閱讀文檔以獲取更多信息(https://pytest-django.readthedocs.io/en/latest/database.html#nomigrations-disable-django-1-7-migrations

0

您可以從settings.py文件禁止遷移加快testing.Better創建測試一個單獨的設置文件,並把下面的代碼以禁用遷移:

MIGRATION_MODULES = { 
'auth': None, 
'contenttypes': None, 
'default': None, 
'sessions': None, 

'core': None, 
'profiles': None, 
'snippets': None, 
'scaffold_templates': None, 

}

要使用自定義設置文件進行的測試,使用下面的命令

python manage.py test --settings=project.tests_settings 
+0

我實際上並不想禁用模式遷移,只有數據遷移。 –

0

你可以--keepdb運行測試,

Django文檔:

可以防止測試數據庫從使用 測試--keepdb選項被破壞。這將保留 運行之間的測試數據庫。如果數據庫不存在,它將首先被創建。任何 遷移也將被應用,以保持它的最新。

便創建了具有有效數據的測試數據庫,並應用最新的遷移,然後運行測試,Django將不會嘗試創建而runnng測試表或運行遷移:-)


請注意,不建議使用keepdb,我建議將數據遷移功能更新爲能夠在空數據集上運行它們(例如,在遷移功能的頭部檢查表是否爲空,如果它爲空,則返回帶有警告消息)

+0

這將是有用的,如果我有一個填充測試分貝,但我沒有。 –

+1

所以我認爲你唯一的解決方案是更新你的遷移文件並更新它們,正如我在答案的第二部分所述。 – aliva