您是否想過如何使用 python 測試您的 API?在本文中,我們將學習如何使用 Python 和 pytest 框架來測試我們的 API。
對於本教程,您需要安裝 python,您可以在此處下載它
「Python」是一種高級通用程式語言,以其簡單性和可讀性而聞名。它由 Guido van Rossum 建立,於 1991 年首次發布。 Python 的設計易於學習,並且具有乾淨簡潔的語法,這使其成為初學者和經驗豐富的程式設計師的流行選擇。
「pytest」框架可以輕鬆編寫小型、可讀的測試,並且可以擴展以支援應用程式和程式庫的複雜功能測試。
在開始建立之前,我們先來了解一下什麼是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
為您的專案建立一個資料夾,然後打開 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
在本教程中,我們將使用返回小行星列表的 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<br/> 正文回應包含小行星清單 |
獲取 | 無需任何查詢參數即可搜尋 | - 返回狀態碼403<br/> |
獲取 | 僅搜尋開始日期 | - 傳回狀態程式碼 200 <br/> 主體回應包含小行星清單 |
獲取 | 僅搜尋結束日期 | - 傳回狀態程式碼 200 <br/> 主體回應包含小行星清單 |
獲取 | 在有效日期範圍內搜尋 | - 傳回狀態碼 200<br/> - 正文回應包含所有非空白欄位 |
獲取 | 當開始日期大於結束日期時進行搜尋 | - 傳回狀態程式碼 400 <br/> |
獲取 | 使用無效的 API 令牌進行搜尋 | - 傳回狀態程式碼 403 <br/> 主體回應包含小行星清單 |
首先,我們將建立一個名為「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
為了更好地視覺化您的測試結果,我們可以使用 pytest-html-reporter 庫產生報告 html,為此,我們首先需要安裝該套件:
pip install pytest-html
若要產生報告,請在執行測試時新增:
pytest test.py --html-report=./report/report.html
將產生一個包含測試結果的 .html 文件,如下所示:
本文是一篇教程,介紹如何開始使用 python 和 pytest 框架為 API 編寫自動化測試以及如何產生一個報告 html。
您可以在此處存取本教學中使用的專案。
我希望這些內容對您有用。
如果您有任何疑問,請隨時與我聯繫!
親親,下週見💅🏼
原文出處:https://dev.to/m4rri4nne/automating-your-api-tests-using-python-and-pytest-23cc