1.前言
目標
- 使用Python結合Airtest進行移動端的自動化測試
- 基於開源代碼DIY
- 實現一個完整的項目框架
軟件准備
- python3
- Pycharm
- AirtestIDE
- 安卓手機或者模擬器
2.准備工作
- 項目目錄結構搭建
- 配置的概念
- 使用pycharm寫airtest相關腳本
2.1目錄結構搭建
1.Base
- 存放公共方法文件
2.Logs
- 存放日志數據,截屏圖片
3.TestCase
- 存放測試用例
4.TestData
- 存放測試數據
5.TestSuite
- 存放測試套件 組裝測試用例
6.Report
- 存放測試報告
2.2 項目集成unittest
為什么要使用unittest:
1)能夠組織多個用例去執行
2)提供豐富的斷言方法
3)可以使用UnitTest來管理測試用例
4)已經實現了很多基本功能避免重復造輪子
airtest腳本移植到python
因為我們在新建腳本時就是采用的py腳本。
里面使用的語法就是Python語法。
所以我們可以直接把文件內容粘貼復制到Python運行
3.項目存在的問題
- 各個case互相存在關聯性
- 報告沒有獨立
3.1 實現每個case有對應的報告的方案
思路:
每個case要產生自己的報告 那么應該在初始化的時候 有一個單獨的文件夾存放自己運行過程中產生的日志數據,等待生成報告的時候在讀取該文件夾渲染到指定報告文件
解決方案:
- 初始化方法auto_setup() 里的logdir 參數決定了你case運行過程中產生的日志存儲到哪里,所以只要指定logdir為一個你想要存儲的路徑地址即可
- simple_report()內的logpath參數 決定生成的報告上的日志數據從哪讀取,所以只要將該參數的值設置的跟logdir參數一致即可。存到哪里就從哪里讀取。
- simple_report()內的output參數 決定報告輸出到哪里。
重寫auto_steup()
為了讓每個case有自己的報告,那么每個函數都需要調用一次auto_steup(),但是auto_steup()里面還包含了連接操作,這樣做意味中調用一次函數就連接一次。這顯然是不合理的。所以我們需要重寫auto_setup()
思路:
原本的auto_steup()實現了建立連接和創建日志文件夾兩個功能。那我們可以模仿他的代碼,進行重寫。重寫兩個方法一個就是建立連接一個就是創建日志文件夾
3.2 case執行過程中即使報錯,也要產出報告,並指出錯誤原因
思路:
即使程序報錯也要執行報告生成的方法 捕獲異常
解決方案:
try execpt else finally
捕獲異常后程序出錯報告顯示依舊是通過
解決方案: 在異常內使用log()方法
4.裝飾器優化代碼
每個case中,會發現有很多的重復操作 如建立日志文件夾,都需要異常捕獲,然后生成報告這些操作。那這些操作可以使用裝飾器來進行優化。
4.1 裝飾器的常見應用場景
引入日志
函數執行時間統計
執行函數前預備處理
執行函數后清理功能
權限校驗等場景
4.2實際應用
def get_parameter(logname):
"""
裝飾器接收參數
:param logname: 日志文件夾名稱
:return:
"""
def outer(func):
def inner(self,*args, **kwargs):
only_set_logdir(LogsDIR + logname)
try:
arg = func(self,*args, **kwargs)
except Exception as e:
print(e)
log(e, snapshot=True)
raise e
finally:
simple_report(__file__, logpath=LogsDIR+logname, output=ReportDIR +logname+".html")
return arg
return inner
return outer
raise使用場景:
比如在unittest框架中若不使用 raise 拋出異常,系統是看代碼有沒有報錯,
原本代碼是有1個錯誤,但我們使用except捕獲異常了,對於代碼來說這是你期望的錯誤,你已經自己把它捕獲了
但代碼整體執行並沒有報錯,對於unittest來說就沒有異常了
所以要 用到拋出異常,unittest就會判斷該條case執行失敗
5.BeautifulReport的使用
5.1目標
- 用BeautifulReport生成測試報告
- 重寫BeautifulReport源碼實現高級自定制
- 實現報告整合
5.2安裝
pip install BeautifulReport
5.3報告功能自定制
BeautifulReport的頁面的確很beautiful,
但是如果將這個頁面和我們的airtest生成的報告結合起來?
相對於BeautifulReport產出的只是一個目錄頁面,我們需要一個鏈接跳轉到指定詳情頁面
5.4源碼重寫
Python部分源碼的重寫
需要改變的其實就是字段的新增以及新增字段的顯示
目標:新增兩列(開始運行時間和報告詳情列)
主要改動的地方在於以下兩個函數
1、get_testcase_property: 添加新增字段的獲取
2、 修改MakeResultJson 里的__repr__ 使新增的字段能夠正常壓縮對應
報告模板頁面的修改
template.html文件新增字段 th新增兩列
template.html文件新增字段 td新增兩列
實現效果

5.5 airtest報告詳情
1.進入詳情頁面沒有樣式
原因
生成報告時的css樣式是用的絕對路徑
解決思路
將airtest生成報告所需要的css,js等一些文件夾也放到靜態服務器,后期生成的報告引用文件都引用服務器地址
2.進入詳情頁面沒有日志圖片數據
原因
日志圖片數據也是用的絕對路徑
解決思路
將這些log數據也放到靜態服務器,后期生成的報告引用文件都引用服務器地址
6.用flask搭建簡單服務器
- 用flask搭建簡單服務器
- 能夠將報告放在服務器遠程訪問
1靜態文件和模板文件
靜態目錄
在項目 目錄下創建 static 文件夾
運行服務即可通過 地址:端口/static/文件路徑 訪問該靜態文件
7. 實現效果

可以自定義修改配色

新增報告目錄頁

8. 再優化
上傳報告至ftp服務器
目前此方案已經完美替代了之前用flask來實現查看報告的問題

還可以配合腳本進行自動上傳報告至ftp服務器(百度ctrl+c的代碼,嘿嘿)

修改BearutfulReport報告中的資源引用
第一種是默認引入的Bootstrap相關 css、js文件是直接使用 BootstrapCDN 提供的鏈接
第二種是把資源上傳到服務器
最后一種是引入本地相對路徑下的資源
修改報告詳情也就是airtest報告中的資源引用
需要在源碼中進行修改
除此之外,還要修改airtest報告中的測試數據讀取路徑
讀取的測試數據有:log、操作步驟中顯示的大小圖片以及用例中點擊的圖片
至此,報告中所有的資源引用都改為了相對路徑,可以不再受發送限制,報告可以打包放在任何位置,也可以離線查看
項目目前已經搞得差不多了,后期也就寫寫測試用例,跑跑腳本,優化優化啥的!
后面可能也會在公司內部后台新增一個tab頁面專門用來展示測試報告吧,完結 !!!
