介面自動化測試框架搭建的思路

爱老的虎油發表於2024-05-04

引數替換的思路

為什麼替換引數:請求引數不一定全部都是寫死的,有可能存在介面之間的資料依賴

  1. 在Excel中寫入特殊標記(如#key#),說明寫了特殊標記的地方需要做替換處理
  2. 讀取Excel中的引數,透過正規表示式提取出來需要被替換的key,得到一個list
  3. 遍歷list,根據list中不同的引數,去不同的地方獲取對應的資料(如指令碼生成的資料、配置檔案來源的資料、預設從管全域性變數獲取資料)
  4. 獲取到需要替換資料的value,設定為全域性變數(透過類屬性實現)
  5. 遍歷list,透過字串的replace方法進行資料替換
  6. 替換完成後,將替換後的資料轉換成python物件

響應結果處理思路

為什麼處理響應結果:介面返回資料型別不一致,我們後續需要去響應結果中提取引數,解決引數依賴問題(使用jsonpath)

  1. 我們需要的是json資料,對於所有的返回資料我們進行二次封裝,封裝成固定的格式
  2. 傳入響應資料物件,透過json方式去獲取對應的body內容,如果不是json資料那就說明不是我們需要的型別,就會報錯,符合要求的資料,直接進行二次封裝處理

介面斷言思路

  1. 在Excel中新增一個欄位expected_data
  2. expected_data欄位用來存放期望結果(如:{"code": "200"}),可以寫多個key:value鍵值對,期望結果資料是單獨請求結果或者檢視介面文件獲取到的
  3. 獲取期望結果資料,轉換成dict型別,再遍歷字典的key,然後去介面響應結果中透過key獲取對應的value,組成新的字典,這個新的欄位就是實際結果
  4. 透過TestCase類的斷言方法對希望結果和實際結果進行比對(直接比對字典)
  5. 因為字典資料是無序的,只要兩個字典中,key和value這樣的鍵值對是一樣的,則不管位置是否一致,我們都認為兩個字典是相等的

提取全域性變數的思路

  1. 在Excel中新增欄位extract_data
  2. 將extract_data欄位中,寫入需要提取的資料(如:{"token": "523452345234"})
  3. key標識要去響應結果中提取的key,value標是提取key的jsonpath表示式
  4. 獲取extract_data資料,轉換成dict型別,再遍歷字典的key和value,透過key和value(jsonpath表示式),從響應結果中提取對應key的值
  5. 提取出來資料後,透過類屬性設定為全域性變數(屬性的key就是剛才遍歷的key,屬性的值為透過jsonpath表示式提取出來的值)

鑑權思路

為什麼鑑權:一些介面需要登入之後才能夠請求(相當於是介面的前置條件)

  1. 將介面的前置條件放到該介面之前執行,執行後透過提取token的方式設定請求頭完成鑑權
  2. 提取登入介面響應資料中的token,設定為類屬性(全域性變數)
  3. 在請求所有介面之前,判斷一下類屬性是否有token屬性,如果有就將token按照要求放入請求頭中
  4. 後面的介面請求的時候就統一帶上有鑑權資訊的請求頭

傳送請求封裝的思路

  1. 傳送請求之前去呼叫鑑權處理的方法,獲取最新的請求頭資料
  2. 在Excel中,新增is_upload欄位,如果該欄位為1,則為檔案上傳介面,否則為普通介面
  3. 判斷介面是否是檔案上傳介面,如果是就呼叫檔案上傳方法,如果不是就走else邏輯傳送普通請求
  4. 在請求圖片上傳介面的時候,要對應修改請求欄位Content_Type: multipart/form-data; boundary=----WebKitFormBoundaryOavsXm2eeigLNDtG
  5. 為了跨平臺,放到jenkins上做持續整合,將需要上傳的圖片放到專案images目錄下(以iages為例,可隨意調整)
  6. 圖片上傳介面請求完成之後,要將請求頭修改為json格式,否則後續非圖片上傳的介面請求會報錯

資料庫斷言思路

  1. 把圖片上傳的返回的資料提取出來,設定為全域性變數
  2. 拿到全域性變數去資料庫查詢(連結資料庫+拼接sql語句)
  3. 在Excel中新增assert_db欄位存放資料庫斷言的期望結果和實際結果獲取需要執行的sql語句
  4. 先判斷是否需要替換sql的資料,如果要替換,先替換sql語句再執行sql語句,接著斷言
  5. sql語句從哈訊的資料返回是元組,如果是設定了返回值為字典資料,需要取值出來

sql語句替換的思路

  1. 獲取sql語句
  2. 透過正規表示式判斷是否有資料需要替換(有無特殊標記),返回list
  3. 檢查list是否有值,有值說明需要替換sql
  4. 替換sql語句都是從全域性變數中獲取的
  5. 連線資料庫
  6. 替換sql語句
  7. 執行sql語句

未註冊的手機號生成處理思路(註冊)

  1. 透過faker生成一個隨機手機號
  2. 去資料庫去校驗是否已註冊,已註冊了就重新走第1步和第2步
  3. 如果未重複,直接返回未註冊的手機號

url地址中引數替換的處理

  1. 在發請求之前把url地址中的引數替換好就行
  2. url地址中引數的來源,介面響應的結果,提取到全域性變數了
  3. 透過re表示式獲取需要替換的key_list
  4. 遍歷key_list,從全域性變數中獲取對應的資料對url地址進行替換

日誌收集

  1. 日誌要還原使用者的行為(還原測試用例執行的全過程)
  2. 需要輸出日誌的地方:方法的入參、出引數據型別、資料轉換(jsonstr 轉 python物件)
  3. 需要輸出日誌的地方:測試過程的邏輯選擇

為什麼要做資料隔離,資料隔離怎麼處理

需求:資料驅動,每個sheet都是一個場景,或者是一個介面,場景和介面之間為了不影響執行結果,儘量要做到資料隔離.
如何做資料隔離:

  1. 每次執行sheet裡面的測試用例的時候,都清掉全域性屬性中所有自己設定的屬性
    具體步驟:
  2. 讀取測試用例資料(所有的sheet,迴圈讀取,迴圈執行用例)

相關文章