天天看點

自動生成測試腳本方案淺析

作者:閃念基因

構想篇

作為一名接口自動化測試工程師,日常面臨最多的工作就是編寫接口自動化測試腳本,那麼,在 coding 的過程中最讓你覺得枯燥和乏味事情有哪些?

痛點

  • 每次拿到新接口,我們要手動參照文檔在腳本中生成一份接口類,參數越多花費時間越多
  • 需求不同,但健壯性和部分業務用例重複性高
  • 想重構腳本,接口資料和用例這塊純編寫的工作量就會讓人望而怯步
每天都要花上30%的時間去寫那些不太需要思考的腳本,這真不夠自動化!

解決方案

  • 解析文檔
  • 梳理适合自動生成的腳本
  • 通過工具生成這部分腳本

預期目标

解放雙手,降低純手力勞動占比,進而給自己提供更多的時間去思考、了解産品和設計更多“聰明”的用例

實踐篇

自動化擷取接口資訊

分析接口自動化腳本結構和内容

自動生成測試腳本方案淺析

自動化測試腳本結構圖

篩選工作量大又有規律可循的腳本

此處規律不宜太過于複雜,可先選邏輯簡單的部分,我們主要選取以下兩部分
  • 接口類,工作時間占比30%~50%,特點:結構特定、資料來源于其它平台
自動生成測試腳本方案淺析

接口類結構圖

  • 用例部分,工作時間占比30%~50%,特點:重複度高于80%左右、生成邏輯可描述
自動生成測試腳本方案淺析

用例結構圖

解析接口文檔

接口資訊來源于接口文檔,目前市場上比較主流的幾個接口文檔管理工具有Swagger、RAP、WIKI 或者其他普通文檔工具。

下面以解析接口檔案為目的分析比較下幾款工具的差別:

.

分類 Swagger RAP WIKI
描述 用于生成、描述、調用和可視化RESTful風格的Web服務的架構 可視化接口管理工具 可供多人協同創作的超文本系統
格式 json json html
規範 各個參數、傳回值的具體結構、類型有統一規範 同swagger 需要自己約定規範
成本 直接嵌入項目中,通過開發時編寫注釋,自動生成接口文檔,成本較低 需要開發按照平台規則手動輸入,成本較高 需要按照約定規範,手動輸入,成本較高

如果有條件,大家可以根據開發成本和解析接口檔案的難易程度來綜合考慮,确定使用哪個平台管理接口

我們項目是 Swagger 和 WIKI 混合使用,由于日常測試看 WIKI 居多,是以早期采用 Python 爬蟲利器 BeautifulSoup 來解析WIKI html頁面

from bs4 import BeautifulSoup
           
  • soup = BeautifulSoup(html_doc)
  • title_string = soup.title.string
  • # 後面繼續解析其他需要用到的接口内容
  • 使用下來發現通過wiki來擷取接口資訊的一些弊端

    1. 完全靠人工來限制書寫規則不靠譜
    2. 對于複雜的嵌套參數,稍有不按照規範來的,就會導緻腳本解析錯誤,很大程度上造成了解析的難度
    3. 在html上準确的定位資訊遠比在json上難度大,相容性差

    于是,嘗試解析Swagger傳回的json來獲得接口資訊為後面生成腳本做準備

    {
               
  • "swagger": "2.0",
  • "host": "xxx",
  • "basePath": "/",
  • "tags":[
  • {"name":"xxx-controller","description":"xxx"},
  • ...
  • ],
  • "paths": {
  • "<接口位址1>": { ... },
  • "<接口位址2>": { ... },
  • ...
  • },
  • "definitions": {
  • "<實體類1>": { ... },
  • "<實體類2>": { ... },
  • ...
  • }
  • }
  • 使用以下方式拿到json結果後,就可以直接按照處理字典的方式來擷取需要的内容。

    graph LR
               
  • json-->ApiObj
  • 對于swagger.json的解析和代碼生成官方也提供了一些可供使用的庫swagger-codegen (java),由于程式設計語言的限制,我們使用了python自己解析

    現在,我們已拿到生成代碼所需要的資訊

    自動生成代碼

    代碼生成工具

    class CodeGeneratorBackend():
               
  • def begin(self, tab="\t"):
  • self.code = []
  • self.tab = tab
  • self.level = 0
  • def end(self):
  • # return string.join(self.code, "")
  • return "".join(self.code)
  • def write(self, string):
  • self.code.append(self.tab * self.level + string)
  • def indent(self):
  • self.level = self.level + 1
  • def dedent(self):
  • if self.level == 0:
  • raise SyntaxError("internal error in code generator")
  • self.level = self.level - 1
  • """調用方法,開始生成代碼"""
  • c = CodeGeneratorBackend()
  • c.begin(tab=" ") # 定義縮進方式
  • c.write("def function(self):\n")
  • c.indent() # 縮進
  • # 方法體
  • c.dedent() # 回退上一次縮進
  • 接口類部分腳本生成規則

    由于我們接口屬于是存儲在類結構中,是以根據目前腳本的API Object接口進行周遊替換即可

    接口用例部分代碼生成規則

    特殊值用例

    給每個參數生成為0、None、空字元串這樣特殊值的用例

    定位參數類型

    通過接口參數給出的類型,生成符合該類型的值,和一些不符合參數類型的值(健壯性),指派後生成用例,如下代碼示例
    自動生成測試腳本方案淺析

    定位特定關鍵詞參數

    • 遇到page相關參數可生成分頁用例,具體分頁測試用例細節就不贅述
    • 遇到類似starttime,endtime參數,可生成兩個時間參數和目前時間前後比較的用例,兩個時間參數前後比較的用例
    自動生成測試腳本方案淺析
    該生成規則需要和開發約定一些基本原則,另外也需要我們在日常測試中多歸納總結,找出那些有固定規律的用例,想辦法定位生成這類用例

    定位接口類型

    • 查詢類接口:可生單參數查詢、組合參數查詢、全參數查詢等用例
    • 更新類接口:可生成單條更新每個參數,組合更新,全量更新等用例

    自動生成測試腳本工具介紹

    架構流程圖

    自動生成測試腳本方案淺析

    工具擴充性

    • 用例生成規則可擴充,從架構圖中可以看到,用例規則這快自成獨立模版,可單獨維護,便于後續新規則的加入
    • 代碼模版可擴充,不同團隊對于代碼規範、基礎模版的樣式都不一樣,可自定義生成模版的樣式,增加了工具的靈活性
    • 支援多種資料類型轉換,後續可擴充生成API對象、參數字典或其他資料模式
    自動生成測試腳本方案淺析

    成果和後續行動

    效率提升

    以一個優惠券需求為例,大約新增/更新了10個接口(約150個參數請求參數,100個傳回參數),包含增删改查幾種類型,編寫加調試腳本在使用工具前後所花費時間對比,如下:

    類型 工作量描述 不使用工具 使用工具 效率提升
    接口類 約250個參數 2日/人 1小時内 94%
    健壯性用例 約1000條用例 2日/人 1日/人 50%
    平均 --- --- --- 74%

    從上例可以看出使用腳本後的效率提高了近一半,而從設計到編寫完第一版工具僅花費了2~3個工作日,還是非常值得一做的。

    聚焦測試

    • 腳本編寫工作量的減少,會增加産品測試思考的時間,完善用例,檢查覆寫面等

    統一規範

    • 統一了接口類輸寫規範,便于團隊内部維護和了解腳本
    • 統一基本用例生成思路,規避測試工程師在設計基本用例設計時有所遺漏;統一用例輸出格式,便于他人了解和維護用例

    重構利器

    • 如果有計劃做腳本重構,使用工具後可以成倍的節省編寫接口資訊和用例部分腳本的時間

    後續疊代優化點

    • 目前用例的生成思路大多還局限在單參數上,多參數的生成思路還較少,後續會通過頭腦風暴等形式來擴充更多的用例的生成思路
    • 通過實際調用接口,擷取結果,提高自動生成用例期望結果的準确性,繼而節省更多對部分期望結果做調整的時間投入

    最後想說的是,這個小工具的設計思路遠比實作更重要,無論使哪種語言或庫都可以實作解析檔案和代碼的生成,重要得是按照怎樣的思路去生成腳本,在這部分上後續我們也有很多需要摸索的地方。

    作者:玉婷

    來源-微信公衆号:滬江技術

    出處:https://mp.weixin.qq.com/s/H1VJ2x6YD9LNytpp4Mtf9A

    繼續閱讀