2016-07-04 70 views
0

比如我有兩個測試:我怎麼能並行硒的Python測試執行與單元測試

class Test(unittest.TestCase): 
    def setUp(self): 
    self.driver = webdriver.Firefox() 
    self.driver.get("http://google.com") 

def tearDown(self): 
    self.driver.quit() 

def test_selenium_1(self): 
    search_field = self.driver.find_element_by_id("lst-ib") 
    search_field.send_keys("Test 1. Number 1") 
    search_field.submit() 
    time.sleep(2) 

def test_selenium_2(self): 
    search_field = self.driver.find_element_by_id("lst-ib") 
    search_field.send_keys("Test 1. Number 2") 
    search_field.submit() 
    time.sleep(2) 

if __name__ == '__main__': 
    unittest.main() 

我怎麼能並行執行這兩個測試的concurrent.futures.Executor

可能嗎?

+0

http://nose.readthedocs.io/en/latest/doc_tests/test_multiprocess/multiprocess.html – dm03514

+0

有沒有辦法做到這一點沒有鼻子,pytest等 我想用unittest來找到方法。 –

+0

鼻子多進程代碼是開源的(他們在他們的站點上列出了所有代碼),並且可以提供很多關於如何實現並行測試的知識。 – dm03514

回答

1

我爲這些目的創建了Runner。

現在我可以通過模塊,類和方法並行執行測試。

import unittest 
from concurrent.futures import ThreadPoolExecutor 

class Runner(): 

    def parallel_execution(self, *name, options='by_module'): 

     """ 
     name - name of the class with tests or module with classes that contain tests 
     modules - name of the module with tests or with class that contains tests 
     options: 
      by_method - gather all tests methods in the class/classes and execute in parallel 
      by_module - gather all tests from modules in parallel 
      by_class - will execute all classes (with tests) in parallel 
     """ 

     suite = unittest.TestSuite() 

     if (options=='by_method'): 
      for object in name: 
       for method in dir(object): 
        if (method.startswith('test')): 
         suite.addTest(object(method)) 
     elif (options=='by_class'): 
      for object in name: 
       suite.addTest(unittest.TestLoader().loadTestsFromTestCase(object)) 

     elif (options=='by_module'): 
      for module in name: 
       suite.addTest(unittest.TestLoader().loadTestsFromModule(module)) 
     else: 
      raise ValueError("Parameter 'options' is incorrect." 
          "Available options: 'by_method', 'by_class', 'by_module'") 

     with ThreadPoolExecutor(max_workers=10) as executor: 
      list_of_suites = list(suite) 
      for test in range(len(list_of_suites)): 
       test_name = str(list_of_suites[test]) 
       executor.submit(unittest.TextTestRunner().run, list_of_suites[test]) 

實例:

#by_methods 
Runner().parallel_execution(Test1.Test1, Test2.Test22, Test2.Test33, options='by_method') 

#by_class 
Runner().parallel_execution(Test1.Test1, Test2.Test22, Test2.Test33, options='by_class') 

#by_modules 
Runner().parallel_execution(Test1, Test2)