python+pytest介面自動化(12)-自動化用例編寫思路 (使用pytest編寫一個測試指令碼)

給你一頁白紙發表於2022-03-28

經過之前的學習鋪墊,我們嘗試著利用pytest框架編寫一條介面自動化測試用例,來釐清介面自動化用例編寫的思路。

我們在百度搜尋天氣查詢,會出現如下圖所示結果:

接下來,我們以該天氣查詢介面為例,編寫介面測試用例指令碼。

一,明確測試物件

針對某個功能做介面測試,首先我們需要確定實現這個功能呼叫的是哪個介面,這個介面的具體資訊(如功能、協議、URL、請求方法、請求引數說明、響應引數說明等等)可以通過檢視開發提供的介面文件獲取,也可以通過抓包(在沒有介面文件的情況下)獲取。找到對應的介面也就是測試物件之後,才能有目的的進行下一步。

1,這裡顯然是沒有介面文件提供介面相關的資訊的,我們甚至都不知道請求url,那麼先Fiddler抓包獲取介面資訊。

通過抓包我們抓取到了該介面的資訊如下:

請求url:https://weathernew.pae.baidu.com/weathernew/pc

請求方式:GET

請求引數:{"query": "浙江杭州天氣", "srcid": 4982}

2,抓取到以上這些介面資訊後,我們先編寫簡單的指令碼請求該介面,如下:

url = "https://weathernew.pae.baidu.com/weathernew/pc"
params = {
	"query": "浙江杭州天氣",
	"srcid": 4982
}
res = requests.get(url=url, params=params)
print(res.status_code)
print(res.text)

執行程式碼,介面除錯通過,能獲取到結果,如下:

3,明確需求,確定用例。

我們在針對某個介面做自動化測試時,需要先明確用例需要驗證的測試點。有些介面既要進行正向的校驗,也要進行異常的校驗,而有些介面可能在自動化時只需要進行正向校驗就夠了,無需做異常校驗。

我們來分析一下示例的這個天氣查詢介面,主要有兩個測試點:

  • 正向請求:輸入存在的城市,能查詢對應城市的天氣

  • 異常請求:輸入不存在的城市,提示錯誤

二,編寫測試用例

編寫測試用例時,我們需要將程式碼進行封裝,可以封裝成測試類/方法、測試函式。pytest中對用例封裝的命名方式有要求,詳細請參考我之前的文章pytest測試命名規則

至於封裝成類還是函式,其實沒什麼特定的要求,一般同一個場景同一個測試點相關的介面可以定義成一個類。

同時用例還需要設定斷言,用於校驗返回內容是否為期望的內容。測試用例一定要進行斷言,否則毫無意義

構造請求資料

正向請求,資料如下:

params = {
	"query": "浙江杭州天氣",
    "srcid": 4982
}

異常請求,資料如下:

params = {
	"query": "微信公眾號:測試上分之路",
    "srcid": 4982
}

正向請求的結果我們在上面除錯請求該介面的時候已經拿到了,如上面的截圖。

我們來看下異常請求的結果,為後續設定斷言做準備,結果如下:

傳送異常請求後,返回的code也是200,結果中會出現暫未開通此城市查詢,且沒有出現正向請求中的window.tplData內容。

封裝測試程式碼

這裡是針對同一個介面的兩條不同的測試用例,我們直接封裝一個測試類,專門用於測試該介面。示例程式碼如下:

class TestWeather:
    '''
    校驗百度天氣查詢介面:https://weathernew.pae.baidu.com/weathernew/pc
    '''

    def test_get_weather_normal(self):
        '''正向校驗-查詢存在的城市的天氣'''
        url = "https://weathernew.pae.baidu.com/weathernew/pc"
        params = {
            "query": "浙江杭州天氣",
            "srcid": 4982
        }
        res = requests.get(url=url, params=params)


    def test_get_weather_error(self):
        '''異常校驗-查詢不存在的城市的天氣'''
        url = "https://weathernew.pae.baidu.com/weathernew/pc"
        params = {
            "query": "微信公眾號:測試上分之路",
            "srcid": 4982
        }
        res = requests.get(url=url, params=params)

注意,程式碼裡還沒有進行斷言,不能算是完整的用例。這裡我只是為了說明流程而把斷言放到下一步,分析後再寫斷言。

斷言設定

斷言,即校驗結果是否是我們期望的內容。pytest怎麼進行斷言請參考文章pytest-斷言

設定斷言時,我們需要先明確校驗哪些欄位。一般而言,介面響應的code都需要斷言,status_code == 200則說明介面請求通了。然後再去斷言其他必要欄位,從而校驗介面功能是否實現。

由上面的結果可知,正向請求可以進行如下斷言:

# 斷言code是否等於200,存在則該斷言通過
assert res.status_code == 200

# 斷言結果中是否存在"window.tplData",存在則該斷言通過
assert "window.tplData" in res.text

由上面的結果可知,異常請求可以進行如下斷言:

# 斷言code是否等於200,存在則該斷言通過
assert res.status_code == 200

# 斷言結果中是否存在"window.tplData",注意這裡是不存在則該斷言通過
assert "window.tplData" not in res.text

# 斷言結果中是否存在"暫未開通此城市查詢",存在則該斷言通過
assert "暫未開通此城市查詢" in res.text

三,執行指令碼獲取測試結果

使用pytest框架管理執行用例時,需要先安裝pytest,並在模組中import,不清楚的同學可以檢視我的pytest系列文章,這裡不做過多說明。

完整示例程式碼如下:

# @time: 2022-03-20
# @author: 給你一頁白紙
# 微信公眾號:測試上分之路

import requests
import pytest


class TestWeather:
    '''
    校驗百度天氣查詢介面:https://weathernew.pae.baidu.com/weathernew/pc
    '''

    def test_get_weather_normal(self):
        '''正向校驗-查詢存在的城市的天氣'''
        url = "https://weathernew.pae.baidu.com/weathernew/pc"
        params = {
            "query": "浙江杭州天氣",
            "srcid": 4982
        }
        res = requests.get(url=url, params=params)
        # print(res.status_code)
        # print(res.text)
        assert res.status_code == 200
        assert "window.tplData" in res.text


    def test_get_weather_error(self):
        '''異常校驗-查詢不存在的城市的天氣'''
        url = "https://weathernew.pae.baidu.com/weathernew/pc"
        params = {
            "query": "微信公眾號:測試上分之路",
            "srcid": 4982
        }
        res = requests.get(url=url, params=params)
        print(res.status_code)
        print(res.text)
        assert res.status_code == 200
        assert "window.tplData" not in res.text
        assert "暫未開通此城市查詢" in res.text

        
if __name__ == '__main__':
    # 使用pytest執行用例
    pytest.main()

當然,這裡因為url是共用的,我們最好是將它提取出來,而不是每個測試方法都去定義一次這個變數,如下圖所示:

執行結果如下:

四,總結

單個介面自動化測試用例,我們可以按照上面的步驟來進行,即 明確測試物件-->編寫測試用例-->編寫測試指令碼-->執行指令碼、獲取測試結果。通過這些步驟,我們便對自動化用例的編寫有了基本的思路(這一點對於我們自動化測試思維的形成很重要),為我們後續的學習實踐打下基礎。

事實上使用程式語言對專案進行自動化測試時,幾乎不可能只存在一條測試用例,那麼在有多條測試用例的情況下,需要怎樣管理用例、執行用例、獲取測試結果?這就是單元測試框架需要解決的問題。

這裡我們使用的是pytest,關於pytest的使用可以檢視pytest系列文章

相關文章