程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python+appium自動化測試-Appium並發測試之python啟動appium服務

編輯:Python

來自APP Android端自動化測試初學者的筆記,寫的不對的地方大家多多指教哦

一、啟動appium服務器

1.通過命令行窗口啟動單個appium服務器

appium -- 直接打開默認的4723端口號
appium -p 4723 -- 使用-p來啟動固定端口號的appium服務器
復制代碼

2.通過命令行窗口啟動多個appium服務器

appium -p 4723
appium -p 4726
復制代碼

二、啟動多個設備

1.在yaml文件配置Capability參數

desired_caps.yaml

platformName: Android
platformVersion: '9'
deviceName: U4AIUKFAL7W4MJLR
appPackage: com.sina.weibo
appActivity: com.sina.weibo.SplashActivity
automationName: UiAutomator2
autoGrantPermissions: True
noReset: True
url: 127.0.0.1
復制代碼

注意:

手機系統版本號屬於字符串格式,需要加’'引號
url為appium服務器的地址
啟動多個設備需要啟動多個appium服務,所以這邊不設置端口號

2.代碼實現

from time import ctime
import yaml
from appium import webdriver
devices_list = ['U4AIUKFAL7W4MJLR', 'U4AIUKFAL7W4MHUHUDS']
with open(r"E:\\study\\Fork\\WeiboDemo\\Weibo\\config\\desired_caps.yaml", 'r') as file:
data = yaml.load(file, Loader=yaml.FullLoader)
def multi_app_start(udid, port):
desired_caps = {
'platformName': data['platformName'],
'platformVersion': data['platformVersion'],
'deviceName': data['deviceName'],
'udid': udid,
'appPackage': data['appPackage'],
'appActivity': data['appActivity'],
'automationName': data['automationName'],
'autoGrantPermissions': data['autoGrantPermissions'],
'noReset': data['noReset']
}
print('appium port:%s start run %s at %s' % (port, udid, ctime()))
driver = webdriver.Remote('http://' + str(data['url']) + ':' + str(port) + '/wd/hub', desired_caps)
driver.implicitly_wait(10)
return driver
# 測試函數,在實際運行過程中可以注釋
if __name__ == '__main__':
multi_app_start(devices_list[0], 4723)
multi_app_start(devices_list[1], 4725)
復制代碼

注意:

需要開啟兩個appium服務,且端口號不能一樣
連接的設備主要根據udid連接,而不是根據yaml文件中的deviceName,所以在yaml文件中的deviceName可以隨意設置
ctime()表示當前時間
以上為成功啟動一個後才會啟動另外一個,不是同步啟動兩個設備

最後運行結果為:

對以上代碼封裝成類:

class MultiDevices:
driver: webdriver = None
devices_list = ['U4AIUKFAL7W4MJLR', 'U4AIUKFAL7W4MHUHUDS']
def appium_desire(self, udid, port):
with open(r"E:\study\Fork\WeiboDemo\Weibo\config\desired_caps.yaml", 'r') as file:
data = yaml.load(file, Loader=yaml.FullLoader)
desired_caps = {
'platformName': data['platformName'],
'platformVersion': data['platformVersion'],
'deviceName': data['deviceName'],
'udid': udid,
'appPackage': data['appPackage'],
'appActivity': data['appActivity'],
'automationName': data['automationName'],
'autoGrantPermissions': data['autoGrantPermissions'],
'noReset': data['noReset']
}
print('appium port:%s start run %s at %s' % (port, udid, ctime()))
self.driver = webdriver.Remote('http://' + str(data['url']) + ':' + str(port) + '/wd/hub', desired_caps)
self.driver.implicitly_wait(10)
return self.driver
# 測試函數,在實際運行中可以注釋
if __name__ == '__main__':
mas1 = MultiDevices()
mas2 = MultiDevices()
mas1.appium_desire(MultiDevices.devices_list[0], 4723)
mas2.appium_desire(MultiDevices.devices_list[1], 4725)
復制代碼

三、多進程並發啟動設備

多進程中,同一個變量,各自有拷貝一份存在於每個進程中,互不影響
多線程中,所有變量都由所有線程共享,任意一個比那輛都可以被任何一個線程修改,因此,線程之間共享數據最大的危險在於多個線程同時改一個變量,容易把內容改亂了
所以我使用的是多進程並發啟動設備

yaml文件同上,代碼實現如下:
import multiprocessing
from time import ctime
import yaml
from appium import webdriver
devices_list = ['U4AIUKFAL7W4MJLR', 'U4AIUKFAL7W4MHUHUDS']
with open(r"E:\\study\\Fork\\WeiboDemo\\Weibo\\config\\desired_caps.yaml", 'r') as file:
data = yaml.load(file, Loader=yaml.FullLoader)
def multi_app_start(udid, port):
desired_caps = {
'platformName': data['platformName'],
'platformVersion': data['platformVersion'],
'deviceName': data['deviceName'],
'udid': udid,
'appPackage': data['appPackage'],
'appActivity': data['appActivity'],
'automationName': data['automationName'],
'autoGrantPermissions': data['autoGrantPermissions'],
'noReset': data['noReset']
}
print('appium port:%s start run %s at %s' % (port, udid, ctime()))
driver = webdriver.Remote('http://' + str(data['url']) + ':' + str(port) + '/wd/hub', desired_caps)
driver.implicitly_wait(10)
return driver
# 構建desired進程組
desired_process = []
# 加載desired進程
for i in range(len(devices_list)):
port = 4723 + 2 * i
# target="調用的方法",args="傳入的參數"
desired = multiprocessing.Process(target=multi_app_start, args=(devices_list[i], port))
desired_process.append(desired)
if __name__ == '__main__':
# 啟動多設備執行測試
for desired in desired_process:
desired.start()
# 等所有進程結束後關閉
for desired in desired_process:
desired.join()
復制代碼

結果同上,但同時啟動,控制台輸出的日志中時間一致

對以上代碼封裝成類

class MultiDevicesSync:
driver: webdriver = None
devices_list = ['U4AIUKFAL7W4MJLR', 'U4AIUKFAL7W4MHUHUDS']
def multi_devices_sync(udid, port):
with open(r"E:\study\Fork\WeiboDemo\Weibo\config\desired_caps.yaml", 'r') as file:
data = yaml.load(file, Loader=yaml.FullLoader)
desired_caps = {
'platformName': data['platformName'],
'platformVersion': data['platformVersion'],
'deviceName': data['deviceName'],
'udid': udid,
'appPackage': data['appPackage'],
'appActivity': data['appActivity'],
'automationName': data['automationName'],
'autoGrantPermissions': data['autoGrantPermissions'],
'noReset': data['noReset']
}
print('appium port:%s start run %s at %s' % (port, udid, ctime()))
driver = webdriver.Remote('http://' + str(data['url']) + ':' + str(port) + '/wd/hub', desired_caps)
driver.implicitly_wait(10)
return driver
# 構建desired進程組
desired_process = []
# 加載desired進程
for i in range(len(devices_list)):
port = 4723 + 2 * i
# target="調用的方法",args="傳入的參數"
desired = multiprocessing.Process(target=multi_devices_sync, args=(devices_list[i], port))
desired_process.append(desired)
if __name__ == '__main__':
multi_devices_sync = MultiDevicesSync()
# 啟動多設備執行測試
for desired in multi_devices_sync.desired_process:
desired.start()
# 等所有進程結束後關閉
for desired in multi_devices_sync.desired_process:
desired.join()
復制代碼

補充:

1.進程和線程的區別?

進程是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。

線程有時也被稱為輕量級進程,是程序執行流的最小單元。線程是進程中的一個實體,一個進程可以包含多個線程,但是線程不能包含多個進程。線程自己不擁有系統資源,在單個程序中同時運行多個線程完成不同的工作,成為多線程。

區別:

數據空間的分配,子進程和父進程有不同的代碼和數據空間,而多個線程則共享數據空間,每個線程有自己的執行堆棧和程序計數器為其執行上下文。

可以將進程看成是一個工廠,多個進程就是多個工廠;把線程看成是工廠裡面的流水線,一個工廠中可以同時有多個流水線。

下面是配套資料,對於做【軟件測試】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴我走過了最艱難的路程,希望也能幫助到你!


這些資料,對於做【軟件測試】想要進階的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴我走過了最艱難的路程,希望也能幫助到你!凡事要趁早,特別是技術行業,一定要提升技術功底。希望對大家有所幫助…….


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved