python+pytest介面自動化(11)-測試函式、測試類/測試方法的封裝

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

前言

在python+pytest 介面自動化系列中,我們之前的文章基本都沒有將程式碼進行封裝,但實際編寫自動化測試指令碼中,我們都需要將測試程式碼進行封裝,才能被測試框架識別執行。

例如單個介面的請求程式碼如下:

import requests

headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36"
}

url = "https://www.cnblogs.com/lfr0123/"
res = requests.get(url=h_url, headers=headers)

假設我們需要將上面這段程式碼編寫成測試框架能執行的測試用例,僅僅只是這樣寫程式碼顯然是不夠的,還需要進行如下補充:

  • 需要將程式碼封裝成單元測試框架 (pytest或unittest) 能識別的測試函式或測試類,否則將不會被識別執行。

  • 需要加上斷言,即結果與期望之間的對比,單元測試框架才能判定該用例執行結果是否通過,結果==期望則說明通過,否則失敗。

python中函式以及類的封裝這裡不做過多說明,pytest斷言大家可以參考文章pytest(5)-斷言,而這篇文章的目的是讓大家明白在介面自動化測試中一般怎樣封裝測試程式碼

測試用例封裝的一般規則

測試用例的封裝有兩種,測試函式和測試類,封裝的一般規則如下:

  • 一個測試函式對應一條測試用例。

  • 測試類中可定義多個測試方法,一個測試方法對應一條測試用例,測試類可以看作是一個測試用例集。

  • pytest中測試函式或測試方法的命名必須以test開頭,測試類名必須以Test開頭。具體命名規則可以參考我之前的文章pytest(3)-測試命名規則

  • 對於單介面的測試校驗,一個單介面的測試用例只包含一個介面請求,即將一個介面請求封裝成一個測試函式或測試方法。

  • 對於場景(多介面) 的測試校驗,一條場景測試用例需請求多個介面,因此需要將多個介面請求封裝在同一個測試函式或方法中。

  • 一般封裝一個介面的正向校驗、異常校驗封裝成不同的方法,並封裝在同一個測試類中。如定義一個登陸的測試類,正確使用者名稱、密碼請求封裝成一個方法 (即一條測試用例),正確使用者名稱、錯誤密碼請求封裝成另一個方法 (即另一條測試用例)。

  • 也可以將某個功能點或功能相關聯的介面用例封裝在同一個測試類中。比如個人中心涉及到的介面,可以封裝在同一個測試類中

測試函式的封裝

一般而言,一個測試函式對應一條用例。上面的程式碼編寫成一條測試用例,示例如下:

強調,pytest中測試函式命名必須以test開頭,如test_get_home。

測試類/方法的封裝

一個測試類相當於一個測試用例集,類中的每個方法對應一條測試用例。以登入介面為例,封裝成測試類,示例如下:

強調,pytest中測試類命名需要以Test開頭,如TestLogin,且測試類中不能有init方法。測試類中測試方法必須以test開頭,如test_login_normal。

示例程式碼

pytest中可以使用命令列或者使用程式碼方式即 pytest.main() 執行用例,具體可參考文章pytest(1)-簡介

完整的示例程式碼如下:

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

import requests
import pytest
import json

def test_get_home():
    '''
    請求首頁介面
    :return:
    '''
    headers = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36"
    }

    url = "https://www.cnblogs.com/lfr0123/"
    res = requests.get(url=url, headers=headers)
    # 斷言,判斷返回結果的code是否等於200,當然實際介面測試中一般返回結果中還會有別的欄位需要斷言
    assert res.status_code == 200

class TestLogin:
    '''
    登入介面校驗
    '''
    url = "http://127.0.0.1:5000/login"
    headers = {"Content-Type": "application/json;charset=utf8"}

    def test_login_normal(self):
        '''正確使用者名稱、正確密碼登入'''
        data = {
            "username": "AndyLiu",
            "password": "123456"
        }
        res = requests.post(url=self.url, json=data, headers=self.headers)
        # 斷言
        assert res.status_code == 200
        assert json.loads(res.text)["token"]

    def test_login_error(self):
        '''正確使用者名稱、錯誤密碼登入'''
        data = {
            "username": "AndyLiu",
            "password": "111111"
        }
        res = requests.post(url=self.url, json=data, headers=self.headers)
        # 斷言
        assert res.status_code == 200
        assert not json.loads(res.text)["token"]

if __name__ == '__main__':
    pytest.main()

總結

  • 測試函式、測試類/測試方法的封裝,其實不管是什麼單元測試框架,遵循的方式都一樣。

  • 而在命名方式上各有自己的要求,比如pytest與unittest中測試命名方法有一定的區別。

  • 把一個有自己斷言的函式或方法看成是一條測試用例,那麼測試類其實就是一個含有一條或者多條測試用例的測試用例集,類中的每個方法對應一條測試用例。

  • 一個測試類中放置哪些測試方法,換句話說一個測試用例集中應該包含哪些測試用例,這個可以按照專案自身情況而定,也可按照測試人員自己的想法而定,主旨就是要清晰明瞭。

相關文章