# 1. 撰寫測試腳本 :::info 簡介: 這部分介紹如何使用 Appium 和 Python 撰寫自動化測試腳本 ::: # 2. 撰寫流程 1. 封裝"測試配置"為模組 - 將測試需要的資訊建成字典,例如: HTC測試、Samsung測試 2. 初始化 Appium 驅動設置 - 配置 Desired Capabilities - 啟動 Appium 驅動 3. 封裝"頁面操作"為模組 - 將 app 的各個頁面操作,例如: 點擊按鈕、輸入文字 4. 主測試腳本與 Appium 驅動集成 - 撰寫主測試腳本,並調用已初始化的驅動與 Appium 交互 - 執行各個測試用例的步驟,驗證應用的功能是否符合預期。 # 3. 專案架構 ### 規劃架構方向 - ==**專案名稱/**== - ==scripts/== - ==config/== 配置文件 ( .json) - ==drivers/== 驅動 Appium Server 的 code ( .py) - ==utils/== 頁面操作模組 ( .py) - ==tests/== 編寫測試 ( .py) - ==apks/== - 測試要用的 apk 檔 ### 目前架構  # 4. 腳本內容 ## step0. 命名專案 在 c 槽下開了一個新資料夾,命名為 Worky_Automation_Testing_1 當專案名稱  import 時會判斷該資料夾是不是模組 所以大部分資料夾內會有一個空的 init.py檔 ## step1. 封裝"測試配置" 點擊專案根目錄創建新資料夾,命名為 scripts  在 scripts 資料夾下方創建 config 資料夾  在 config 資料夾下方創建測試必要的文件 我這邊把這些資料封裝成字典,存為 json 檔 分別是 app, device, test #### app_config 儲存測試 Appium Server 必要的 capability --- :::info app_config.json 目前不需要新增,未來有新的 app 可以擴充該字典 :::  我把 app 的相關資訊封裝在這個包 "app" 定義 apk 檔儲存位置 "appPackage" 定義 app 的包名 "appActivity" 定義啟動 app 位置 (這邊可以反編義 apk 查看 app 架構,目前 app 限制必須要從啟動頁面進入) #### device_config 也儲存測試 Appium Server 必要的 capability --- :::info 換其他實體機測試時 device_config.json 可以方便的執行擴充 :::  我把測試機的相關資訊封裝在這個包 "deviceName" 定義測試機的名稱 "platformName" 定義作業系統 "platformVersion" 定義OS版本 #### test_config 儲存測試時需要先配置好的條件 --- :::info 啟動自動化測試前需要確認該配置有無問題 :::  例如: 想要測試的手機號碼、測試環境等 ## step2. 初始化 Appium 驅動 在 scripts 資料夾下方創建 drivers 資料夾  在 drivers 資料夾下方創建用來呼叫 Appium server 驅動的模組 #### setup.py 檔來管理 開/關 driver --- :::info 沒有換 webdriver 端口的情況下不需要更動 目前是根據 Appium 預設的 127.0.0.1:4723 本機位置 ::: 先 import 剛剛配置的文件 跟 webdriver 模組  load_json, validate_device_and_app 是用來檢查 json 檔是否正確導入  定義函數 start_driver  51行 這邊調用剛剛配置的 app_config 跟 device_config 並對應到 52-61 行 start_driver 函數多加一個 noReset 變數來判斷這次啟動要不要清掉緩存 62行 紀錄啟動時間戳 67行 implicitly_wait 函式定義最多等待 10 秒,超時則退出並報錯 68行 return 連到的 driver 跟 開始時間 定義函數 stop_driver  呼叫函式時退出 driver 並計算花費時間 ## step3. 封裝"頁面操作" 在 scripts 資料夾下方創建 utils 資料夾  在 drivers 資料夾下方創建跟"頁面操作"相關的模組 自動化測試包含 定位 跟定位到後的操作 點擊,輸入,滑動,圖片操作 所以我創建了五個模組每個模組內只放了一個 class 來管理定義的函數 #### location_action.py --- :::info 我把顯示等待跟定位相關放在該模組 :::  positioning_method_dict 跟 conditions_dict 分別儲存了用來定位的資訊跟判斷元素的狀態  大部分模組會調用 wait_for_locate 來先定位  wait_for_locate 最少要放兩個變數 1.定位方法 跟 2.元素資訊 示範函數 :  condition 跟 timeout 變數有預定義值 可視情況調整判斷狀態跟等待時間 #### click_action.py --- :::info 我把點擊相關放在該模組 :::  目前有根據定位位置點擊的函數 click_by_locating 跟根據座標點擊的函數 click_coordinate_by_adb、click_coordinate_by_appium click_by_locating 最少要放三個變數 1.定位方法 2.元素資訊 3.命名該按鈕 示範函數 :  click_coordinate_by_adb、click_coordinate_by_appium 僅須給座標值即可 有給一個 forloop 變數來連點(預設點1次) 示範函數 :  不建議通過座標點擊 他會根據像素質不同而有誤差,所以理論上要自己調整位置 可以定義計算方位函數來改善問題 #### input_action.py --- :::info 我把輸入相關放在該模組 :::  目前有根據定位位置做輸入的函數 input_by_locating(send key)、input_with_keycode(keycode) 跟直接做輸入的函數 direct_input 放的變數同上 但 buttom_name 改為 text_name,用來添加自動化輸入的值 因為這是 UI 的自動化測試,所以在編寫腳本時不能寫一些會被前端擋的值 示範函數 :  input_with_keycode 跟 direct_input 用在輸入數字鍵盤時(e.g.驗證碼) #### swipe_action.py --- :::info 我把頁面滑動相關放在該模組 :::  目前有直接滑動的函數跟滑動到定位元素出現的函數 變數需要帶入左側座標跟右側座標共 4 個變數 如果要判斷元素出現,變數要加最後出現的元素資訊 示範函數 :  #### image_action.py --- :::info 我把圖片處理相關放在該模組 :::  我先定義了一個判斷 adb 正確調用 然後定義了兩個截圖函數 screenshot_pic : 用來處理測試畫面截圖 用時間戳跟 text 變數命名 screenshot_for_code : 用來處理驗證碼(打卡碼)截圖 這部分我固定命名 讓後面的一次性 code 截圖覆蓋前面的截圖 crop_pic : 用來裁切圖片 需要給左上跟右下的座標 處理驗證碼時把整個畫面裁切成要提取數字的部分會更好的辨識 打卡碼跟驗證碼的提取數字這邊分成兩個函數  extract_work_codes : extract_captcha : 在圖片辨識上目前打工端的驗證碼會直接帶入輸入框,加上輸入鍵會影響 OCR 成功率,目前改用正則表達式來摘掉前後文字,僅保留中間數字 extract_captcha_forloop : 是目前主要用來辨識安卓打工端驗證碼的方式,安桌打工端的第一碼有輸入鍵會導致辨識錯誤,所以加上 forloop 來解決 這樣理論上有極低的機率辨識超時,目前沒有發生 extract_test : 是一開始用來辨識的 OCR 模型,嘗試做影像處理在進行辨識 安卓打工端驗證碼目前只有大約80%辨識成功率 縮小截圖範圍可以提高但是該模型不可能100%辨識成功,需要修改 示範函數 :  ## step4. 編寫主測試腳本 在 scripts 資料夾下方創建 1.tests 跟 2.pages 資料夾   tests 資料夾是放主測試流程的 code pages 資料夾是放調用模組去頁面操作流程的 code 簡單來說是 pages 裡的腳本做了各種頁面操作(import action模組,且關心的是各部分單元測試有無正常) tests 裡的腳本是各個 pages 裡的腳本合在一起(import pages內的模組,相當於腳本之間的整合測試) 例如 : tests/employer_register_test.py :  是商家端註冊到找工作頁面的腳本 包含了 1.連線 2.onboarding 頁面 3.換環境 4.登入 5.新增店鋪 6.紀錄 log 2-5 被我做成 pages 內的測試腳本 這樣我只需查看 tests 內的腳本就可以更快掌握測試流程 pages/change_einvironment.py :  他調用了很多操作(例如點擊、輸入)的模組來完成換環境 # 5. 執行測試 這邊用 python -m 來執行腳本  模組內有調用 adb 在控制台做輸入輸出,如果用 python -u 來執行,可能會因為非緩存模式問題報錯 下載 "Vysor" 查看執行畫面 
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up