一、介紹
Requests是一個很實用的Python HTTP客戶端庫,編寫爬蟲和測試服務器響應數據時經常會用到,Requests是Python語言的第三方的庫,專門用于發送HTTP請求
二、前提
pip install requests
三、get的請求
3.1 GET無參請求
r = requests.get('http://www.baidu.com')
3.2 GET傳參
payload = {'key1': 'value1', 'key2': 'value2', 'key3': None}
r = requests.get('http://www.baidu.com ', params=payload)
- 案例:測試聚合數據
- 代碼
import requests
class UseRequestClass():
#get傳參的第一種方式
def XWTTMethod(self):
r = requests.get("http://v.juhe.cn/toutiao/index?type=guonei&key=4b72107de3a197b3bafd9adacf685790")
print(r.text)
#get傳參的第二種方式
def XWTTMethod(self):
params = {"type":"guonei","key":"4b72107de3a197b3bafd9adacf685790"}
r = requests.get("http://v.juhe.cn/toutiao/index",params=params)
print(r.text)
四、post請求
類似python中的表單提交
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post("http://httpbin.org/post", data=payload)
- 案例:測試聚合數據
- 代碼
import requests
class UseRequestClass():
def XWTTPostMethod(self):
params = {"type":"guonei","key":"4b72107de3a197b3bafd9adacf685790"}
r = requests.post("http://v.juhe.cn/toutiao/index",params=params)
#print(r.status_code)
return r.status_code
五、Requests響應
r.status_code 響應狀態碼
r.heards 響應頭
r.cookies 響應cookies
r.text 響應文本
r. encoding 當前編碼
r. content 以字節形式(二進制)返回
最常用的是根據響應狀態碼判斷接口是否連通,經常用于做接口中斷言判斷
六、Request擴充
1.添加等待時間
requests.get(url,timeout=1) #超過等待時間則報錯
2.添加請求頭信息
requests.get(url,headers=headers) #設置請求頭
3.添加文件
requests.post(url, files=files) #添加文件
文件傳輸
url = 'http://httpbin.org/post'
files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=files)
七、requests+pytest+allure
7.1 流程如下
讀取文件中的數據
requests拿到數據請求接口返回狀態碼
通過斷言驗證返回狀態碼和200對比
生成allure的測試報告
7.2 模塊總覽
dataDemo(存放數據)>> readDemo(讀取數據)
useRequests(發送請求)>>testDemo(生成報告)
7.3 讀取csv文件流程
7.3.1 存儲數據(csv)
通過excel另存為csv即可。
7.3.2 讀取數據(readDemo)
代碼展示
import csv
class ReadCsv():
def readCsv(self):
item = []
rr = csv.reader(open("../dataDemo/123.csv"))
for csv_i in rr:
item.append(csv_i)
item =item [1:]
return item
7.3.3 request請求接口返回狀態碼
代碼展示
import requests
from readDataDemo.readcsv import ReadCsv
r = ReadCsv()
ee = r.readCsv()
# print(ee)
class RequestCsv():
def requestsCsv(self):
item = []
for csv_i in ee:
if csv_i[2] =="get":
rr = requests.get(csv_i[0],params=csv_i[1])
item.append(rr.status_code)
else:
rr = requests.post(csv_i[0],data=csv_i[1])
item.append(rr.status_code)
return item
7.3.4 pytest斷言設置并結合allure生成測試報告
- 代碼展示
import pytest,os,allure
from userequests.userequestsDemo.requestscsv import RequestCsv
r = RequestCsv()
ee = r.requestsCsv()
print(ee)
class TestClass02():
def test001(self):
for code in ee:
assert code == 200
if __name__ == '__main__':
pytest.main(['--alluredir', 'report/result', 'test_02csv.py'])
split = 'allure ' + 'generate ' + './report/result ' + '-o ' + './report/html ' + '--clean'
os.system(split)
7.3.5 測試報告展示
7.4 讀取excle文件流程
7.4.1 存儲數據(xlsx)
7.4.2 讀取數據(readDemo)
from openpyxl import load_workbook
class Readxcel():
def getTestExcel(self):
# 打開表
workbook = load_workbook("G:\python\pythonProject\pytest05a\\requestdemo\\a.xlsx")
# 定位表單
sheet = workbook['Sheet1']
print(sheet.max_row) # 3 行
print(sheet.max_column) # 3 列
test_data = [] # 把所有行的數據放到列表中
for i in range(2, sheet.max_row + 1):
sub_data = {} # 把每行的數據放到字典中
for j in range(1, sheet.max_column + 1):
sub_data[sheet.cell(1, j).value] = sheet.cell(i, j).value
test_data.append(sub_data) # 拼接每行單元格的數據
return test_data
t = Readxcel()
f = t.getTestExcel()
print(f)
7.4.3 request請求接口返回狀態碼
import requests
from requestdemo.readexcel import Readxcel
class GetStatusCode():
def getStatusCode(self):
t = Readxcel()
f = t.getTestExcel()
item = []
for excel_i in f:
if excel_i["method"] == "get":
rr = requests.get(excel_i["url"], params=excel_i["params"])
item.append(rr.status_code)
else:
rr = requests.post(excel_i["url"], data=excel_i["params"])
item.append(rr.status_code)
return item
print(GetStatusCode().getStatusCode())
7.4.4 pytest斷言設置并結合allure生成測試報告
import allure, pytest, os
from requestdemo.getStatusCode import GetStatusCode
get = GetStatusCode()
statusCodes = get.getStatusCode()
class TestReadExcel():
def testReadExcel(self):
for code in statusCodes:
assert code == 200
if __name__ == "__main__":
# 生成測試報告json
pytest.main(["-s", "-q", '--alluredir', 'report/result', 'testreadexcel.py'])
# 將測試報告轉為html格式
split = 'allure ' + 'generate ' + './report/result ' + '-o ' + './report/html ' + '--clean'
os.system(split)
7.4.5:測試報告展示
自動化持續集成
一、概念
互聯網軟件的開發和發布,已經形成了一套標準流程,最重要的組成部分就是持續集成(Continuous integration,簡稱CI)
1.1. 持續集成(采蜜)
持續集成指的是,頻繁地(一天多次)將代碼集成到主干。
它的好處主要有兩個:
(1)快速發現錯誤。每完成一點更新,就集成到主干,可以快速發現錯誤,定位錯誤也比較容易。
(2)防止分支大幅偏離主干。如果不是經常集成,主干又在不斷更新,會導致以后集成的難度變大,甚至難以集成。
持續集成的目的,就是讓產品可以快速迭代,同時還能保持高質量。它的核心措施是,代碼集成到主干之前,必須通過自動化測試。只要有一個測試用例失敗,就不能集成。
1.2. 持續交付
持續交付(Continuous delivery)指的是,頻繁地將軟件的新版本,交付給質量團隊或者用戶,以供評審。如果評審通過,代碼就進入生產階段。
持續交付可以看作持續集成的下一步。它強調的是,不管怎么更新,軟件是隨時隨地可以交付的。
1.3. 持續部署
- 定義:持續部署(continuous deployment)是持續交付的下一步,指的是代碼通過評審以后,自動部署到生產環境。
- 目標:代碼在任何時刻都是可部署的,可以進入生產階段。
- 前提:能自動化完成測試、構建、部署等步驟。
二、Jenkins介紹
2.1. Jenkins概念
Jenkins 是一個開源軟件項目,是基于Java開發的一種可拓展持續集成工具,主要用于持續、自動地構建 / 測試 / 集成軟件項目以及監控一些定時執行的任務。
2.2. Jenkins目的
1、持續、自動地構建/測試軟件項目。
2、監控軟件開放流程,快速問題定位及處理,提示開放效率。
2.3. 特性
? 易于安裝,只要把 jenkins.war 部署到 Tomcat 即可運行
? 易于配置,所有配置都是通過其提供的 web 界面實現
? 集成 RSS/E-mail,通過 RSS 發布構建結果或當構建完成時通過 e-mail 通知
? 生成 JUnit / TestNG 測試報告
? 分布式構建,支持 Jenkins 能夠讓多臺計算機一起構建/測試
? 插件支持,支持擴展插件,你可以開發適合自己團隊使用的工具
2.4. 產品發布流程
產品設計成型 → 開發人員開發代碼 → 測試人員測試功能 → 運維人員發布上線
三、安裝配置Jenkins
去官網下載jenkins.war包。
官網地址
3.1 兩種方式開啟Jenkins
- 方式1:
在tomcat的bin目錄下啟動(最常用) - 方式2:
打開cmd,進入jenkins目錄,然后運行命令:java -jar jenkins.war
四、搭建JMeter+Jenkins+Ant持續化
Ant下載及配置安裝
下載Apache-ant
解壓到你想要安裝的目錄
配置環境變量
驗證是否安裝成功
拷貝Jemter包到ant下
新建一個build.xml文件,里面填入如下代碼
<?xml version="1.0" encoding="UTF-8"?> <project name="ant-jmeter-test" default="run" basedir="."> <!-- 需要改成自己本地的 Jmeter 目錄--> <property name="jmeter.home" value="G:\jmeter\apache-jmeter-3.0" /> <!-- jmeter生成jtl格式的結果報告的路徑--> <property name="jmeter.result.jtl.dir" value="G:\jmeter\jmeter-ant-jenkins\testResult" /> <!-- jmeter生成html格式的結果報告的路徑--> <property name="jmeter.result.html.dir" value="G:\jmeter\jmeter-ant-jenkins\testResult" /> <!-- 生成的報告的前綴--> <property name="ReportName" value="TestReport" /> <property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/report.jtl" /> <property name="jmeter.result.htmlName" value="${jmeter.result.html.dir}/index.html" /> <!-- 接收測試報告的郵箱 --> <property name="mail_to" value="barryli89@163.com" /> <property name="lib.dir" value="${jmeter.home}/lib"/> <path id="xslt.classpath"> <fileset dir="${lib.dir}" includes="xalan*.jar"/> <fileset dir="${lib.dir}" includes="serializer*.jar"/> </path> <target name="run"> <antcall target="test" /> <antcall target="report" /> </target> <target name="test"> <taskdef name="jmeter" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask" /> <jmeter jmeterhome="${jmeter.home}" resultlog="${jmeter.result.jtlName}"> <!-- 聲明要運行的腳本。"*.jmx"指包含此目錄下的所有jmeter腳本--> <testplans dir="G:\jmeter\jmeter-ant-jenkins" includes="*.jmx" /> <property name="jmeter.save.saveservice.output_format" value="xml"/> </jmeter> </target> <target name="report"> <xslt classpathref="xslt.classpath" force="true" in="${jmeter.result.jtlName}" out="${jmeter.result.htmlName}style="${jmeter.home}/extras/jmeter-results-detail-report_21.xsl"> <!-- 因為上面生成報告的時候,不會將相關的圖片也一起拷貝至目標目錄,所以,需要手動拷貝 --> </xslt> <copy todir="${jmeter.result.html.dir}"> <fileset dir="${jmeter.home}/extras"> <include name="collapse.png" /> <include name="expand.png" /> </fileset> </copy> </target> </project>
進行命令行模式后,進入剛才創建的xml文件存放目錄,如:D:\build 輸入ant即可
五、集成jenkins
打開Jenkins,配置Ant環境
新建一個自由風格任務
構建觸發器
構建配置
配置HTML插件
立即構建
針對報告中不顯示聚合報告的情況
Jenkins執行自動化測試后發送測試報告郵件