Pytest接口自動(dòng)化測(cè)試框架搭建模板
auto_api_test
開(kāi)發(fā)環(huán)境: Pycharm
開(kāi)發(fā)語(yǔ)言&版本: python3.7.8
測(cè)試框架: Pytest、測(cè)試報(bào)告: Allure
項(xiàng)目目錄結(jié)構(gòu)
- api – 模仿PO模式, 抽象出頁(yè)面類(lèi), 頁(yè)面類(lèi)內(nèi)包含頁(yè)面所包含所有接口, 并封裝成方法可供其他模塊直接調(diào)用
- config – 配置文件目錄
- data – 測(cè)試數(shù)據(jù)目錄
- doc – 文檔存放目錄
- log – 日志
- report – 測(cè)試報(bào)告
- scripts – 測(cè)試腳本存放目錄
- tools – 工具類(lèi)目錄
- .gitignore – git忽略
- app.py – 命令行啟動(dòng)入口
- pytest.ini – pytest測(cè)試框架配置文件
- README.md – 開(kāi)發(fā)說(shuō)明文檔
代碼分析
pytest.ini
pytest框架的配置文件
[pytest] addopts = --html=../report/report.html # pytest-html報(bào)告插件配置 ;addopts = -s --alluredir report # allure-pytest報(bào)告插件配置 testpaths = ./scripts # 設(shè)置用例目錄識(shí)別名稱(chēng) python_files = test*_*.py # 設(shè)置測(cè)試文件識(shí)別名稱(chēng) python_classes = Test* # 設(shè)置測(cè)試類(lèi)識(shí)別名稱(chēng) python_functions = test_* # 設(shè)置測(cè)試方法識(shí)別名稱(chēng)
app.py
# 基礎(chǔ)路由(方便在部署環(huán)境發(fā)生變化時(shí)切換全局基礎(chǔ)路由) BASE_URL = "http://xxxx.com" # 獲取腳本的絕對(duì)路徑(腳本在項(xiàng)目根目錄就可以理解為項(xiàng)目路徑) ABS_PATH = os.path.abspath(__file__) BASE_DIR = os.path.dirname(ABS_PATH) # 命令行啟動(dòng)此腳本時(shí)執(zhí)行測(cè)試用例 pytest.main(["scripts/"])
/config/config.json
配置文件, 目前包含全局請(qǐng)求頭配置、類(lèi)似全局變量的設(shè)置, 可通過(guò)tools內(nèi)的工具函數(shù)進(jìn)行讀寫(xiě)
請(qǐng)求頭具體參數(shù)根據(jù)需要自行配置
{ "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
頁(yè)面類(lèi)模板, 包含頁(yè)面接口的請(qǐng)求方法(增刪改查)封裝, 主要在此定義好接口和請(qǐng)求入?yún)⒌葍?nèi)容
# 導(dǎo)包 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查詢(xún)接口 api_get_url = app.BASE_URL + "/xxx/xxxx/get" # xx刪除接口 api_del_url = app.BASE_URL + "/xxx/xxxx/del/{id}" # xx添加接口函數(shù)實(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ù)實(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查詢(xún)接口函數(shù)實(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ù)實(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
測(cè)試類(lèi)以Test開(kāi)頭, 測(cè)試類(lèi)和測(cè)試方法添加allure裝飾器
前置測(cè)試類(lèi)方法 - 初始化requests請(qǐng)求庫(kù)的session對(duì)象, 創(chuàng)建對(duì)應(yīng)的頁(yè)面對(duì)象
后置測(cè)試類(lèi)方法 - 關(guān)閉session對(duì)象
前置測(cè)試方法 - 加休眠
測(cè)試方法中添加可選參數(shù)化裝飾器, 測(cè)試方法中通過(guò)頁(yè)面對(duì)象調(diào)用頁(yè)面接口請(qǐng)求方法, 傳入requests的session對(duì)象和方法需要的必要參數(shù), 進(jìn)行響應(yīng)結(jié)果的處理和斷言等操作
日志器可通過(guò)引入工具調(diào)用
# 導(dǎo)包 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('測(cè)試類(lèi)模板') class TestTemplate: session = None # 初始化方法 @classmethod def setup_class(cls): cls.session = requests.Session() # 初始化session對(duì)象 cls.template = TemplateAPI() # 結(jié)束方法 @classmethod def teardown_class(cls): cls.session.close() @classmethod def setup(cls): sleep(1.5) # 測(cè)試方法 @allure.story("測(cè)試方法模板-add") @pytest.mark.parametrize(("attr1", "attr2", "success", "expect"), read_json("test_add")) def test_add(self, attr1, attr2, success, expect): # 添加功能API調(diào)用 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("測(cè)試方法模板-upd") @pytest.mark.parametrize(("attr1", "attr2", "success", "expect"), read_json("test_upd")) def test_upd(self, attr1, attr2, success, expect): # 添加功能API調(diào)用 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("測(cè)試方法模板-get") @pytest.mark.parametrize(("attr1", "attr2", "success", "expect"), read_json("test_get")) def test_get(self, attr1, attr2, success, expect): # 添加功能API調(diào)用 response = self.template.api_get(self.session, attr1, attr2) # 打印日志 log.info("查詢(xún)功能-狀態(tài)碼為: {}".format(response.status_code)) # 斷言狀態(tài)碼 assert response.status_code == expect, "狀態(tài)碼斷言失敗" @allure.story("測(cè)試方法模板-del") @pytest.mark.parametrize(("uid", "success", "expect"), read_json("test_del")) def test_del(self, uid, success, expect): # 添加功能API調(diào)用 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
測(cè)試數(shù)據(jù)和具體的操作工具類(lèi)根據(jù)需要自定義
到此這篇關(guān)于Pytest接口自動(dòng)化測(cè)試框架搭建模板的文章就介紹到這了,更多相關(guān)Pytest搭建模板內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Pytest 自動(dòng)化測(cè)試框架的使用
- pytest接口自動(dòng)化測(cè)試框架搭建的全過(guò)程
- pytest自動(dòng)化測(cè)試數(shù)據(jù)驅(qū)動(dòng)yaml/excel/csv/json
- python+pytest自動(dòng)化測(cè)試函數(shù)測(cè)試類(lèi)測(cè)試方法的封裝
- Pytest+Yaml+Excel?接口自動(dòng)化測(cè)試框架的實(shí)現(xiàn)示例
- 淺談基于Pytest框架的自動(dòng)化測(cè)試開(kāi)發(fā)實(shí)踐
- Python自動(dòng)化測(cè)試框架pytest的詳解安裝與運(yùn)行
- 自動(dòng)化測(cè)試Pytest單元測(cè)試框架的基本介紹
- python使用pytest接口自動(dòng)化測(cè)試的使用
- 詳解如何使用Pytest進(jìn)行自動(dòng)化測(cè)試
- Pytest自動(dòng)化測(cè)試的具體使用
相關(guān)文章
Python抓取通過(guò)Ajax加載數(shù)據(jù)的示例
在網(wǎng)頁(yè)上,有一些內(nèi)容是通過(guò)執(zhí)行Ajax請(qǐng)求動(dòng)態(tài)加載數(shù)據(jù)渲染出來(lái)的,本文主要介紹了使用Python抓取通過(guò)Ajax加載數(shù)據(jù),感興趣的可以了解一下2023-05-05Python二叉樹(shù)的鏡像轉(zhuǎn)換實(shí)現(xiàn)方法示例
這篇文章主要介紹了Python二叉樹(shù)的鏡像轉(zhuǎn)換實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了二叉樹(shù)鏡像轉(zhuǎn)換的原理及Python相關(guān)算法實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-03-03Python將json文件寫(xiě)入ES數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了Python將json文件寫(xiě)入ES數(shù)據(jù)庫(kù)的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-04-04Python利用雪花算法實(shí)現(xiàn)生成唯一ID
雪花算法是在一個(gè)項(xiàng)目體系中生成全局唯一ID標(biāo)識(shí)的一種方式,偶然間看到了Python使用雪花算法不盡感嘆真的是太便捷了。本文就來(lái)聊聊這具體的實(shí)現(xiàn)方法,感興趣的可以了解一下2022-11-11對(duì)python中的pop函數(shù)和append函數(shù)詳解
今天小編就為大家分享一篇對(duì)python中的pop函數(shù)和append函數(shù)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05python實(shí)現(xiàn)簡(jiǎn)易版計(jì)算器
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)易版計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01