網站首頁 編程語言 正文
1、安裝requests、xlrd、json、unittest庫
<1>pip 命令安裝:
pip install requests
pip install xlrd
pip install json
pip install unittest
2、創建六類Python Package
利用Page Object Model 設計理念創建六類Python Package(也可根據項目要求具體實施)
3、創建一個Base_Page.py
先在base包里創建一個Base_Page.py
<1>導入模塊,并創建Base類,封裝各類請求方法
import requests #導入requests模塊
class Base():
def method_post(self,url,params = None,data = None,headers = None,files = None):
return requests.post(url = url,params = params,data = data,headers = headers,files = files)
def method_get(self,url,params = None,data = None,headers = None,files = None):
return requests.get(url = url,params = params,data = data,headers = headers,files = files)
def method_put(self,url,params = None,data = None,headers = None,files = None):
return requests.put(url = url,params = params,data = data,headers = headers,files = files)
def method_delete(self,url,params = None,data = None,headers = None,files = None):
return requests.delete(url = url,params = params,data = data,headers = headers,files = files
因為每一個請求都會有params參數或是data參數,但是不可能兩個都存在,所以這里用了None,依次類推
<2>適配于接口用例執行,讀取Excel表時,將各類請求做判斷,當符合哪一種時,就去執行哪一種
def requests_type(self,method,url,params = None,data = None,headers = None,files = None):
if method =='post' or method =='POST':
return self.method_post(url = url,params = params,data = data,headers = headers,files = files)
elif method =='get' or method =='GET':
return self.method_get(url = url,params = params,data = data,headers = headers,files = files)
elif method =='put' or method =='PUT':
return requests.put(url = url,params = params,data = data,headers = headers,files = files)
elif method =='delete' or method =='DELETE':
return requests.delete(url = url,params = params,data = data,headers = headers,files = files)
<3> 將幾種請求做簡單調試,調試通了,那么我們就可以進行下一項
也可以對需要拿到cookie的接口進行封裝方法保存:
def Get_Login_cookie(self,data):
res = self.method_post(url = "請求網址",data = data)
return {"userId":str(res.json()['result']['userId']),"sessionId":res.json()['result']['sessionId']}
之后我們要將base頁驗證的這些代碼做清除,否則的話永遠都是調的這些接口
4、創建common類
再common類下創建commons.py文件,并創建common類
<1> 封裝日志方法
這里我添加了一個data包,用于存放xlrd表,以及html報告存放路徑、log日志存放路徑
log_path = r'D:\PycharmProjects\自動化接口\自動化接口測試\report\logs'
report_html = r'D:\PycharmProjects\自動化接口\自動化接口測試\report\html'
read_xlrd = r'D:\PycharmProjects\自動化接口\自動化接口測試\data'
class Common():
#封裝日志方法
def get_logs(self,path = log_path):
import logging,time
logs = logging.getLogger()
logs.setLevel(logging.DEBUG)
path = path+'/' + time.strftime('%Y-%m-%d-%H-%M-%S') + '.log'
write_file = logging.FileHandler(path,'a+',encoding='utf-8')
write_file.setLevel(logging.DEBUG)
set_logs = logging.Formatter('%(asctime)s - %(filename)s - %(funcName)s - %(levelname)s - %(message)s')
write_file.setFormatter(set_logs)
pycharm_text = logging.StreamHandler()
pycharm_text.setFormatter(set_logs)
logs.addHandler(write_file)
logs.addHandler(pycharm_text)
return logs
<2> 封裝讀取Excel表方法,把他轉換成字典形式,方便json格式讀取
# 讀取Excel表方法,方便后續讀取接口用例數據
def ReadExcelTypeDict(self,file_name,path = read_xlrd):
path = path+'/' + file_name
import xlrd
work_book = xlrd.open_workbook(path) # 打開Excel表
sheets = work_book.sheet_names() # 獲取所有的sheets頁
DatasList = []
for sheet in sheets:
sheets = work_book.sheet_by_name(sheet)
nrows = sheets.nrows
for i in range(0,nrows):
values = sheets.row_values(i)
DatasList.append(values)
title_list = DatasList[0]
content_list = DatasList[1:]
new_list = []
for content in content_list:
dic = {}
for i in range(len(content)):
dic[title_list[i]] = content[i]
new_list.append(dic)
return new_list #最終返回為字典形式 有鍵和值
為什么要轉換格式呢?
這里就涉及到了怎么設計一個自動化接口用例
用例的參數值要用json格式寫入,不要有空格
預期結果的出參也要用json格式寫入
不要有' '值都要用" "包起來
<3>封裝一個生成HTML報告方法
# 封裝一個HTML報告方法
def GetHtmlResult(self,suite,title,path = report_html):
import HTMLTestReportCN,time
path = path + '/' + time.strftime('%Y-%m-%d-%H-%M-%S') + '.html'
with open(path,'wb+') as f:
run = HTMLTestReportCN.HTMLTestRunner(stream=f,description='用戶相關接口測試報告',tester='小白',title = title)
run.run(suite)
其余還有需要補充的可以繼續添加,我這里三個基本夠用
5、讀取Excel數據表聯合使用
在case包下創test用例,并調用我們在base頁封裝好的請求api以及common中的讀取Excel數據表聯合使用
<1>創建test_login.py
<2> 導入unittest、common類下的commons類、ddt數據驅動、Base下的base_page頁
import unittest
import ddt
import 自動化接口測試.common.commons as common
from 自動化接口測試.base.Base_Page import Base
<3> 搭建unittest框架內部,并填充方法
import unittest
import ddt
import 自動化接口測試.common.commons as common
from 自動化接口測試.base.Base_Page import Base
r = common.Common().ReadExcelTypeDict('cezxhi .xlsx') # 拿到具體的Excel表數據
@ddt.ddt #導入ddt模塊
class TestLogin(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None: # setupclass類方法 全部用例開始前執行一次
cls.logs = common.Common().get_logs() # 導入日志方法
cls.logs.debug('開始寫入接口自動化測試用例')
@classmethod
def tearDownClass(cls) -> None:
cls.logs.debug('自動化接口用例結束')
def setUp(self) -> None:
self.logs.debug('開始本條接口用例')
def tearDown(self) -> None:
self.logs.debug('結束本條用例')
@ddt.data(*r) # 引入ddt模塊,讀取拿到的數據
def test_logins(self,pars): # 用例方法名開頭必須已test pars參數為接收的表數據值
import json #導入json模塊
dic = json.loads(pars['body參數值']) # 將Excel數據中的參數值轉變為json格式
url = pars['接口地址'] # 拿到請求url
yuqi = pars['預期結果'] # 拿到預期結果
fs = pars['請求方式'] # 拿到請求方式
result = Base().requests_type(method = fs,url = url,data = dic) # 填充base頁的請求api
self.assertEqual(result.text,yuqi) # 進行斷言 看用例是否通過
<4> 執行用例后生成測試報告:
if __name__ == '__main__':
load = unittest.TestLoader().loadTestsFromTestCase(TestLogin) #使用loader加載方式 來找尋所有已test開頭的用例
suite = unittest.TestSuite([load,])
common.Common().GetHtmlResult(suite,'登錄測試用例')
<5> copy當前要執行的腳本路徑,添加到運行方式為python里
最后我們run一下
控制臺是這樣的
為什么會有400呢?因為有一些接口是異常的,比如url錯誤的,少傳入參數、空參,所以會出錯,常理之中
<6> 看下生成的測試報告
在pycharm中是這樣的
然后我們copy下他的路徑到瀏覽器中查看
根據我追蹤的信息,第一條失敗是因為sessionId是可以變的,每一次的值都是不一樣,在這里也希望大家能夠找到BUG,并妥善處理好每一個問題。
原文鏈接:https://blog.csdn.net/okcross0/article/details/126752070
相關推薦
- 2022-05-14 react中的axios模塊你了解嗎_React
- 2022-11-03 React狀態管理器Rematch的使用詳解_React
- 2022-03-15 C#實現時間戳與標準時間的互轉_C#教程
- 2022-09-13 iOS實現手動和自動屏幕旋轉_IOS
- 2022-07-09 Python如何保留float類型小數點后3位_python
- 2022-06-23 C語言實現鏈表與文件存取的示例代碼_C 語言
- 2022-08-22 C++示例詳解Prim算法與優先隊列_C 語言
- 2022-07-26 protected修飾的構造方法在不同包中的使用
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支