appium 多个测试用例<多个 **.py文件>,只执行一次app <Python 3.8.1>
本文只启动一次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)