使用Airtest構建移動端自動化測試框架(記錄貼)


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.項目存在的問題

  1. 各個case互相存在關聯性
  2. 報告沒有獨立

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頁面專門用來展示測試報告吧,完結 !!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM