2017-10-04 177 views
0

我正在使用Django測試運行器來運行我的單元測試。其中一些測試使用工廠,在我的本地系統上創建文件的噸數。他們都有一個可檢測的名字,並且可以很容易地被刪除。Django/unittest在測試運行結束時運行命令

我試圖避免要麼

  1. 保持一個文件刪除cron作業運行
  2. 更改我的自定義圖像模型的代碼刪除該文件,如果它檢測到我們正在測試。相反,我想在測試運行結束時運行一次(並且只運行一次)命令,以清理測試生成的所有文件。

我寫了一個小的管理命令,刪除符合預期約定的文件。在完成整個測試套件(而不僅僅是在特定測試的tearDowntearDownClass方法中)時,是否有辦法讓測試運行器運行call_command

回答

0

所以我們落得這樣做創建自定義的測試運行中添加以下行settings.py中:

TEST_RUNNER = 'myapp.test_runner.MyTestRunner' 

然後在測試運行中,我們從「teardown_test_environment」法中刪除圖像從我們現有的juno測試跑步者繼承的一個測試跑步者。

import os                     
import shutil 

from django.conf import settings 
from junorunner.testrunner import TestSuiteRunner 


class MyTestRunner(TestSuiteRunner): 

    def teardown_test_environment(self, *args, **kwargs): 
     # Remove test-created media files 
     if all([ 
      os.path.isdir(settings.MEDIA_ROOT), 
      'test' in settings.MEDIA_ROOT, 
     ]): 
      shutil.rmtree(settings.MEDIA_ROOT) 
     super(MyTestRunner, self).teardown_test_environment(*args, **kwargs) 

這種方法在測試方法的拆解被調用,似乎是一個好地方,以確保它能夠在年底調用一次,只有一次。

0

如果您在與models.py相同的文件夾中創建了services.py文件,則可以將清理代碼放在那裏,然後從管理命令和testDownDown中調用它,同時保持乾燥。

0

也許你可以利用的方式Django的測試運行的訂單試驗(見https://docs.djangoproject.com/en/1.11/topics/testing/overview/#order-in-which-tests-are-executed

如果你的測試用例從Django的TestCase類繼承,你可以創建一個虛擬清理測試用例直接繼承unittest.TestCase生成。測試運行人員將最後執行,並且您可以在那裏進行清理。

但是,如果django開發者決定對測試排序進行更改,這將會中斷。

相關問題