【专项】自动化框架
一、自動化概述
1.1 自動化框架搭建
選語言,python。選測試框架,unittest或pytest。
接口自動化:requests +? appium +seleium。如果是前端,一般遵守PO設計模式。
日志模塊、報告模塊、接入入jenkins
1.2 Pytest和Unittest利弊
參考資料?整體參考?兩者區(qū)別
1. 兩種者之間的關(guān)系
- unittest是Python標準庫中自帶的單元測試框架;
- pytest是第三方單元測試框架;基于unittest
- pytest兼容unittest測試集。
2. 框架選擇
- 從入門難度看,pytest優(yōu)于unittest。簡單靈活,容易上手,文檔豐富;
- 同為第三方庫,pytest的生態(tài)無疑更具優(yōu)勢,社區(qū)的活躍度也更高。pytest具有很多第三方插件比較好用的如pytest-html、pytest-rerunfailures等;
- 從通用性角度看,pytest優(yōu)于unittest
-
測試用例的skip和xfail處理;
1.3 具體差異
| 用例編寫 | 1.測試文件必須先import unnitest;2.測試類必須繼承unittest.TestCase; 3.測試方法必須以“test_”開頭;4.測試類必須要有unittest.main()方法 | 1.測試文件名必須以“test_”開頭或“test”結(jié)尾;2.測試類必須以“Test_”開頭;3.測試方法必須以“test_”開頭 |
| 用例分類執(zhí)行 | 默認執(zhí)行全部用例,也可以通過加載testsuit,執(zhí)行部分用例 | 可以通過@pytest.mark來標記類和方法,pytest.main加入?yún)?shù)("-m")可以只運行標記的類和方法,也可以通過pytest.ini配置markers,執(zhí)行時用-m指定 |
| 用例前置與后置條件 | 提供了setUp/tearDown,只能針對所有用例 | fixture更加靈活,可以在任意自定義方法函數(shù),只要加上@pytest.fix |
| 斷言 | 很多斷言格式(assertEqual、assertIn、assertTrue、assertFalse) | python原生assert,只有一個斷言 |
| 測試報告 | 使用HTMLTestRunnerNew庫 | 有pytest-HTML、allure插件 |
| 失敗重跑機制 | 無 | 使用pytest-rerunfailures插件,–reruns n --reruns-delay n |
| 參數(shù)化 | 需要依賴ddt庫 | 使用@pytest.mark.parametrize裝飾器 |
1.4 pytest assert
pytest使用python自帶斷言
def f():return 3def test_function():assert f() == 4測試斷言異常拋出
def test_zero_division():with pytest.raises(ZeroDivisionError):1 / 01.5 pytest裝飾器學習
@pytest.mark.skip("skip test_a") 跳過測試用例
@pytest.mark.xfail()預期失敗用例
@pytest.mark.parametrize參數(shù)化,后邊直接接入?yún)?shù)化的值。
@pytest.mark.parametrize("參數(shù)1,參數(shù)2",[(數(shù)據(jù)1,數(shù)據(jù)2),(數(shù)據(jù)1,數(shù)據(jù)2)])
@pytest.mark.parametrize("a,b,c",[(1,3,4),(10,35,45),(22.22,22.22,44.44)])
1.6 ALLURE插件
pytest allure生產(chǎn)報告,jenkins上有插件
- pytest –alluredir allure-results:代表生成的json文件存放位置
- allure generate allure/ -o report/ --clean:生成html報告
- allure open report和 allure serve:打開html報告
1.7 Q&A
【問題一】pytest 6.0.0 @pytest.mark.skip有問題
【解答一】直接升級:https://blog.csdn.net/tomoya_chen/article/details/108153581
三、接口自動化
四、UI自動化
4.1 appium工具介紹
4.2?環(huán)境安裝
4.3?啟動步驟
4.4 PO設計模式
每一個page寫成一個類,當不同的case用到的時候,直接從這個class來獲取控件。當有控件失效的時候,只需要改這個類即可
分頁面去維護空間,所有的定位都是在Page頁面。
常見知識點
appium其他知識點
輸入字符串:send_key(u'add')
輸入漢語:python3+appium,怎么輸入中文,并且調(diào)用搜狗或調(diào)出手機鍵盤;_linmumum的博客-CSDN博客
如何坐標定位:self.driver.tap([(711, 761), (909, 959)], 100):python必須給出兩個坐標,100(duration)表示點擊時間
appium啟動包的時候需要哪些屬性:
platformVersion、platformName、deviceName、appPackage、appActivity、noReset(是否清除app的數(shù)據(jù))
Desired Capabilities:automationName:測試引擎,默認appium,app安裝app的電腦上的路徑。udid(通過adb devices獲取)當電腦安裝多個手機時,必須設置。autowebView表示是否以網(wǎng)頁的形式展示空間節(jié)點間的關(guān)系(div/xx等)
學習的定位的方式
self.driver.find_element[s]_by_id
self.driver.find_element[s]_by_class_name
self.driver.find_element_by_android_uiaotumator('new UiSelector().text("行業(yè)')')、Uiselectort().textContains()、UiSeletor().textStartsWith()、UiSelector().textMatches("*行*")、Uiselector().resourceId()、Uiselector().className()、Uiselector().description()
self.driver.find_element_by_android_uiautomator('resourceId(XX).text('')')/self.driver.find_element_by_android_uiautomator('className(XX).text('')')?
self.dirver.find_element_by_android_uiaotumator('resourceId()').childSelector('className()')//父子查找
self.driver.find_element_by_android_uiautomator('resourceId(A)').fromParent('resourceId(C)')//查找的是A節(jié)點的子節(jié)點C的上一個子節(jié)點B,B和C是同級別的,如果沒有B,返回的則是C
instance和index的區(qū)別:instance是把相同類型的一個節(jié)點下的子節(jié)點、子子幾點都放到一個列表中。index是把相同類型的子節(jié)點放到一個列表中。
輸入文字:desired需要設置desired['unicodeKeyboard']=true和desired['resetKeyborad']=true:意思是使用appium的鍵盤,然后重置鍵盤
打開多的appiumserver (一個appiumserver是有兩個端口的)然后通過不同的udid運行腳本
toast支持:desired capibility,aotumationName = uiaotumator2才支持
WebDriverWait().until()智能等待\time.sleep()是直接等待多久時間
webview:混合應用,要切換上下文(獲得這個頁面的環(huán)境)。android.webkit.Webview是網(wǎng)頁。需要開發(fā)配合設置,webview.setWebContentsDebuggingEnabled(true)。即調(diào)試模式。在chrome中chrome://inspect/#devices,可以看到手機上網(wǎng)頁。然后可以定位(需要fanqiang)。UC 開發(fā)者調(diào)試工具及使用
GitHub - openatx/uiautomator2: Android Uiautomator2 Python Wrapper
連接一個Android機器需要參數(shù)
APP連接 from appium import webdriver#導入appium包#連接手機app初始化的一些信息 desc={}desc['deviceName']='127.0.0.1:62001'#手機設備名稱,adb devices desc['platformVersion']='4.4.2'#手機版本,在手機中:設置--關(guān)于手機 desc['platformName']='Android' #手機類型,ios或android #輸入命令,獲取app信息:aapt dump badging C:\Users\83473\Desktop\mobileqq_android.apk desc['appPackage']='com.tencent.mobileqq'#包名 desc['appActivity']='com.tencent.mobileqq.activity.SplashActivity'#啟動入口 desc["unicodeKeyboard"] = "True"#appium提供的一種輸入法,可以傳中文。測試時直接用這個輸入法 desc["resetKeyboard"] = "True"#程序結(jié)束時重置原來的輸入法 desc["noReset"] = "True"#不初始化手機app信息(類似不清楚緩存)#啟動服務端,再cmd窗口輸入appium.如果appium沒有安裝好,可以打開appium-desktop.也相當于啟動了服務driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',desc)#訪問服務接口,并啟動手機app。url參數(shù)是當appium啟動后,默認訪問服務地址和接口常見ADB命令
adb ?install -r xx.apk? ??adb uninstall packagename
adb logcat | findstr 'crash'?將日志數(shù)據(jù)輸出到屏幕上
adb bugreport?查看bug的報告,如dumpsys ,dumpstate ,和logcat 信息
adb push <本機路徑> ?<手機路徑> ?從本地電腦推送信息到手機上
adb -P -s shell?am:am 表示activity manager,可以啟動Service、Broadcast,殺進程,監(jiān)控等功能,這些功能都非常便捷調(diào)試程序
adb -P -s shell pm:為包管理(package manager)的簡稱,可以使用pm工具來執(zhí)行應用的安裝和查詢應用的信息、系統(tǒng)權(quán)限、控制應用,pm工具是Android開發(fā)與測試過程中必不可少的工具
常見問題解決方案
?Q:appium在android端彈層無法獲取元素
https://blog.csdn.net/m0_38115806/article/details/81182150Q:Try to increase the 20000ms adb execution timeout represented by 'adbExecTimeout' capability
主要是模擬器有點慢,超時了,解決方案:https://www.jianshu.com/p/adc685d0ce15Q:Appium Desktop如何命令行啟動
node /Applications/Appium.app/Contents/Resources/app/node_modules/appium/build/lib/main.js --address 127.0.0.1 --port 4723http://www.automationtestinghub.com/3-ways-to-start-appium-server-from-java/
總結(jié)
- 上一篇: 学校计算机教室运行情况汇报,电脑教室管理
- 下一篇: python中计算a的b次方