Httprunner 文件上傳場景

使用Httprunner在作接口自動化的時候,常常會遇到須要上傳文件的場景,下面講一下關於Httpruner文件上傳的用例編寫。


web

1. 建項目

首先咱們使用httprunner的腳手架快速搭建一個工程json

httprunner --startproject demo

生成的工程目錄結構以下圖api

工程目錄
簡單介紹一下這些目錄的做用,app

  • apis  放接口的目錄
  • testcases  放用例的目錄
  • testsuites   放用例集的目錄
  • reports   生成的測試報告目錄
  • .env   存放系統環境變量
  • debugtalk.py   編寫動態邏輯函數



2. 抓包與解析

本文使用的是Fiddler抓包工具進行抓的包,訪問百度識圖網站PC版 ,點擊本地上傳,選中本地一張圖片後上傳。那麼在Fiddler抓包工具中,咱們抓到數據大體以下圖所示cors

接口數據

選中該接口,點擊File->Export Sessions->Selected Sessions, 彈出數據包類型選擇,選擇HTTPArchive v1.2,給文件命名,這裏命名的是upload,那麼將獲得一個upload.har文件函數

類型選擇


3. 用例編寫

打開DOS,進入到文件所在目錄,執行下方命令,將har文件轉成yaml文件, 獲得文件upload.yml, 文件內容以下圖工具

har2case -2y upload.har

樣例圖

咱們注意到,其實這個接口呢,主要就是傳遞了兩個參數值,一個是data,就是圖片數據,另外一個就是params中的uptime,這是一個13位數的時間戳。其中呢,data數據是能夠每次都不變的,但uptime是要隨時間變化的,這其實也是一種過濾或者說校驗手段,保證每次上傳圖片的惟一性和有效性。

測試

3.1 處理時間戳問題

關於時間戳呢,在debugtalk.py文件中編寫一個獲取當前時間戳的動態函數網站

import time
  
  def getTimeStamp():             # 獲取一個13位數的時間戳
        return int(time.time()*1000)

將upload.yml文件中的時間戳替換成動態函數以後,就能夠無限次數上傳剛纔上傳的那張圖片了。更改以下ui

uptime: ${getTimeStamp()}

3.2 處理圖片上傳問題

那麼若是咱們想要上傳其餘圖片呢,思路也是差很少的,只須要把data中的數據換成新的圖片的數據便可,也能夠像獲取時間戳同樣寫一個帶參數path(圖片路徑)動態邏輯函數,函數讀取圖片並對圖片進行base64編碼以及設置boundary,返回編碼後的數據。這樣相對來講是複雜一些,對於不一樣的接口編碼函數甚至須要更改,爲何呢?咱們看到這兩張圖

webform
-------------------------------------------圖片分割線-----------------------------------------------------------
data

圖一顯示的就是data在webform中的樣子,圖二顯示的就是data中的raw數據(省略了不少)。從圖一和圖二咱們能夠知道,若是要寫一個關於讀取圖片並編碼的函數的話,這個函數的返回值中,不只被要求包含圖片的base64格式數據,還要含有其他三個參數的key與其對應的value,就是 tnimage_sourcefrom這三個key,以及他們的值。

寫這樣的函數其實也不困難,但若是另一個接口除了圖片數據以外又有其它參數要求呢,這個時候就又須要些另一個編碼函數了, 那麼有沒有更方便一些的方式呢?

有,接着往下看!

前面都是鋪墊,下面纔是重點,重點,重點!!!





方法一   使用upload關鍵字

爲了方便文件上傳呢,Httprunner 2.4.1以上版本支持upload關鍵字,能夠在請求中添加相應參數便可完成圖片上傳。以剛纔的百度圖片上傳爲例,使用關鍵字upload後的代碼是

config:
    name: testcase description
    variables: {}
teststeps:
-   name: /upload
    request:
        verify: False
        upload:
            image: logo.jpg
            image_source: PC_UPLOAD_FILE
            tn: pc
            from: pc

        headers:
            Sec-Fetch-Dest: empty
            Sec-Fetch-Mode: cors
            Sec-Fetch-Site: same-origin
            User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
                (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36
            X-Requested-With: XMLHttpRequest
        method: POST
        params:
            uptime: ${getTimeStamp()}
        url: https://graph.baidu.com/upload
    validate:
    -   eq:
        - status_code
        - 200
    -   eq:
        - headers.Content-Type
        - application/json
    -   eq:
        - content.is_intervene
        - false
    -   eq:
        - content.status
        - 0
    -   eq:
        - content.msg
        - Success

是否是很是很是簡單呢,直接使用upload字段就能夠完成編碼並上傳的功能了。在upload字段下面,咱們有四個參數:image, image_source, tn, from

很眼熟吧,這四個參數就只以前咱們提到的那些參數了,其中咱們只須要重點關注image, 由於這個key的值是一個file,也就是咱們須要上傳的文件,因此這裏填寫的就是咱們須要上傳的圖片的路徑。而這個圖片路徑須要很是注意,它必定是相對於運行路徑。以個人項目文件結構爲例

目錄結構

如圖所示,Logo.jpg文件與api,reports,testcases,testsuites等是處於同一層級的,Logo.jpg和它們都是在根目錄demo下的子層級,不要當作屬於testsuites了。若是在demo中執行腳本,即命令

hrun api/upload.yml

那麼image的值就Logo.jpg。 若是進入到api中執行,即命令

hrun upload.yml

那麼image的值就是 ../Logo.jpg, 由於圖片在api裏的上一層級。這一點須要重點注意!!!

此外呢,可能你們也注意到使用upload字段的腳本下Headers選項中Content-type被刪除了,這是由於upload會自動生成對應的Content-type,不須要多此一舉了,否則遇到各類奇奇怪怪的問題都無從定位。

今天寫不動了,也寫不完了,明天繼續寫....
相關文章
相關標籤/搜索