auto_api_test
開發(fā)環(huán)境: Pycharm
開發(fā)語言版本: python3.7.8
測試框架: Pytest、測試報告: Allure
項目源碼Git地址
項目目錄結構
- api – 模仿PO模式, 抽象出頁面類, 頁面類內包含頁面所包含所有接口, 并封裝成方法可供其他模塊直接調用
- config – 配置文件目錄
- data – 測試數(shù)據目錄
- doc – 文檔存放目錄
- log – 日志
- report – 測試報告
- scripts – 測試腳本存放目錄
- tools – 工具類目錄
- .gitignore – git忽略
- app.py – 命令行啟動入口
- pytest.ini – pytest測試框架配置文件
- README.md – 開發(fā)說明文檔
代碼分析
pytest.ini
pytest框架的配置文件
[pytest]
addopts = --html=../report/report.html # pytest-html報告插件配置
;addopts = -s --alluredir report # allure-pytest報告插件配置
testpaths = ./scripts # 設置用例目錄識別名稱
python_files = test*_*.py # 設置測試文件識別名稱
python_classes = Test* # 設置測試類識別名稱
python_functions = test_* # 設置測試方法識別名稱
app.py
# 基礎路由(方便在部署環(huán)境發(fā)生變化時切換全局基礎路由)
BASE_URL = "http://xxxx.com"
# 獲取腳本的絕對路徑(腳本在項目根目錄就可以理解為項目路徑)
ABS_PATH = os.path.abspath(__file__)
BASE_DIR = os.path.dirname(ABS_PATH)
# 命令行啟動此腳本時執(zhí)行測試用例
pytest.main(["scripts/"])
/config/config.json
配置文件, 目前包含全局請求頭配置、類似全局變量的設置, 可通過tools內的工具函數(shù)進行讀寫
請求頭具體參數(shù)根據需要自行配置
{
"headers": {
"Host": "xxx.com",
"Connection": "keep-alive",
"Accept": "application/json, text/plain, */*",
"Authorization": "xxxx",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",
"Content-Type": "application/json;charset=UTF-8",
"Origin": "http://xxx.com",
"Referer": "http://xxx.com/",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9"
}
}
/api/template_api.py
頁面類模板, 包含頁面接口的請求方法(增刪改查)封裝, 主要在此定義好接口和請求入參等內容
# 導包
import app
import json
from tools.config_info import get_header
class TemplateAPI:
# xx添加接口
api_add_url = app.BASE_URL + "/xxx/xxxx/add"
# xx修改接口
api_upd_url = app.BASE_URL + "/xxx/xxxx/upd"
# xx查詢接口
api_get_url = app.BASE_URL + "/xxx/xxxx/get"
# xx刪除接口
api_del_url = app.BASE_URL + "/xxx/xxxx/del/{id}"
# xx添加接口函數(shù)實現(xiàn)
def api_add(self, session, attr1, attr2):
post_data = {
"attr1": attr1,
"attr2": attr2
}
return session.post(self.api_add_url, headers=get_header(), data=json.dumps(post_data))
# xx修改接口函數(shù)實現(xiàn)
def api_upd(self, session, attr1, attr2):
put_data = {
"attr1": attr1,
"attr2": attr2
}
return session.put(self.api_upd_url, headers=get_header(), data=json.dumps(put_data))
# xx查詢接口函數(shù)實現(xiàn)
def api_get(self, session, attr1, attr2):
params = {
"attr1": attr1,
"attr2": attr2
}
return session.get(self.api_get_url, headers=get_header(), params=params)
# xx刪除接口函數(shù)實現(xiàn)
def api_del(self, session, uid):
return session.delete(self.api_del_url.format(id=uid), headers=get_header())
/scripts/test_template.py
測試類以Test開頭, 測試類和測試方法添加allure裝飾器
前置測試類方法 - 初始化requests請求庫的session對象, 創(chuàng)建對應的頁面對象
后置測試類方法 - 關閉session對象
前置測試方法 - 加休眠
測試方法中添加可選參數(shù)化裝飾器, 測試方法中通過頁面對象調用頁面接口請求方法, 傳入requests的session對象和方法需要的必要參數(shù), 進行響應結果的處理和斷言等操作
日志器可通過引入工具調用
# 導包
import pytest
import requests
from time import sleep
from api.template_api import TemplateAPI
from tools.get_log import GetLog
from tools.read_file import read_json
import allure
# 獲取日志器
log = GetLog.get_log()
@allure.feature('測試類模板')
class TestTemplate:
session = None
# 初始化方法
@classmethod
def setup_class(cls):
cls.session = requests.Session() # 初始化session對象
cls.template = TemplateAPI()
# 結束方法
@classmethod
def teardown_class(cls):
cls.session.close()
@classmethod
def setup(cls):
sleep(1.5)
# 測試方法
@allure.story("測試方法模板-add")
@pytest.mark.parametrize(("attr1", "attr2", "success", "expect"), read_json("test_add"))
def test_add(self, attr1, attr2, success, expect):
# 添加功能API調用
response = self.template.api_add(self.session, attr1, attr2)
# 打印日志
log.info("添加功能-狀態(tài)碼為: {}".format(response.status_code))
# 斷言狀態(tài)碼
assert response.status_code == expect, "狀態(tài)碼斷言失敗"
@allure.story("測試方法模板-upd")
@pytest.mark.parametrize(("attr1", "attr2", "success", "expect"), read_json("test_upd"))
def test_upd(self, attr1, attr2, success, expect):
# 添加功能API調用
response = self.template.api_upd(self.session, attr1, attr2)
# 打印日志
log.info("修改功能-狀態(tài)碼為: {}".format(response.status_code))
# 斷言狀態(tài)碼
assert response.status_code == expect, "狀態(tài)碼斷言失敗"
@allure.story("測試方法模板-get")
@pytest.mark.parametrize(("attr1", "attr2", "success", "expect"), read_json("test_get"))
def test_get(self, attr1, attr2, success, expect):
# 添加功能API調用
response = self.template.api_get(self.session, attr1, attr2)
# 打印日志
log.info("查詢功能-狀態(tài)碼為: {}".format(response.status_code))
# 斷言狀態(tài)碼
assert response.status_code == expect, "狀態(tài)碼斷言失敗"
@allure.story("測試方法模板-del")
@pytest.mark.parametrize(("uid", "success", "expect"), read_json("test_del"))
def test_del(self, uid, success, expect):
# 添加功能API調用
response = self.template.api_del(self.session, uid)
# 打印日志
log.info("刪除功能-狀態(tài)碼為: {}".format(response.status_code))
# 斷言狀態(tài)碼
assert response.status_code == expect, "狀態(tài)碼斷言失敗"
/data | /tools
測試數(shù)據和具體的操作工具類根據需要自定義
到此這篇關于Pytest接口自動化測試框架搭建模板的文章就介紹到這了,更多相關Pytest搭建模板內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- python pytest進階之fixture詳解
- 詳解Pytest測試用例的執(zhí)行方法
- Python pytest裝飾器總結(實例詳解)
- python pytest進階之conftest.py詳解
- pytest自動化測試fixture的作用域實例化順序及可用性