-1

我寫了一個SeleniumTestCase類,該類在其setUpClass中啓動PhantomJS並在其tearDownClass中殺死它。但是,如果派生類'setUpClass產生了錯誤,則PhantomJS進程將被掛起,因爲SeleniumTestCase.tearDownClass未被調用。如果派生類'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 

的輸出(注意 「拆除」 沒有得到印刷)

$ ./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'... 
一套房的 setUpClass失敗

我怎麼能殺PhantomJS後? 我知道我可以切換到使用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 
相關問題