您是否想過如何使用 python 測試您的 API?在本文中,我們將學習如何使用 Python 和 pytest 框架來測試我們的 API。

對於本教程,您需要安裝 python,您可以在此處下載它


簡介:


什麼是 Python 和 Pytest 框架

「Python」是一種高級通用程式語言,以其簡單性和可讀性而聞名。它由 Guido van Rossum 建立,於 1991 年首次發布。 Python 的設計易於學習,並且具有乾淨簡潔的語法,這使其成為初學者和經驗豐富的程式設計師的流行選擇。

「pytest」框架可以輕鬆編寫小型、可讀的測試,並且可以擴展以支援應用程式和程式庫的複雜功能測試。


我們專案的配置

用python建立虛擬環境

在開始建立之前,我們先來了解一下什麼是Python上的虛擬環境。

Python 中的虛擬環境是一個獨立的目錄或資料夾,可讓您為專案建立和管理隔離的 Python 環境。透過環境,您可以輕鬆管理依賴項,避免與不同版本的 python 發生衝突。

虛擬環境(除其他外)是:

  • 用於包含支援專案(庫或應用程式)所需的特定 Python 解釋器以及軟體庫和二進位檔案。預設情況下,它們與其他虛擬環境中的軟體以及作業系統中安裝的 Python 解釋器和庫隔離。

  • 包含在專案目錄中的目錄中,通常名為“venv”或“.venv”,或在許多虛擬環境的容器目錄下,例如“~/.virtualenvs”。

  • 未簽入原始碼控制系統(例如 Git)。

  • 被認為是一次性的 - 應該很容易刪除並從頭開始重新建立它。您沒有在環境中放置任何專案程式碼

  • 不被視為可移動或可複製 - 您只需在目標位置重新建立相同的環境。

您可以在此處閱讀有關 python 環境的更多資訊。

視窗

首先,為您的專案建立一個資料夾,然後打開 cmd 並使用命令 cd 導航到該資料夾:

 cd tests_with_python

如果您不知道資料夾在哪裡,可以執行命令“ls”,您將看到資料夾列表,並且可以瀏覽它們。在我們的專案資料夾中,執行以下命令:

 python -m venv name_of_environment

您的環境名稱可以是任何人,只需記住python 區分大小寫,請查看PEP 8 風格指南 以了解有關Python 約定的更多資訊.

要啟動我們的環境,我們使用以下命令:

name_of_environment\Scripts\Activate

如果一切正確,您的環境將被激活,並且在 cmd 上您將看到如下所示:

(name_of_environment) C:\User\tests 

要停用您的環境,只需執行:

deactivate

Linux 或 MacOS

為您的專案建立一個資料夾,然後打開 cmd 並使用命令 cd 導航到該資料夾:

 cd tests_with_python

要啟動我們的環境,我們使用以下命令:

source name_of_environment/bin/activate

如果一切正確,您的環境將被激活,並且在 cmd 上您將看到如下所示:

(name_of_environment) your_user_name tests %

要停用您的環境,只需執行:

deactivate

設定測試的依賴關係

當我們要測試 API 時,我們需要安裝依賴項來幫助我們進行測試,首先我們將安裝「requests」函式庫來幫助我們發出請求:

PS:在執行此命令之前請確保您的環境已激活

pip install requests

為了進行測試,我們將安裝「pytests」框架:

pip install pytest

建立我們的第一個測試

將要測試的 API 的定義

在本教程中,我們將使用返回小行星列表的 Nasa API:Asteroids - NeoWs,我們將測試檢索基於小行星列表的端點在他們最接近地球的日期。

關於API:

  • 基本網址:https://api.nasa.gov/neo/rest/v1/feed

  • 查詢參數:

參數 類型 預設 描述
start_date YYYY-MM-DD 小行星搜尋的開始日期
end_date YYYY-MM-DD start_date後7天 小行星搜尋的結束日期
api_key 字串 DEMO_KEY 用於擴展用途的 api.nasa.gov 密鑰

在本教程中,我們將重點放在三種類型的測試:

  • 合約:如果 API 能夠驗證傳送的查詢參數

  • 狀態:狀態程式碼是否正確

  • 身份驗證:即使這個API不需要令牌,我們也可以用它來做測試

我們的場景:

方法 測試 預期結果
獲取 搜尋成功 - 傳回狀態程式碼 200
正文回應包含小行星清單
獲取 無需任何查詢參數即可搜尋 - 返回狀態碼403
獲取 僅搜尋開始日期 - 傳回狀態程式碼 200
主體回應包含小行星清單
獲取 僅搜尋結束日期 - 傳回狀態程式碼 200
主體回應包含小行星清單
獲取 在有效日期範圍內搜尋 - 傳回狀態碼 200
- 正文回應包含所有非空白欄位
獲取 當開始日期大於結束日期時進行搜尋 - 傳回狀態程式碼 400
獲取 使用無效的 API 令牌進行搜尋 - 傳回狀態程式碼 403
主體回應包含小行星清單

建立我們的測試

首先,我們將建立一個名為「tests.py」的文件,我們將在該文件中編寫測試。為了幫助我們使用良好的實踐並編寫良好的自動化測試,讓我們使用 TDD(測試驅動開發)技術。

該技術包括:

  • 紅色 - 進行失敗的測試

  • 綠色 - 使此測試通過

  • 重構 - 重構所做的事情,刪除重複的內容

為了編寫一套好的測試,我們將使用 3A 技術:

  • 安排:準備上下文。

  • 行動:執行我們想要示範的行動。

  • 斷言:表明我們預期的結果確實發生了。

從紅色開始,使用 3A 技術,我們將編寫第一個測試「成功搜尋小行星」:

import pytest

def test_search_asteroids_with_sucess():
    # Arrange:
    api_key = "DEMO_KEY"
    #Act:
    response = make_request(api_key)
    #Assertion:
    assert response.status_code == 200  # Validation of status code  
    data = response.json()  
    # Assertion of body response content:  
    assert len(data) > 0  
    assert data["element_count"] > 0
  • 安排:我們建立一個變數來插入 api_key,在此步驟中,您可以插入執行測試所需的任何資料。通常,在這一步驟我們會建立模擬資料。

  • Act:在這一步驟中我們呼叫了負責發出請求的方法

  • 斷言:我們驗證回應

方法或類別的名稱應以 test 開頭

若要執行我們的測試,請在命令提示字元中執行:

pytest test.py

我們將收到一個錯誤,因為我們沒有建立執行請求的方法:

test.py F                                                                                                                                      [100%]

====================================================================== FAILURES ======================================================================
_________________________________________________________ test_search_asteroids_with_sucess __________________________________________________________

    def test_search_asteroids_with_sucess():
>       response = make_request()
E       NameError: name 'make_request' is not defined

test.py:5: NameError
============================================================== short test summary info ===============================================================
FAILED test.py::test_search_asteroids_with_sucess - NameError: name 'make_request' is not defined
================================================================= 1 failed in 0.01s ==================================================================

現在,讓我們建立方法來執行請求:

import requests

def make_request(api_key):
    base_url = "https://api.nasa.gov/neo/rest/v1/feed/"
    response = requests.get(f'{base_url}?api_key={api_key}')
    return response

現在,再次執行我們的測試:

================================================================ test session starts =================================================================
platform darwin -- Python 3.11.5, pytest-7.4.3, pluggy-1.3.0
rootdir: /Users/Documents/tests_python
collected 1 item                                                                                                                                     

test.py .                                                                                                                                      [100%]

================================================================= 1 passed in 20.22s =================================================================

重構我們的測試

現在我們已經了解如何使用 pytest 建立測試以及如何建立請求,我們可以編寫其他測試並開始重構測試。我們要做的第一個重構是從測試文件中刪除請求方法。我們將建立一個名為「make_requests.py」的新文件,其中將包含我們的請求,並將我們所做的請求移至此文件:

import requests

def make_request(api_key):
    base_url = "https://api.nasa.gov/neo/rest/v1/feed/"
    response = requests.get(f'{base_url}?api_key={api_key}')
    return response

現在,我們需要考慮在其他測試中重複使用此方法,因為我們需要為不同的測試傳遞不同的參數。我們可以透過很多方法來做到這一點,在本教程中,我們將參數的名稱從“api_key”更改為“query_parameters”。我們這樣做是為了讓我們的方法更加靈活,我們可以一次傳遞參數進行測試:

import requests

def make_request(query_parameters):
    base_url = "https://api.nasa.gov/neo/rest/v1/feed/"
    response = requests.get(f'{base_url}?{query_parameters}')
    return response

之後,我們需要更改我們的測試文件。我們將導入我們建立的這個方法:

from make_requests import make_request

為了以更好的方式組織我們的測試,並遵循 pytest 文件的建議,我們將測試移至類別「TestClass」:

再次執行我們的測試:

============================= test session starts ==============================
collecting ... collected 7 items

test.py::TestClass::test_search_asteroids_with_sucess 
test.py::TestClass::test_search_asteroids_with_query_parameters_empty 
test.py::TestClass::test_search_asteroids_with_start_date 
test.py::TestClass::test_search_asteroids_with_end_date 
test.py::TestClass::test_search_asteroids_in_valid_range 
test.py::TestClass::test_search_asteroids_in_invalid_range 
test.py::TestClass::test_search_asteroids_in_invalid_token 

============================== 7 passed in 5.85s ===============================
PASSED             [ 14%]PASSED [ 28%]PASSED         [ 42%]PASSED           [ 57%]PASSED          [ 71%]PASSED        [ 85%]PASSED        [100%]
Process finished with exit code 0

產生 html 報告結果

為了更好地視覺化您的測試結果,我們可以使用 pytest-html-reporter 庫產生報告 html,為此,我們首先需要安裝該套件:

pip install pytest-html

若要產生報告,請在執行測試時新增:

pytest test.py --html-report=./report/report.html 

將產生一個包含測試結果的 .html 文件,如下所示:

report_example

結論

本文是一篇教程,介紹如何開始使用 python 和 pytest 框架為 API 編寫自動化測試以及如何產生一個報告 html。

您可以在此處存取本教學中使用的專案。

我希望這些內容對您有用。

如果您有任何疑問,請隨時與我聯繫!

親親,下週見💅🏼


原文出處:https://dev.to/m4rri4nne/automating-your-api-tests-using-python-and-pytest-23cc


共有 0 則留言