@huis
2016-09-26T07:14:07.000000Z
字数 4471
阅读 195
python unittest selenium thead
具体实现方法:
class BaseUnitTest(unittest.TestCase):# --实例属性区--"""是否开启TestCase级别的单驱动模式,默认False开启时, 一个TestCase只会打开一个浏览器,也就是method之间是公用浏览器,而不是每个测试Method都打开一个浏览器"""SINGLE_DRIVER = False# --类方法区--@classmethoddef setUpClass(cls):cls.driver = None@classmethoddef tearDownClass(cls):if cls.SINGLE_DRIVER:BaseUnitTest.__quit_driver(cls.driver)# --静态方法区--@staticmethoddef __new_driver():driver = browser(env.BROWSER, env.DRIVER_PATH)driver.maximize_window()return driver@staticmethoddef __quit_driver(driver):if env.BROWSER.upper() == 'PHANTOMJS':# 这里是为了能够真正的退出driver.service.process.send_signal(signal.SIGTERM)driver.quit()def setUp(self):if self.SINGLE_DRIVER:if self.__class__.driver is None:self.driver = BaseUnitTest.__new_driver()self.__class__.SINGLE_DRIVER = self.SINGLE_DRIVERself.__class__.driver = self.driverelse:self.driver = self.__class__.driverelse:self.driver = BaseUnitTest.__new_driver()def tearDown(self):if not self.SINGLE_DRIVER:BaseUnitTest.__quit_driver(self.driver)
threading.Thread线程方式,这种方式需要注意的是多个线程之间的相互影响,导致共享值的变化,下面是实现方式(这种有问题,就是不知道合适的时机和方式去关闭driver):
# coding=utf-8import unittestimport threadingfrom driver import browserimport envimport signalimport utilsimport dataUtilsimport sysfrom time import ctimeclass BaseUnitTest(unittest.TestCase):# --实例属性区--"""是否开启TestCase级别的单驱动模式,默认False开启时, 一个TestCase只会打开一个浏览器,也就是method之间是公用浏览器,而不是每个测试Method都打开一个浏览器"""SINGLE_DRIVER = False# --类方法区--@classmethoddef setUpClass(cls):env.thread_local.SINGLE_DRIVER = cls.SINGLE_DRIVER@classmethoddef tearDownClass(cls, is_thread=False):if is_thread and env.thread_local.SINGLE_DRIVER:BaseUnitTest.__quit_driver(env.thread_local.driver)# --静态方法区--@staticmethoddef __new_driver():driver = browser(env.BROWSER, env.DRIVER_PATH)driver.maximize_window()return driver@staticmethoddef __quit_driver(driver):if env.BROWSER.upper() == 'PHANTOMJS':# 这里是为了能够真正的退出driver.service.process.send_signal(signal.SIGTERM)driver.quit()# --实例方法区--# 1.重写父类区def __init__(self, methodName='runTest'):''' overide the TestCase __init__ Methodso need to recall the TestCase __init__ method'''super(BaseUnitTest, self).__init__(methodName)self.__testMethodName = methodNamedef setUp(self):if env.thread_local.SINGLE_DRIVER:if env.thread_local.driver is None:env.thread_local.driver = BaseUnitTest.__new_driver()self.driver = env.thread_local.driverelse:self.driver = BaseUnitTest.__new_driver()def tearDown(self):if not env.thread_local.SINGLE_DRIVER:BaseUnitTest.__quit_driver(self.driver)# 2.自定义方法区def assertEqualUnicode(self, a, b):a = dataUtils.decodeToUnicode(a)b = dataUtils.decodeToUnicode(b)self.assertEqual(a, b)# 3.私有方法区def __exc_info(self):''' copy from TestCase ,aim to overide the TestCase __call__ method'''exctype, excvalue, tb = sys.exc_info()if sys.platform[:4] == 'java': # tracebacks look different in Jythonreturn (exctype, excvalue, tb)newtb = tb.tb_nextif newtb is None:return (exctype, excvalue, tb)return (exctype, excvalue, newtb)def __call__(self, result=None):''' overide the TestCase __call__ methodaim to add insert_img_decorator to the test_case method'''if result is None:result = self.defaultTestResult()result.startTest(self)testMethod = getattr(self, self.__testMethodName)newMethod = utils.insert_img_decorator(self.__testMethodName)(testMethod)try:try:self.setUp()except KeyboardInterrupt:raiseexcept:result.addError(self, self.__exc_info())returnok = 0try:newMethod(self)ok = 1except self.failureException, e:result.addFailure(self, self.__exc_info())except KeyboardInterrupt:raiseexcept:result.addError(self, self.__exc_info())try:self.tearDown()except KeyboardInterrupt:raiseexcept:result.addError(self, self.__exc_info())ok = 0if ok:result.addSuccess(self)finally:result.stopTest(self)
multiprocessing进程方式,这种方式可以避免线程上的值共享被共同访问时的问题,但是需要注意其他问题,就是测试结果如何共享的问题,实现代码如上
TestLoader.discover发现的结果如下:
<unittest.suite.TestSuitetests=[<unittest.suite.TestSuitetests=[<unittest.suite.TestSuite tests=[]>,<unittest.suite.TestSuitetests=[<exam_manager_test.ExamManageTest testMethod=test_a_add_exam>,<exam_manager_test.ExamManageTest testMethod=test_b_search_exam>]>]>,<unittest.suite.TestSuitetests=[<unittest.suite.TestSuite tests=[]>,<unittest.suite.TestSuitetests=[<exam_manager_1_test.ExamManageTest testMethod=test_c_add_exam>,<exam_manager_1_test.ExamManageTest testMethod=test_d_search_exam>]>]>]>
数据知道了,那具体流程图如下: