本文只啟動一次app指的是有多個測試的.py文件這種情況
如果是在測試類如LoginTest中,有多個測試方法,如: test_1, test_2,想保證在執行完test_1后,不重新啟動app,接着執行test_2,則把初始化的方法setUp換為setUpClass。
setUp是在每個test方法運行前執行,有多少個test方法,就執行多少次,setUpClass方法是在所有test方法運行前執行,只執行一次。
問題描述:在test_case中,有多個測試的.py文件,每次執行完一個.py文件,就會重新啟動一次app,於是就想,有沒有什么辦法只啟動一次app
解決方法:
單例模式
單例模式可以確保某個類只有一個實例存在。讓所有的.py文件公用一個driver,就可以避免多次啟動app。
如下在Public.py文件中
1 _instence = None 2 _instence_lock = threading.Lock() 3 def get_devices(self): 4 with Readconf._instence_lock: 5 #Readconf為當前的類名 6 if not Readconf._instence: 7 # conn_app為初始化devices的方法,具體內容,在下方顯示 8 Readconf._instence = Readconf().conn_app() 9 return Readconf._instence
上述代碼寫完后,具體調用方式如下:
1 @classmethod 2 def setUpClass(cls): 3 # Readconf類為get_devices方法所在的類 4 cls.devices = Readconf().get_devices() 5 6 # 然后正常調用 devices就可以了 7 def test_a(self): 8 self.devices.implicitly_wait(30) 9 self.devices.find_element_by_id('******').click() 10 self.devices.find_element_by_id('******').click()
初始話devices的方法內容如下< conn_app() >:
1 def conn_app(self): 2 desired_caps = { 3 "deviceName": self.conn('deviceName'), 4 "platformName": self.conn('platformName'), 5 "skipServerInstallation": self.conn('skipServerInstallation'), 6 "skipDeviceInitialization": self.conn('skipDeviceInitialization'), 7 # "noReset": self.conn('noReset'), 8 "automationName": self.conn('automationName'), 9 "appPackage": self.conn('appPackage'), 10 "appActivity": self.conn('appActivity'), 11 # "appWaitActivity":self.conn('appWaitActivity'), 12 "udid": self.conn('udid'), 13 "resetKeyboard": self.conn('resetKeyboard') 14 } 15 self.driver = webdriver.Remote(self.conn('url'), desired_caps) 16 return self.driver
當運行run.py報錯時:
錯誤如下:_TestResult' object has no attribute 'outputBuffer
解決方式:
1、在HTMLTestRunner.py中
Ctrl+F搜索_TestResult方法,在__init__方法中添加:
self.outputBuffer = io.StringIO()
self.test_start_time = round(time.time(), 2)
1 def __init__(self, verbosity=1): 2 TestResult.__init__(self) 3 self.stdout0 = None 4 self.stderr0 = None 5 self.success_count = 0 6 self.failure_count = 0 7 self.error_count = 0 8 self.verbosity = verbosity 9 10 # result is a list of result in 4 tuple 11 # ( 12 # result code (0: success; 1: fail; 2: error), 13 # TestCase object, 14 # Test output (byte string), 15 # stack trace, 16 # ) 17 self.result = [] 18 self.subtestlist = [] 19 20 # 添加到這里 21 self.outputBuffer = io.StringIO() 22 self.test_start_time = round(time.time(), 2)