自動化測試應該如何實現多執行緒?

新夢想IT發表於2022-05-18


// 程式 //

程式就是一個程式在一個資料集上的一次動態執行過程,我們編寫的程式用來描述程式要完成哪些功能以及如何完成。

 

// 執行緒 //

執行緒頁尾輕量級程式,他是一個基本的 CPU執行單元,是程式中的實現,執行緒的出現是為了降低上下文切換的小號,提高系統的併發性。

 

// 執行緒與程式 //

一個執行緒只能屬於一個程式,而一個程式可以有多個執行緒。

但是少有一個執行緒資源分配給程式,同一程式的所有執行緒共享該程式的所有資源

CPU分給執行緒,即真正在CPU上執行的執行緒。

 

 

// 多執行緒原理應用 //

1 並行與併發

並行:每個執行緒分配給獨立的核心,執行緒同時執行。

併發:多個執行緒在單個核心執行,統一時間一個執行緒執行,系統不停切換執行緒,看起來像是同時執行,實際上是執行緒不停切換。

 

2 Python的多執行緒

GIL 全域性計時器鎖:摸個執行緒想要執行必須先拿到GIL。

Python的多執行緒:其實同一時間只能執行一個執行緒,但是能實現併發。

3 Python多執行緒應用

不同程式碼執行效率不一樣,我們可以透過多執行緒,形成併發,實現提高效率。

案例: Web自動化,其實 CPU執行完一次命令,大部分時間是在等待,那麼這段時間,CPU會限制或者做其他程式的任務,因此我們可以使用多執行緒,實現多瀏覽器自動化同時執行,從而實現高效率。

 

from  appium import  webdriver from  appium.webdriver.extensions.android.nativekey import  AndroidKey from  appium.webdriver.common.touch_action import  TouchAction from  selenium.webdriver.support.wait import  WebDriverWait import  time from  ddt import  ddt,data,unpack import  threading
data_sum = [    { 'sum_a' : 2 , 'sum_b' : 3 },    { 'sum_a' : 2 , 'sum_b' : 3 },    { 'sum_a' : 5 , 'sum_b' : 10 }]
def   run_first ():    desired_caps = {         'platformName' : 'Android' ,   # 被測手機是安卓          'platformVersion' : '7.1.2' ,   # 手機安卓版本          'deviceName' : 'xiaomi_mix' ,   # 裝置名,安卓手機可以隨意填寫          'appPackage' : 'com.chinatower.fghd.customer' ,   # 啟動APP Package名稱          'appActivity' : 'com.ckd.fgbattery.activity.User_Login_Activity' ,   # 啟動Activity名稱          'unicodeKeyboard' : True ,   # 使用自帶輸入法,輸入中文時填True          'resetKeyboard' : True ,   # 執行完程式恢復原來輸入法          'noReset' : True ,   # 不要重置App          'newCommandTimeout' : 5000 ,         'UDID' : '127.0.0.1:62001' ,         'automationName' : 'uiAutomator2'          # 'app': r'd:\apk\bili.apk',     }    driver = webdriver.Remote( ' , desired_caps)     #login_pwd(1,1)     pwd = driver.find_element_by_xpath( '//*[@text = "密碼登入"]' )    print(pwd.get_attribute( 'text' ))    TouchAction(driver).tap(pwd).perform()    pwd.click()    driver.find_element_by_id( "user_phone_et" ).send_keys( '1' )    driver.find_element_by_id( "sms_code_et" ).send_keys( '1' )    driver.find_element_by_id( "btn_res" ).click()     # 登入錯誤時,無法跳轉進入頁面      try :        WebDriverWait(driver, 3 , 1 ).until( lambda  x: x.find_element_by_xpath( "//*[@text='掃碼換電']" ))        scan = driver.find_elements_by_xpath( "//*[@text='掃碼換電']" )         if  scan:            print( "登入成功" )             return   True      except :        print( "登入失敗" )         return   False

def   run_two ():    desired_caps_and5 = {         'platformName' : 'Android' ,   # 被測手機是安卓          'platformVersion' : '5.1.1' ,   # 手機安卓版本          'deviceName' : 'HuaWei P30' ,   # 裝置名,安卓手機可以隨意填寫          'appPackage' : 'com.chinatower.fghd.customer' ,   # 啟動APP Package名稱          'appActivity' : 'com.ckd.fgbattery.activity.User_Login_Activity' ,   # 啟動Activity名稱          'unicodeKeyboard' : True ,   # 使用自帶輸入法,輸入中文時填True          'resetKeyboard' : True ,   # 執行完程式恢復原來輸入法          'noReset' : True ,   # 不要重置App          'newCommandTimeout' : 5000 ,         'UDID' : '127.0.0.1:62026' ,         'automationName' : 'uiAutomator2'          # 'app': r'd:\apk\bili.apk',     }    driver2 = webdriver.Remote( ' , desired_caps_and5)     #login_pwd(2,2)     time.sleep( 10 )    print( "第二個" )    pwd = driver2.find_element_by_xpath( '//*[@text = "密碼登入"]' )    print(pwd.get_attribute( 'text' ))    TouchAction(driver2).tap(pwd).perform()    pwd.click()    driver2.find_element_by_id( "user_phone_et" ).send_keys( '1' )    driver2.find_element_by_id( "sms_code_et" ).send_keys( '2' )    driver2.find_element_by_id( "btn_res" ).click()     # 登入錯誤時,無法跳轉進入頁面      try :        WebDriverWait(driver2, 3 , 1 ).until( lambda  x: x.find_element_by_xpath( "//*[@text='掃碼換電']" ))        scan = driver2.find_elements_by_xpath( "//*[@text='掃碼換電']" )         if  scan:            print( "登入成功" )             return   True      except :        print( "登入失敗" )         return   False
     # @data(*data_sum)      # @unpack# def login_pwd(sum_a,sum_b):#         pwd = driver.find_element_by_xpath('//*[@text = "密碼登入"]')#         print(pwd.get_attribute('text'))#         TouchAction(self.driver).tap(pwd).perform()#         pwd.click()#         driver.find_element_by_id("user_phone_et").send_keys(sum_a)#         driver.find_element_by_id("sms_code_et").send_keys(sum_b)#         driver.find_element_by_id("btn_res").click()#         # 登入錯誤時,無法跳轉進入頁面#         try:#             WebDriverWait(driver, 3, 1).until(lambda x: x.find_element_by_xpath("//*[@text='掃碼換電']"))#             scan = driver.find_elements_by_xpath("//*[@text='掃碼換電']")#             if scan:#                 print("登入成功")#                 return True#         except:#             print("登入失敗")#             return False
## # 連線Appium Server,初始化自動化環境# driver = webdriver.Remote(', desired_caps)# driver_p = webdriver.Remote(', desired_caps_and5)## login_pwd(driver,1,1)# login_pwd(driver_p,2,2)
if  __name__ == '__main__' :    t1 = threading.Thread(target=run_first,name = 'thread1' )    t2 = threading.Thread(target=run_two,name= 'thread2' )    start_time = time.time()    t1.start()    t1.join()    t2.start()    print( "當前活躍的執行緒有:{}" .format(threading.current_thread()))
    print( "正在執行的所有執行緒:{}" .format(threading.enumerate()))
    print( "正在執行的執行緒數量:{}" .format(threading.active_count()))
    t2.join()    end_time = time.time()    print( "程式執行耗時:{}" .format(end_time - start_time))

 

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69940641/viewspace-2895149/,如需轉載,請註明出處,否則將追究法律責任。

相關文章