-1

setUpClass에 PhantomJS를 시작하고 tearDownClass에서 PhantomJS를 실행하는 SeleniumTestCase 클래스를 작성했습니다.이 클래스는 안정적으로 setUpClass에서 시작된 phantomjs를 강제 종료합니다. 그러나 파생 클래스 'setUpClass이 오류를 발생 시키면 SeleniumTestCase.tearDownClass이 호출되지 않기 때문에 PhantomJS 프로세스가 중단됩니다.파생 클래스 'setUpClass가 실패하면

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

PhantomJS를 실행하고 종료하려면 setUpModule and tearDownModule을 사용하기로 결정했습니다. 스크린 샷을 저장하는 코드를 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