首先,这个是我实际工作过程中没用到过的,是一些朋友同事咨询,问题是啥呢,就是希望实现 Appium Server 的启动和关闭,随着脚本的执行来控制,而不是一直在后台执行着。
看她们实现,从网上找的多进程模块来实现的,也就是 multiprocessing 模块,来管理进程,虽然我对 multiprocessing 使用不多,但也知道她们实现的不对,怎么错的就不给大家展示了。
然后,我习惯使用的是 subprocess 模块,并且满足实现该目标的几个属性:
1、可以多进程执行
2、可以监控进程输出,方便控制
3、随起随用,用完即关
1、测试脚本设计,脚本执行开始/结束时,输出特定输出流(用于控制 Appium server 启动管理)
@classmethod
def setUpClass(cls):
LogSys.logInfo("INSTRUMENTATION_STATUS: server start")
Support.sleep(5) # 必不可少,需要等待server 启动起来再跑测试脚本
cls.Device = cls.readConfig(cls)
cls.alerts = cls.readConfigAlert(cls)
Config.permission = cls.alerts['permission']
Config.app = cls.alerts['APP']
LogSys.logInfo(Config.permission)
LogSys.logInfo(Config.app)
cls.driver = webdriver.Remote(cls.Device['Appium_server'].format(cls.Device['appium']['device']['port']), cls.Device['appium']['device'])
@classmethod
def tearDownClass(cls):
LogSys.logInfo("INSTRUMENTATION_STATUS: server end")
cls.driver.quit()
2、yaml 管理设备信息时,提前分配好端口
iPhone7:
automationName: XCUITest
platformName: iOS
platformVersion: 12.4.0
deviceName: iPhone
bundleId: com.hnczb.czb
udid: 288659964546ba8fd20eaf7d16b39.....
xcodeSigningId: iPhone Developer
xcodeOrgId: .....
newCommandTimeout: 3600
autoAcceptAlerts: True
unicodeKeyboard: True
resetKeyboard: True
onReset: False
port: 4724
3、Appim Server 进程启动管理
class appiumServer(object):
def start(self, IsOpt=False, port=4723):
self.p = Popen('appium -p {}'.format(port), stdout=PIPE, stderr=STDOUT, shell=True)
def stop(self):
self.p.kill()
4、主进程(脚本执行)管理
class CaseAuto():
def run(self, cmd, port):
self.p = Popen(cmd, stdout=PIPE, stderr=STDOUT, shell=True, encoding='utf-8')
server = appiumServer()
while self.p.poll() is None:
lineStr = self.p.stdout.readline()
if lineStr:
if 'server start' in lineStr:
server.start(port=port)
elif 'server end' in lineStr:
server.stop()
else:
pass
大功告成!