第1節(jié):企業(yè)要求、接口測試流程、如何做、企業(yè)接口管理工具介紹
企業(yè)測試級別要求:

企業(yè)測試招聘要求:

企業(yè)接口如何做:

接口自動化測試體系流程:


企業(yè)接口管理用到最多工具【可以自己搭建喲】:
enlinker:?https://www.eolinker.com/#/
Eolinker 業(yè)內(nèi)領(lǐng)先的 API 全生命周期管理方案:API自動生成、API管理、API自動化測試、API網(wǎng)關(guān)、API監(jiān)控、API開放平臺?wxiao.w.eolinker.com
yapi:https://hellosean1025.github.io/yapi/
第2節(jié) 用例規(guī)范設(shè)計&【自動化用例框架再說到】
接口用例設(shè)計保持:參數(shù)是否必填、參數(shù)間是否存在關(guān)聯(lián)、參數(shù)取值范圍、業(yè)務(wù)規(guī)則

第3節(jié) charles抓包工具(方法定位接口問題)支持app/web
抓包作用:
1.抓web、app運用接口方便定位問題、接口測試
2.可以模擬一些數(shù)據(jù)、單個數(shù)據(jù)、多條數(shù)據(jù)
web抓包安裝即可,直接抓就能獲取對應(yīng)接口
蘋果&安卓抓包:?
1.charles安裝配置:
? 1.pxory->pxory-settings中設(shè)置端口號8888.勾選enable
? 2.help->ssl pxorying->install charles root car證書
? 3.PC CMD中輸入ipconfig ,手機找到你對應(yīng)WIFI設(shè)置選擇手動IP端口號:8888(電腦WIFI必須和手機連接的wifi是一致)
? 4.打開手機瀏覽器你安裝證書 https://chls.pro/ssl charlesproxy.com/getssl
? (注意:如果手機自帶瀏覽器下載的證書無法安裝,請在市場下載一個chrome ,UC瀏覽器安裝證書)
? 蘋果手機抓包和android手機抓包配置一致,但是蘋果手機證書安裝會后需要在通用去找到你對應(yīng)的證書信任一下,即可
? 打開設(shè)置,點擊通用->關(guān)于本機->證書信任設(shè)置,找到當前要作為代理的電腦名,打開信任開關(guān)。
? ? ? ? ? ? ? ? ? 注意:電腦防火墻一定要關(guān)掉,不然都配置了,莫名其妙抓不了,找不到原因
2.數(shù)據(jù)模擬(重定向)
修改返回個參:tools->rewrite->enable勾選

修改接口返回全局參數(shù):tools->map local->勾選enable

preference:
request以及response的顯示設(shè)置
默認charles的數(shù)據(jù)顯示是沒有request以及response,需要將隱藏選項關(guān)閉

3.網(wǎng)絡(luò)模擬
設(shè)置網(wǎng)速:
Throttle Settings-》

第4節(jié) postman使用

第5節(jié) http協(xié)議/狀態(tài)碼詳解、websokcet協(xié)議、服務(wù)器交互流程
HTTP是一個屬于應(yīng)用層的面向?qū)ο蟮膮f(xié)議,由于其簡捷、快速的方式,適用于分布式超媒體信息系統(tǒng)
初步協(xié)議認識:
HTTP協(xié)議:超文本傳輸協(xié)議,用于普通瀏覽
HTTPS協(xié)議:安全超文本傳輸協(xié)議,身披SSL外衣的HTTP協(xié)議
FTP協(xié)議:文件傳輸協(xié)議,用于文件傳輸
POP3協(xié)議:郵局協(xié)議,收郵件使用
SMTP協(xié)議:簡單郵件傳輸協(xié)議,用來發(fā)送電子郵件
webscoket協(xié)議:服務(wù)器可以主動向客戶端推送消息,客戶端也可以主動向服務(wù)器發(fā)送消息,信息溝通
SSH協(xié)議:安全外殼協(xié)議,用于加密安全登陸,替代安全性差的Telent協(xié)議
http常見狀態(tài)代碼、狀態(tài)描述、說明:
200 OK? ? ? //客戶端請求成功
400 Bad Request? //客戶端請求有語法錯誤,服務(wù)器不理解請求的語法
401 Unauthorized //(未授權(quán)) 請求要求身份驗證。 對于需要登錄的網(wǎng)頁,服務(wù)器可能返回此響應(yīng)。
403 Forbidden? //服務(wù)器收到請求,服務(wù)器拒絕拒絕請求
404 Not Found? //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error //服務(wù)器發(fā)生不可預(yù)期的錯誤
501 (尚未實施) 服務(wù)器不具備完成請求的功能。 例如,服務(wù)器無法識別請求方法時可能會返回此代碼
503 Server Unavailable? //服務(wù)器當前不能處理客戶端的請求,一段時間后可能恢復正常
http:發(fā)送請求->服務(wù)器返回連接應(yīng)答->客戶端返回就緒->最終結(jié)果顯示結(jié)果
Webscoket:
1.WebSocket建立在TCP協(xié)議之上,并且與HTTP協(xié)議有著良好的兼容性,最大的特點就是服務(wù)器可以主動向客戶端推送消息,客戶端也可以主動向服務(wù)器發(fā)送消息
客戶端通過HTTP協(xié)議向服務(wù)端發(fā)送握手-》服務(wù)端向客戶端返回ACK(數(shù)據(jù)包傳達確認信息),此時握手成功-》建立連接并維持該連接;-》后面服務(wù)端和客戶端就可以基于建立的連接進行雙向通信-》直到連接關(guān)閉

2.WebSocket與HTTP對比

3. WebSocket的協(xié)議標識符是 ws,加密為 wss
ws://ip:port/some/path
服務(wù)器交互流程:

DNS就是域名解析:
例如:bai來說就是電腦訪問網(wǎng)du站需要知道網(wǎng)站所在的IP地址zhi,有了DNS服務(wù)之dao后登陸百度只需要輸入www.baidu.com而不是202.108.22.5。
DNS服務(wù)會將域名解析為IP地址,方便用戶訪問網(wǎng)站時不需要記住枯燥的數(shù)字
跨域:
a網(wǎng)站(百度一下,你就知道)要請求一個b網(wǎng)站的數(shù)據(jù)(www.baidutest.com)
jsonp前端解決跨域
nginx反向代理
第5節(jié) cookie、token、session&request和response認識
應(yīng)用場景直觀理解:
cookie日常登錄一個網(wǎng)站,今天輸入用戶名密碼登錄了,第二天再打開很多情況下就直接打開了。這個時候用到的一個機制就是cookie
session的一個場景是購物車,添加了商品之后客戶端處可以知道添加了哪些商品,而服務(wù)器端如何判別呢,所以也需要存儲一些信息,這里就用到了session
token一般運用登錄會生成一個token傳入下一個其它接口,作為身份驗證
cookie原理:Cookie技術(shù)會根據(jù)從服務(wù)器端發(fā)送的響應(yīng)報文內(nèi)的一個叫做Set-Cookie的首部字段信息,通知客戶端保存Cookie

Session原理:是存放在服務(wù)器端、用來存放用戶數(shù)據(jù)的(類似于HashTable結(jié)構(gòu))。
當瀏覽器第一次發(fā)送請求時,服務(wù)器自動生成了一個HashTable和一個Session ID用來唯一標識這個HashTable,并將其通過響應(yīng)發(fā)送到瀏覽器。當瀏覽器第二次發(fā)送請求,會將前一次服務(wù)器響應(yīng)中的Session ID放在請求中一并發(fā)送到服務(wù)器上,服務(wù)器從請求中提取出Session ID,并和保存的所有Session ID進行對比,找到這個用戶對應(yīng)的HashTable,以此來達到共享數(shù)據(jù)的目的
過程:
Session是另一種記錄客戶狀態(tài)的機制,不同的是Cookie保存在客戶端瀏覽器中,而Session保存在服務(wù)器上。客戶端瀏覽器訪問服務(wù)器的時候,服務(wù)器把客戶端信息以某種形式記錄在服務(wù)器上。這就是Session??蛻舳藶g覽器再次訪問時只需要從該Session中查找該客戶的狀態(tài)就可以
Token:身份驗證令牌? 用戶向服務(wù)器申請登錄系統(tǒng)令牌-》拿著申請的令牌登錄對應(yīng)系統(tǒng)(用的比較多)
request和response的認識
1.requests.get() 獲取HTML網(wǎng)頁的主要方法,對應(yīng)HTTP的GET
2.requests.post() 向HTML網(wǎng)頁提交POST請求的方法,對應(yīng)HTTP的POST
get方法需要接受一個參數(shù)URL,構(gòu)造一個向目標服務(wù)器發(fā)送請求的request對象,返回一個包含對象服務(wù)器資源的response對象,常用為【response = requests.get("url")】
response對象的屬性
a.response.text HTTP響應(yīng)內(nèi)容的字符串形式
b.response.encoding 響應(yīng)的內(nèi)容編碼
c.response.content 響應(yīng)內(nèi)容的二進制
第6節(jié) python環(huán)境基礎(chǔ)設(shè)施搭建pycharm
python 3以上 一步步安裝
配置環(huán)境變量: 系統(tǒng)變量-》path中加入::\Program Files\python
C:\Program Files\python\Scripts
pytchram 2019.2? pychram破解
Pycharm2019.2.1永久激活 - pycod - 博客園
-javaagent:C:\Program Files\JetBrains\PyCharm 2019.2\bin\jetbrains-agent.jar
License server: http://jetbrains-license-server
第7節(jié) 循環(huán)、python列表、字典、截取、面相對象、mysql連接操作(MySQLdb)
字符串&字典&截取&列表:
#python標準的數(shù)據(jù)類型
#number數(shù)字
#String字符串
#Tuple元組
#dictionary字典
#運算符 + -* / % 取整
# a=10;b=20;
# print(a+b)
# print(a-b)
# print(a*b)
# print(b/a)
# # 取余數(shù)
# print(b%a)
# #取整數(shù)
# print(9//2)
#條件判斷語句 >80分 你真棒? <50分你真差80
# cc=float(input("你輸入的成績:"));
# if cc>=80:
#? print("你真棒");
# elif cc<50:
#? print("你真差");
#循環(huán)語句
# a=0;
# while a<10:
#? ? a=a+1;
#? ? print(a)
#contiue用于跳過該次循環(huán)? break退出循環(huán)
#i>10退出循環(huán)
# i=1;
# while i:
#? ? print(i);
#? ? i=i+1;
#? ? if i>20:
#? ? ? ? break
#? ? # i+=1
#輸出1-10偶數(shù)
# i=1;
# while i<10:
#? ? i+=1;
#? ? if i%2>0:
#? ? ? ? continue
#? ? print(i)
for循環(huán)
# list=["a","b","c","d"] #列表
# for i in list:
#? ? print(i)
列表
list=["a","b","c","d"]? 列表的方法? append追加
list=["a","b","c","d","a"]
# list.append(11)
# print(list)
#移除列表元素
# list.remove('a')
# print(list)
#count統(tǒng)計列表中的次數(shù)
num=list.count("a")
print(num)
#pop移除列表的一個元素
# list.pop(2)
# print(list)
#反向列表元素
list.reverse()
print(list)
#字符串操作
cc="123456789";
print(cc[0:3]) #截取第一位到第三位
print(cc[:]) #截取全部字符
print(cc[2]) #截取第三個字符
print(cc[-3:])#截取倒數(shù)三位的字符
print(cc[::-1]) #倒序排序字符
#元組 元組和列表類似,不同之處就是元組的元素不能修改
aa=(1,2,3,4)
bb=(5,6)
print(aa+bb)
#區(qū)別:元組定義元素不能修改,而字典可以被修改
#字典 鍵key 值value
aa={"name":"清心","age":18}
print(aa['name'])
aa['age']=19
print(aa['age'])
面向?qū)ο螅悍庋b
#面向?qū)ο?oop 一種編程思想,萬物皆對象,面向?qū)ο筇岣吡司幊绦?,重復利用性搞?/p>
#一個對象包含了數(shù)據(jù)和操作數(shù)據(jù)的函數(shù)
#把需要重用的函數(shù)或者功能封裝,方便程序直接調(diào)用
#例如我們班的同學都需要睡覺,喝水,吃飯
#清心、Leon,“”都需要喝水,吃飯
封裝:

封裝

繼承
第8節(jié) requests 庫介紹/get/post/上傳/json請求講解
get:

post:

上傳圖片:

常見參數(shù):
? r.url 打印url地址
? r.text 打印服務(wù)器響應(yīng)的內(nèi)容
? r.encoding 打印編碼格式
? r.content 打印請求響應(yīng)體
? r.json()? 打印json格式
? r.status_code 響應(yīng)狀態(tài)碼
? r.headers 響應(yīng)頭信息
? r.headers['token'] 響應(yīng)頭某一個值
? timeout意思是:如果這個接口請求到服務(wù)器響應(yīng)回來的內(nèi)容超過3S就會報錯
? 斷言: self.assertEqual(name,"xxx")
1.json.dumps 將字典轉(zhuǎn)化為字符串)
2.json.loads()函數(shù)是將json格式數(shù)據(jù)轉(zhuǎn)換為字典(可以這么理解,json.loads()函數(shù)是將字符串轉(zhuǎn)化為字典)
第九節(jié) cookie seesion 實戰(zhàn)
獲取cookie

實例化調(diào)用:

session用法:

第10節(jié)? jsonpath
? 1. jsonpath介紹
? ? 用來解析多層嵌套的json數(shù)據(jù);JsonPath 是一種信息抽取類庫,是從JSON文檔中抽取指定信息的工具,提供多種語言實現(xiàn)版本,包括:Javascript, Python, PHP 和 Java
? 2. JsonPath 對于 JSON 來說,相當于 XPath 對于 XML。
? ? 安裝方法:pip install jsonpath? ? 官方文檔:JSONPath - XPath for JSON
3.jsonpath在工作中為我們省了很多力,不用整那么多循環(huán),獲取值從此不費勁,你看
接口:


import jsonpath
? ? #獲取車的NAME
? ? rets = jsonpath.jsonpath(cc, '$..name')
? ? #獲取carNum小于10多少name的值判斷
? ? rescc=jsonpath.jsonpath(cc,"$.data.resList[?(@.carNum<10)].name")?
#獲取tags所有value值
? ? resdd= jsonpath.jsonpath(cc, "$.data.resList[*].tags[*].value")
#組織片段獲取最后兩個值
? ? resff = jsonpath.jsonpath(cc, "$.data.resList[-2:]")?
第11節(jié)? unittest、各種斷言用法、discover、unittest參數(shù)化(paramunittest)
1.unittest單元測試框架:
主要作用:加載用例、執(zhí)行用例、管理用例、集成報告
優(yōu)點:提供用例組織與執(zhí)行方法;提供比較方法;提供豐富的日志、清晰的報告
2.unittest官方文檔? ? https://docs.python.org/2/library/unittest.html
注意事項:
模塊名以test開頭
類以Test開頭
方法以test開頭
3.unittest前需要了解該框架的五個概念:[test case,test suite,test runner,test fixture]
test fixture一個測試用例的初始化準備及環(huán)境還原,主要是setUp() 和 setDown()方法;
setUp() 和 setDown():

setUpClass和tearDownClass只執(zhí)行一次:
setUpClass和tearDownClass的參數(shù)是cls,且在定義之前必須加裝飾器@classmethod
#classmethod 修飾符對應(yīng)的函數(shù)不需要實例化,不需要 self 參數(shù),但第一個參數(shù)需要是表示自身類的 cls 參數(shù)【先科普一下】


test case:一個完整的測試單元,執(zhí)行該測試單元可以完成對某一個問題的驗證,完整體現(xiàn)在:測試前環(huán)境準備(setUp),執(zhí)行測試代碼(run),以及測試后環(huán)境還原(tearDown);
test suite:多個測試用例的集合,測試套件或測試計劃;
test runner:執(zhí)行測試用例,并將測試結(jié)果保存到TextTestResult實例中,包括運行了多少測試用例,成功了多少,失敗了多少等信息;

加入unittest.skip("暫時不執(zhí)行")這條用例不執(zhí)行
verbosity=2
0代表得到執(zhí)行的測試總數(shù)和全局結(jié)果
1代表得到成功的顯示,失敗的顯示f,錯誤顯示E
2可以得到詳細信息
4.unittest斷言我們也經(jīng)常用到:

5. unittest中上面用到addtest有成千上萬的用例加載太麻煩了
discover()方法可以批量加載用例,果斷用上,別用addtest一條一條加載了
unittest中的discover()方法可以批量加載用例
start_dir:測試模塊名或測試用例所在目錄
? pattern='test*.py':表示用例文件名的匹配方式,此處匹配的是以test開頭的.py類型的文件,*表示匹配任意字符
? top_level_dir:測試模塊的頂層目錄import unittest
用例1:
class MyTestCase(unittest.TestCase):
? ? def test_1(self):
? ? ? ? print("1");
用例2:
class MyTestCase(unittest.TestCase):
? ? def test_2(self):
? ? ? ? print("2")

6. 加載生成htmltestrunner報告
? 第一種方式:

第二種方式:

8.unittest參數(shù)化使用(paramunittest)
paramunittest是unittest實現(xiàn)參數(shù)化的一個專門的模塊,可以傳入多組參數(shù),自動生成多個用? 例 前面講數(shù)據(jù)驅(qū)動的時候,用ddt可以解決多組數(shù)據(jù)傳入,自動生成多個測試用例
pip install paramunittest
1.官方文檔地址:ParamUnittest
2.github源碼下載地址:rik0/ParamUnittest

第12節(jié)? pytest自動化框架方式
pytest與unittest對比優(yōu)缺點:
? 1.有獨立的命名,并通過聲明它們從測試函數(shù)、模塊、類或整個項目中的使用來激活。
? 2.按模塊化的方式實現(xiàn),每個fixture都可以互相調(diào)用。
? 3.unittest需要繼承unitest.testcase類,pytest不需要繼承,可以是個類,可以是個函數(shù)? ?
? 4.unittest測試報告htmltestrunner,pytest-html或者是allure
? 5.unittest參數(shù)化需要依賴第三方庫,pytest不需要依賴,直接使用parametrize
? 6.unittest不支持重試,pytest支持重試
? 安裝:?
? ? pip install -U pytest? ?
? pip install -U pytest-html
? pip install -U pytest-rerunfailures(失敗重跑插件)
? 命令行檢查:py.test --version
? 官網(wǎng):API Reference - pytest documentation
? 命名:文件名以test_*.py文件和*_test.py
? test_開頭的函數(shù)? Test開頭的類? test_開頭的方法?
fixture:fixture是pytest中的一個特性:
? 1.包括定義傳入測試中的數(shù)據(jù)集,配置測試前系統(tǒng)的初始狀態(tài),為批量測試提供數(shù)據(jù)源等等
? 2.fixture是pytest用于將測試前后進行預(yù)備,清理工作的代碼分離出核心測試邏輯的一種機制? ?

main運行中-s還有幾個參數(shù):一一道來
-v 用于顯示每個測試函數(shù)的執(zhí)行結(jié)果
-q 只顯示整體測試結(jié)果? ? -s 用于顯示測試函數(shù)中print()函數(shù)輸出
? -x, 在第一個錯誤或測試失敗時立即退出? -h 幫助
fixture的scope參數(shù)方式:【function,module,class,session】
a.function:每個test都運行,默認是function的scope,這種都執(zhí)行

b.class:每個class的所有test只運行一次

c.module:每個module的所有test只運行一次

? session:每個session只運行一次
? fixture為session級別是可以跨.py模塊調(diào)用的,多個.py文件的用例的時候,
? 如果多個用例只需調(diào)用一次fixture,并且寫到conftest.py文件里

conftest.py文件

執(zhí)行session文件
pytest參數(shù)化

pytest中偶爾會使用mark標記方式

備注:除了執(zhí)行bb之外的用例not bb 【 pytest.main(["-s", "test_server.py", "-m=not bb"])
pytest預(yù)期異常
預(yù)期就是拋出一個異常,拋出異常后pytest或停止該條測試用例的繼續(xù)執(zhí)行

第13節(jié) pytest報告生成加載+allure
第一種方式生成報告:pip install pytest-html
if __name__ == '__main__':
? ? unittest.main('-m smoke',
? ? ? ? ? ? ? ? ? '-junit-xml=report/test.xml',
? ? ? ? ? ? ? ? ? '--html=report/test.html'
? ? )

第二種方式生成報告 allure-pytest
安裝:pip install allure-pytest
首先認識幾個概念
官網(wǎng): http://allure.qatools.ru/
@allure.feature # 用于定義被測試的功能,被測產(chǎn)品的需求點
@allure.story # 用于定義被測功能的用戶場景,即子功能點
@allure.severity #用于定義用例優(yōu)先級
@allure.issue #用于定義問題表識,關(guān)聯(lián)標識已有的問題,可為一個url鏈接地址
@allure.testcase #用于用例標識,關(guān)聯(lián)標識用例,可為一個url鏈接地址
@allure.attach # 用于向測試報告中輸入一些附加的信息,通常是一些測試數(shù)據(jù)信息
@pytest.allure.step # 用于將一些通用的函數(shù)作為測試步驟輸出到報告,調(diào)用此函數(shù)的地方會向報告中輸出步驟
allure.environment(environment=env) #用于定義environment環(huán)境
用例實現(xiàn):

封裝一個shell方法啟動進程:

報告方法加載xml&report:

報告結(jié)果生成:
