-1

setUpClassにPhantomJSを起動し、tearDownClassを殺すSeleniumTestCaseクラスを書きました。ただし、派生クラス 'setUpClassがエラーを発生させる場合、SeleniumTestCase.tearDownClassが呼び出されないため、PhantomJSプロセスはハングアップのままです。派生クラス 'setUpClassが失敗した場合、確実にsetUpClassで起動されたphantomjsを強制終了します。

from django.test import LiveServerTestCase 
import sys, signal, os 
from selenium import webdriver 

errorShots = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', "errorShots") 

class SeleniumTestCase(LiveServerTestCase): 
    @classmethod 
    def setUpClass(cls): 
     """ 
     Launches PhantomJS 
     """ 
     super(SeleniumTestCase, cls).setUpClass() 
     cls.browser = webdriver.PhantomJS() 

    @classmethod 
    def tearDownClass(cls): 
     """ 
     Saves a screenshot if the test failed, and kills PhantomJS 
     """ 
     print 'Tearing down...' 

     if cls.browser: 
      if sys.exc_info()[0]: 
       try: 
        os.mkdir(errorShots) 
       except: 
        pass 

       errorShotPath = os.path.join(
        errorShots, 
        "ERROR_phantomjs_%s_%s.png" % (cls._testMethodName, datetime.datetime.now().isoformat()) 
       ) 
       cls.browser.save_screenshot(errorShotPath) 
       print 'Saved screenshot to', errorShotPath 
      cls.browser.service.process.send_signal(signal.SIGTERM) 
      cls.browser.quit() 


class SetUpClassTest(SeleniumTestCase): 
    @classmethod 
    def setUpClass(cls): 
     print 'Setting Up' 
     super(SetUpClassTest, cls).setUpClass() 
     raise Error('gotcha!') 

    def test1(self): 
     pass 

出力( "解体する" 印刷されないことに注意してください)私はスイートのsetUpClassが失敗した後PhantomJSを殺すことができる方法

$ ./manage.py test 
Creating test database for alias 'default'... 
Setting Up 
E 
====================================================================== 
ERROR: setUpClass (trucks.tests.SetUpClassTest) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/Users/andy/leased-on/trucks/tests.py", line 1416, in setUpClass 
    raise Error('gotcha!') 
NameError: global name 'Error' is not defined 

---------------------------------------------------------------------- 
Ran 0 tests in 1.034s 

FAILED (errors=1) 
Destroying test database for alias 'default'... 

setUpaddCleanupを使用するように切り替えることができますが、すべての単一のテストの前にPhantomJSを再起動しないようにします

答えて

0

私はsetUpModule and tearDownModuleを使用してPhantomJSを起動して終了させることにしました。スクリーンショットを保存するコードをaddCleanupフックに入れました。

from django.test import LiveServerTestCase 
from selenium import webdriver 
import sys 
import signal 
import os 
import unittest 

errorShots = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', "errorShots") 

browser = None 

def setUpModule(): 
    """ 
    Launches PhantomJS 
    """ 
    global browser 
    sys.stdout.write('Starting PhantomJS...') 
    sys.stdout.flush() 
    browser = webdriver.PhantomJS() 
    print 'done' 

def tearDownModule(): 
    """ 
    kills PhantomJS 
    """ 
    if browser: 
     sys.stdout.write('Killing PhantomJS...') 
     sys.stdout.flush() 
     browser.service.process.send_signal(signal.SIGTERM) 
     browser.quit() 
     print 'done' 

class SeleniumTestCase(LiveServerTestCase): 
    def setUp(self): 
     self.addCleanup(self.cleanup) 

    def cleanup(self): 
     """ 
     Saves a screenshot if the test failed 
     """ 
     if sys.exc_info()[0]: 
      try: 
       os.mkdir(errorShots) 
      except: 
       pass 

      errorShotPath = os.path.join(
       errorShots, 
       "ERROR_phantomjs_%s_%s.png" % (self._testMethodName, datetime.datetime.now().isoformat()) 
      ) 
      browser.save_screenshot(errorShotPath) 
      print '\nSaved screenshot to', errorShotPath 
関連する問題