第五單元、性能測試
1.什么是性能測試
? ? ? ? 通過自動(dòng)化的測試工具模擬系統(tǒng)正常恬叹、異常埋凯、峰值的場景對系統(tǒng)的各項(xiàng)性能指標(biāo)測試
2.什么是性能
? ? ? ? 時(shí)間:系統(tǒng)處理用戶請求的響應(yīng)時(shí)間
? ? ? ? 資源:系統(tǒng)運(yùn)行過程中,系統(tǒng)資源的消耗情況
3.為什么進(jìn)行性能測試
? ? ? ? 1.評(píng)估當(dāng)前系統(tǒng)的能力
? ? ? ? 2.評(píng)估軟件是否滿足未來的需要
? ? ? ? 3.尋找性能瓶頸宠纯,優(yōu)化系統(tǒng)性能
? ? ? ? 4.招聘需要
4.性能測試的分類
? ? ? ? 1.基準(zhǔn)測試
? ? ? ? ? ? 單用戶測試/建立基準(zhǔn)線鸠澈,當(dāng)系統(tǒng)軟硬件環(huán)境發(fā)生變化之后
? ? ? ? ? ? 再進(jìn)行一次基準(zhǔn)測試以確定變化對性能的影響柱告。
? ? ? ? 2.負(fù)載測試
? ? ? ? ? ? 增加系統(tǒng)負(fù)載,在滿足性能指標(biāo)的情況下笑陈,找出系統(tǒng)所能承受最大負(fù)載量的測試
? ? ? ? 3.穩(wěn)定性測試
? ? ? ? ? ? 服務(wù)器穩(wěn)定運(yùn)行的情況下進(jìn)行長時(shí)間測試并最終保證服務(wù)器能滿足線上業(yè)務(wù)需求
? ? ? ? 4.壓力測試
? ? ? ? ? ? 在強(qiáng)壓下际度,查看系統(tǒng)是否具有良好的容錯(cuò)能力和修復(fù)能力
? ? ? ? 5.并發(fā)測試
? ? ? ? ? ? 在極短時(shí)間內(nèi),發(fā)送多個(gè)請求涵妥,驗(yàn)證服務(wù)器對并發(fā)的處理能力
5.性能測試的指標(biāo)
? ? ? ? 1.響應(yīng)時(shí)間? 2s? 5s? 8s
? ? ? ? ? ? 客戶端發(fā)送請求開始乖菱,到客戶端接收到結(jié)果的總時(shí)間
? ? ? ? ? ? 服務(wù)器處理時(shí)間+網(wǎng)絡(luò)傳輸時(shí)間
? ? ? ? 2.并發(fā)用戶數(shù)
? ? ? ? ? ? 某一時(shí)刻同時(shí)向服務(wù)器發(fā)送請求的用戶數(shù)
? ? ? ? 3.吞吐量
? ? ? ? ? ? 單位時(shí)間內(nèi)處理客戶端的請求數(shù)量,直接體現(xiàn)軟件系統(tǒng)的承載能力妹笆。
? ? ? ? 4.QPS
? ? ? ? ? ? 每秒查詢數(shù)块请,即控制服務(wù)器每秒處理的指定請求的數(shù)量
? ? ? ? 5.TPS
? ? ? ? ? ? 每秒事務(wù)數(shù)娜氏,即控制服務(wù)數(shù)每秒處理事務(wù)請求的數(shù)量
? ? ? ? 6.點(diǎn)擊數(shù)
? ? ? ? ? ? 所有頁面元素的請求總數(shù)量
? ? ? ? 7.錯(cuò)誤率
? ? ? ? ? ? 系統(tǒng)在負(fù)載情況下拳缠,失敗業(yè)務(wù)的概率
? ? ? ? 8.資源利用率
? ? ? ? ? ? 系統(tǒng)各種資源的使用情況? ? 率=資源使用率/總資源可用率*100%
? ? ? ? ? ? 常見資源指標(biāo):
? ? ? ? ? ? CPU使用率:不高于75%-85%
? ? ? ? ? ? 內(nèi)存大小使用率:不高于80%
? ? ? ? ? ? 磁盤IO(速率):不高于90%
? ? ? ? ? ? 網(wǎng)路(速率):不高于80%
? ? ? ? 9.業(yè)務(wù)成功率
? ? ? ? ? ? 多用戶對某一業(yè)務(wù)發(fā)送操作的成功率
6.jmeter的作用
? ? ? ? 1.接口測試 面試說postman,因?yàn)榉奖愫糜谩?/p>
? ? ? ? 2.性能測試 jmeter贸弥,也可以用postman(runner)窟坐,但是沒有性能指標(biāo)
? ? ? ? 3.數(shù)據(jù)庫測試
7.線程組是什么?
? ? ? ? 概念:性質(zhì)相同的線程放在一個(gè)組內(nèi)
? ? ? ? 線程組包含線程數(shù)绵疲、準(zhǔn)備時(shí)長哲鸳、循環(huán)次數(shù)
? ? ? ? 1.線程數(shù):虛擬用戶數(shù)
? ? ? ? 2.準(zhǔn)備時(shí)長:啟動(dòng)所有用戶的時(shí)間
? ? ? ? 3.循環(huán)次數(shù):每個(gè)線程發(fā)送請求的次數(shù)
8.jmeter主要組件
? ? ? ? 1.測試計(jì)劃
? ? ? ? 2.線程組:性質(zhì)相同的一組線程(線程數(shù)、準(zhǔn)備時(shí)間盔憨、循環(huán)次數(shù))
? ? ? ? 3.采樣器:HTTP
協(xié)議徙菠、主機(jī)地址、端口號(hào)(選填)郁岩、請求方法婿奔、路徑缺狠、編碼格式(選填)、參數(shù)
? ? ? ? 4.監(jiān)聽器:采集測試結(jié)構(gòu)
? ? ? ? ? ? 察看結(jié)果樹萍摊、用表格查看挤茄、聚合報(bào)告
? ? ? ? 5.循環(huán)控制器
? ? ? ? 6.事務(wù)控制器
? ? ? ? ? ? 事務(wù):多個(gè)操作組合
? ? ? ? ? ? 作用:
? ? ? ? 7.固定定時(shí)器
? ? ? ? ? ? ? ? 作用:控制兩個(gè)采樣器的間隔
? ? ? ? 8.斷言
? ? ? ? ? ? ? ? 1.Json斷言:判斷某個(gè)key對應(yīng)某個(gè)value
? ? ? ? ? ? ? ? 2.響應(yīng)斷言:響應(yīng)中包含某個(gè)串
? ? ? ? 9.前置處理器和后置處理器
9.參數(shù)化
? ? ? ? 1.用戶自定義變量:
? ? ? ? ? ? ? ? 作用:提供全局變量,方便修改
? ? ? ? ? ? ? ? 使用:配置元件 → 用戶定義的變量 → key value → ${key}
? ? ? ? 2.CSV data set config
? ? ? ? ? ? ? ? 配置文件:
? ? ? ? ? ? ? ? 添加元件:CSV data set config → 選中文件 → 編碼 → 字段1,字段2
? ? ? ? ? ? ? ? 在采樣器界面:添加參數(shù) → 調(diào)用${字段名稱}
? ? ? ? 3.CSV函數(shù)小助手
? ? ? ? ? ? ? ? ? 工具? → 函數(shù)小助手 → 選擇CSV Read → 復(fù)制文件路徑 → 字段編號(hào) → 生成 → 自動(dòng)復(fù)制冰木,過去粘貼
10.接口依賴
? ? ? ? 正則語法:* + ? . ()
? ? ? ? 實(shí)現(xiàn):
? ? ? ? ? ? ①添加HTTP請求穷劈,使用正則提取一個(gè)需要字段
? ? ? ? ? ? ②在第一個(gè)HTTP請求里邊調(diào)用字段${字段}
第六單元 jmeter腳本錄制和壓測
1.什么是腳本錄制
在進(jìn)行測試的時(shí)候,可能有好多腳本或者界面需要操作測試踊沸,并且有些測試鏈接需要重復(fù)多線程高并發(fā)進(jìn)行測試歇终,我們一般會(huì)針對這一些操作,進(jìn)行一個(gè)腳本錄制雕沿,錄制好之后练湿,之后測試就可以在這個(gè)基礎(chǔ)上進(jìn)行測試。
2.腳本錄制方式
? ? web端:badboy腳本錄制
? ? app端:使用Jmeter自帶的代理服務(wù)器進(jìn)行腳本錄制
3.Android手機(jī)端腳本錄制
? ? 1.同網(wǎng)
? ? 2.添加http代理服務(wù)器
? ? 3.在線程中添加錄制控制器
? ? 4.在http代理服務(wù)器中指定錄制腳本的路徑审轮,默認(rèn)端口8888
? ? 5.查看本地的ip
? ? 6.設(shè)置移動(dòng)端代理肥哎,IP和端口號(hào)
? ? 7.啟動(dòng)
? ? 8.打開手機(jī)app,抓取接口
4.web端腳本錄制
安裝badboy腳本軟件→打開badboy軟件→使用
第七單元 Jmeter壓測
一.數(shù)據(jù)庫壓測
? ? 1.為什么要緊行數(shù)據(jù)庫壓測
? ? ? ? 不斷給數(shù)據(jù)庫施加壓力疾渣,驗(yàn)證數(shù)據(jù)庫處理的性能
? ? 2.如何進(jìn)行數(shù)據(jù)庫壓測
? ? ? ? 1.jdbc配置:創(chuàng)建線程組→添加配置元件JDBC Connection Configuration→對數(shù)據(jù)庫連接的配置進(jìn)行設(shè)置→添加jdbc Request請求→運(yùn)行
select statement:只支持單條查詢篡诽,只支持第一條數(shù)據(jù)查詢
updata statement:修改數(shù)據(jù)
Callable Statement:支持查詢、修改榴捡、支持多個(gè)查詢
Prepared Select Statement:類型必須為varchar**結(jié)合csv配置數(shù)據(jù)
二.1.jmeter對服務(wù)器壓測(windows)
? ? ? 資源準(zhǔn)備:? JMeterPlugins-Extras.jar和JMeterPlugins-Standard.jar放到apache-jmeter-3.0\lib\ext目錄下
? ? 操作:打開server的監(jiān)聽→添加監(jiān)聽器-jp@gc - PerfMon Metrics Collector→添加性能指標(biāo)杈女,線程組設(shè)置線程數(shù)和時(shí)間
? ? 2.jmeter對服務(wù)器壓測(linux)
同上
第八單元 Python基本語法
一、Python介紹
? ? Python 是一個(gè)高層次的結(jié)合了解釋性吊圾、編譯性达椰、互動(dòng)性和面向?qū)ο蟮哪_本語言
二、發(fā)展歷程
Python: Guido van Rossum 八十年代末和九十年代初 荷蘭
三项乒、Python的特點(diǎn)
易于學(xué)習(xí), 易于閱讀, 易于維護(hù), 一個(gè)廣泛的標(biāo)準(zhǔn)庫, 互動(dòng)模式的支持
可移植, 可擴(kuò)展, 提供數(shù)據(jù)局接口啰劲,GUI編程,可嵌入
四檀何、Pycharm及python安裝詳細(xì)教程
五蝇裤、Python變量和數(shù)據(jù)類型
Python3 的六個(gè)標(biāo)準(zhǔn)數(shù)據(jù)類型中:
不可變數(shù)據(jù)(3 個(gè)):Number(數(shù)字)、String(字符串)频鉴、Tuple(元組)栓辜;
可變數(shù)據(jù)(3 個(gè)):List(列表)、Dictionary(字典)垛孔、Set(集合)
六藕甩、標(biāo)識(shí)符
. 標(biāo)識(shí)符只能由字母、下劃線“_”周荐、數(shù)字組成狭莱。
. 標(biāo)識(shí)符不能以數(shù)字開頭悯姊。
. 標(biāo)識(shí)符不能使用關(guān)鍵字
. 標(biāo)識(shí)符對大小寫敏感。
(建議:標(biāo)識(shí)符命名應(yīng)“見名知意”)
七贩毕、關(guān)鍵字
'False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield'
八悯许、運(yùn)算符
算術(shù)運(yùn)算符: +,-辉阶,*先壕,/,%谆甜,**垃僚,//
邏輯運(yùn)算符:and, or, not
比較運(yùn)算符: ==, !=, >,<,>=,<=
賦值運(yùn)算符:=, +=, -=, /=, %=, **=, //=, :=
第九單元 python基礎(chǔ)--語句
一、判斷語句
if語句的使用格式
if 要判斷的條件:
? ? ?? 條件成立時(shí)规辱,要做的事情
if-else的使用格式
if要判斷的條件:
?? 條件成立時(shí)谆棺,要做的事情
else:
?? 條件不成立時(shí),要做的事情
if-elif-else的使用格式
if要判斷的條件:
?? 條件成立時(shí)罕袋,要做的事情
elif要判斷的條件:
?? 條件成立時(shí)改淑,要做的事情
else:
?? 條件不成立時(shí),要做的事情
if嵌套
if要判斷的條件:
?? 條件成立時(shí)浴讯,要做的事情
if要判斷的條件:
? ? ?? 條件成立時(shí)朵夏,要做的事情
else:
? ? ?? 條件不成立時(shí),要做的事情
else:
?? 條件不成立時(shí)榆纽,要做的事情
二:循環(huán)語句
while循環(huán)的格式
while條件:
?? 條件成立時(shí)仰猖,要做的事情
?? 條件成立時(shí),要做的事情
?? .....
while循環(huán)嵌套
while條件:
?? 條件成立時(shí)奈籽,要做的事情
?? 條件成立時(shí)饥侵,要做的事情
?? .....
while條件:
? ? ?? 條件成立時(shí),要做的事情
? ? ?? 條件成立時(shí)衣屏,要做的事情
? ? ?? .....
for循環(huán)
for 臨時(shí)變量 in 列表或者字符串等可迭代對象:
?? 循環(huán)滿足條件時(shí)執(zhí)行的代碼
pass的使用
1.Pythonpass是空語句躏升,是為了保持程序結(jié)構(gòu)的完整性。
2.pass不做任何事情勾拉,一般用做占位語句煮甥。
第十單元列表
1.格式:listName=[元素盗温,元素]
2.特點(diǎn):有序藕赞,可重復(fù),可變卖局,任意類型斧蜕,性能不好
3.增:
? ? ? ? 1.append:list.append(元素),追加到末尾
2.extend:list.extend(元素)砚偶,追加到末尾批销,散開添加
3.insert:list.insert:(index,元素)洒闸,添加元素到指定位置,如果新增的索引不存在添加到末尾
4.改:list[index]=新元素
注意:如果index存在則修改均芽,不存在則越界
5.刪
1.del:del list[index],刪除指定下標(biāo)對應(yīng)的元素丘逸,如果index不存在,則報(bào)錯(cuò)索引越界
2.pop:list.pop()掀宋,刪除末尾元素
3.remove:刪除指定元素深纲,list.remove(元素),如果元素不存在報(bào)錯(cuò)
6.查
1.list.index(元素):查看元素下標(biāo)
2.list.count(元素):查詢列表中的元素的個(gè)數(shù)
7.排序:
1.升序:list.sort()
2.降序:
1.list.sort(Reverse=True)
2.list.sort().reverse()
注意:如果不是數(shù)字劲妙,則報(bào)錯(cuò)
8.列表的循環(huán)取值
1.for
for i in list:
? ? list[i]
2.while
i=0
while 條件:
? ? list[i]
? ? i+=1
9.list嵌套
1.格式:list=[list1,list2,list3]
2.取值:list[外層下標(biāo)][內(nèi)層下標(biāo)】
3.刪除:del [外層下標(biāo)][內(nèi)層下標(biāo)】
4.添加:list[外層下標(biāo)].insert(內(nèi)層插入下標(biāo)湃鹊,元素)
5.[外層下標(biāo)][內(nèi)層下標(biāo)】=值
第十一單元 元組和字典
1.格式:t=(元素,元素)
2.特點(diǎn):有序镣奋,可重復(fù)币呵,不可變,任意類型
3.訪問元組
索引值存在:print(t[2])
索引值不存在:報(bào)錯(cuò)
4.查詢:
1.查詢個(gè)數(shù):t.count(元素
2.查詢下標(biāo):t.index(元素)
5.修改:不可修改侨颈,虛轉(zhuǎn)換類型
6.類型轉(zhuǎn)換
列表轉(zhuǎn)換元祖
aa = [23,34,45,56,67]
tuple(aa)
print(aa)
#[23, 34, 45, 56, 67]
元組轉(zhuǎn)換列表
aTuple=('b','c','d','e','f','g')
a = list(aTuple)
print(a)
#['b', 'c', 'd', 'e', 'f', 'g']
7.元組的循環(huán)取值
1.for
for i in aTuple:
?? print(i)
2.while
i=0
while i < len(aTuple):
?? print(aTuple[i])
?? i=i+1
第十一單元 元組和字典
一.元組
1.格式:t=(元素余赢,元素)
2.特點(diǎn):有序,可重復(fù)哈垢,不可變没佑,任意類型,性能好
3.訪問元組
索引值存在:print(t[2])
索引值不存在:報(bào)錯(cuò)
4.查詢:
1.查詢個(gè)數(shù):t.count(元素)
2.查詢下標(biāo):t.index(元素)
5.修改:不可修改温赔,虛轉(zhuǎn)換類型
6.類型轉(zhuǎn)換
列表轉(zhuǎn)換元祖
aa = [23,34,45,56,67]
tuple(aa)
print(aa)
#[23, 34, 45, 56, 67]
元組轉(zhuǎn)換列表
aTuple=('b','c','d','e','f','g')
a = list(aTuple)
print(a)
#['b', 'c', 'd', 'e', 'f', 'g']
7.元組的循環(huán)取值
1.for
for i in aTuple:
?? print(i)
2.while
i=0
while i < len(aTuple):
?? print(aTuple[i])
?? i=i+1
二.字典
1.格式:變量名={key1:value,key2:value}
2.特點(diǎn):有序蛤奢,不可重復(fù),可變陶贼,任意類型啤贩,性能不好
3.根據(jù)鍵訪問
1.z={key1:value,key2:value}
print(z["key"])
2.z={key1:value,key2:value}
print(z.get("name"))
4.修改
1.有對應(yīng)的key
z["key"]="value"
print(z)
2.沒有對應(yīng)的key是新增數(shù)據(jù)到末尾
5.添加
z["key"]="value"
6.刪除
1.del
del z["key"]
print(z)
2.clear:清空字典里的內(nèi)容
z.clear()
print(z)
7.長度
print(len(z))
8.字典循環(huán)
1.取出key
for i in z.keys():
?? print(i)
2.取出value
for i in z.values():
?? print(i)
3.取出key和value方法一
for i,j in z.items():
?? print(i,j,sep=":")
4.取出key和value方法二
for i in z.keys():
?? print(i,z[i],sep=":")
5.擴(kuò)充的
for i,j in enumerate(z):
?? print(i,j,z[j])
十二單元
一、集合
1.集合的特點(diǎn):無序拜秧、唯一痹屹、去重
2.格式:j={元素,元素}
3.添加:
1.j.add(元素)
2.
j={1,"vfd",5,2,"vedfbrgb"}
i=["小何","真美",48]
j.update(i)
4.刪除
1.remove:刪除集合中的元素 如果有直接刪除 如果沒有程序報(bào)錯(cuò)
j.remove(元素)
2.pop:都是數(shù)字,刪最小的枉氮,其余升序排序志衍;
? 都是非數(shù)字,隨機(jī)刪聊替,其余隨機(jī)排序楼肪;
數(shù)字和非數(shù)字,隨機(jī)刪惹悄,刪數(shù)字的話就是最小的春叫,刪非數(shù)字的話,隨機(jī)刪
注意:如果集合中沒有元素,則報(bào)錯(cuò)
j.pop()
3.discard:如果元素存在直接刪除 如果元素不存在不做任何操作
j.discard(元素)
5.交集
連接多個(gè)集合暂殖,輸出相同的元素(set可用)
? ? j={1,"vfd",5,2,"vedfbrgb"}
?? ? ? i={5,2,"小","美",48}
?? ? ? a=j&i
?? ? ? print(a) ? #{5,2}
6.并集
去重价匠,得到全部集合中全部的元素
? ? j={1,"vfd",5,2,"vedfbrgb"}
?? ? ? i={5,2,"小","美",48}
?? ? ? a=j|i
?? ? ? print(a) ? #{1, 2, 5, 48, '真', '小', 'vfd', 'vedfbrgb'}
7.公共方法
1.加(列表和元祖可用)
j=(1,"vfd",5,)
i=(5,48)
print(j+i)? #(1, 'vfd', 5, 5, 48)
2.乘(列表和元祖可用)
j=(1,"vfd",5,)
i=(5,48)
print(j*2)? #(1, 'vfd', 5, 1, 'vfd', 5)
3.包含(in)(列表和元祖和字典可用)
j=(1,"vfd",5,)
print(1 in (j)) ? #True
j=(1,"vfd",5,)
print(6 in (j)) ? #False
4.不包含(no in)(列表和元祖和字典可用)
j=(1,"vfd",5,)
print(1 not in (j)) ? #False
j=(1,"vfd",5,)
print(6 not in (j)) ? #True
8.內(nèi)置函數(shù)
長度:print(len(變量名))
最大值:print(max(變量名))
最小值:print(min(變量名))
del:第一種:del 變量名
第二種:del(變量名)
二、函數(shù)
1.什么是函數(shù)
其實(shí)就是方法呛每、功能
2.函數(shù)的定義和調(diào)用
格式:
def函數(shù)名():
執(zhí)行語句
函數(shù)名()
3.函數(shù)參數(shù)
1.正常的
defadd2num():
a=11
b=22
c=a+b
printc
2.位置參數(shù)
def函數(shù)名(參數(shù)1,參數(shù)2):
代碼塊
函數(shù)名(值1,值2)
3.關(guān)鍵字參數(shù)
def函數(shù)名(參數(shù)1,參數(shù)2):
代碼塊
函數(shù)名(參數(shù)1=值1,參數(shù)2=值2)
案例:deffun(a,b):
print("a:",a)
print("b:",b)
fun(a=2,b=3)
案例二:deffun(a,b):
print("a:",a)
print("b:",b)
fun(3,b=2)
注意:位置參數(shù)一定要在關(guān)鍵字參數(shù)之前
4.缺省參數(shù)(默認(rèn)參數(shù))
案例一:
defprintinfo(name,age=20):
print("name:",name)
print("age:",age)
printinfo(name="anfly")
#name: anfly
#age: 20
案例二:
defprintinfo(name,age=20):
print("name:",name)
print("age:",age)
printinfo(name="anfly",age=10)
#name: anfly
#age: 10
注意:缺省參數(shù)一定要位于位置參數(shù)的最后面
5.不定時(shí)參數(shù)
*args:為元組
**kwargs:為字典
defprintinfo(*args,**kwargs):
print("args:",args)
print("kwargs:",kwargs)
printinfo(1,2,3,a=5,b=6)
#args:1,2,3
#kwargs:a=5,b=6
6.參數(shù)位置順序
deffun(位置參數(shù),*args,缺省參數(shù),**kwargs):
代碼塊
fun(參數(shù)值)
案例:
deffun(a,b,*args,c=6,**kwargs):
print("a=",a)
print("b=",b)
print("args=",args)
print("c=",c)
print("kwargs=",kwargs)
fun(1,2,3,4,5,9,c=1000,f=45,cf=65)
#a= 1
#b= 2
#args= (3, 4, 5, 9)
#c= 1000 ? 如果下面的fun不給c=1000的話下面輸出的c的值就為6
#kwargs= {'f': 45, 'cf': 65}
4.函數(shù)返回值
def fan(a,b): ? ?
? return a+b
print(fan(1,2)) ? #3
5.函數(shù)類型
1. 無參數(shù)踩窖,無返回值
2. 無參數(shù),有返回值
3. 有參數(shù)晨横,無返回值
4. 有參數(shù)毙石,有返回值
6.匿名函數(shù)
lambda函數(shù)也叫匿名函數(shù),即函數(shù)沒有具體的名稱
案例一:
sum=lambda a,b:a+b
print(sum(1,2))? #3
案例二:
sum=lambda a,b:100
print(sum(1,2))? #100
三颓遏、變量
1.局部變量
# 局部變量
def jv(): ?
? ? a=3
? ? print(a)
def jv1(): ? ?
? ? a=99
? ? print(a)
jv()? ? #3
jv1() ?? #99
2.全局變量(就近原則)
a="全局變量"
def jv(): ? ? ?
? ? print(a)
def jv1(): ? ?
? ? a=99
? ? print(a)
jv() ? #全局變量
jv1()? #99
3.局部變量升成全局變量
def jv(): ?
? ? a=3
? ? global b
? ? b="我也是全局變量"
? ? print(a)
def jv1(): ? ?
? ? a=99
? ? print(a)
? ? print(b)
jv()? ? #3
jv1()? #99 #“我也是全局變量”
十三單元 文件
一徐矩、文件的介紹
1.例如:HTML、TXT叁幢、File等
2.文件的作用:保存數(shù)據(jù)存放在磁盤
二滤灯、文件的打開與關(guān)閉
1.讀文件:
1.
方式一:
f = open('文件', 'r',encoding='utf-8')? ? #,encoding='utf-8'解決讀文件中文報(bào)錯(cuò)
? ? print(f.read())
方式二:
? ? readlines:一次性讀出文件所有內(nèi)容
f=open("a.txt",'r',encoding='utf-8')
print(f.readlines()) ?
方式三:
? ? readline:一行一行的讀出文件內(nèi)容
f=open("a.txt",'r',encoding='utf-8')
print(f.readline())
2.讀取長度限制
content=f.read(8)
print(content) ? #控制臺(tái)只出現(xiàn)八個(gè)字符
2.寫文件:
? ? ? ? 方式一:
? ? ? ? f=open('文件名.txt','w')
? ? ? ? ? ? ?? f.write("要寫入的信息")
? ? ? ? ? ? ?? f.close()
? ? ? ? 方式二:
? ? ? ? f=open('b.txt','a')? #追加寫入數(shù)據(jù)
? ? ? ? ? ? ?? f.write("新的數(shù)據(jù)")
? ? ? ? ? ? ?? f.close()
3.二進(jìn)制讀寫
二進(jìn)制讀數(shù)據(jù)
with open("照片.jpg","rb") as 對象:
? 變量名 = 對象.read()
?? print(變量名)
三、文件和文件夾的操作
1.文件操作
1.文件重命名
import os
os.rename("要修改的文件.txt","新文件.txt")
2.刪除文件
import os
os.remove("要?jiǎng)h除的文件")
2.文件夾操作
1.創(chuàng)建文件夾
import os
os.mkdir("文件夾名")
2.獲取當(dāng)前目錄
print(os.getcwd())
四曼玩、異常
1.什么是異常
其實(shí)就是正常運(yùn)行的程序發(fā)生了一個(gè)錯(cuò)誤
2.異常處理
? ? 語法
一鳞骤、
try:
<語句>#運(yùn)行別的代碼
except<名字>:
<語句>#如果在try部份引發(fā)了'name'異常
else:
<語句>#如果沒有異常發(fā)生
二、
try:
異常的操作
except(Exception1[,Exception2[,...ExceptionN]]]):
發(fā)生以上多個(gè)異常中的一個(gè)黍判,執(zhí)行這塊代碼
? ......................
else:
如果沒有異常執(zhí)行這塊代碼
三豫尽、
try:
<語句>
finally:
<語句>#退出try時(shí)總會(huì)執(zhí)行
五、模塊
1.含義:是一個(gè)Python文件顷帖,以.py 結(jié)尾美旧,包含了Python 對象定義和Python語句
2.模塊的引入
1.import
importaa#aa是文件名,test2是aa文件里面的一個(gè)方法
aa.test2()
開平方根
importmath
print(math.sqrt(4))
#2
2.from...import
一贬墩、
from 要調(diào)用的文件 import 文件里面的方法
方法()
二榴嗅、
from modname import *? #調(diào)用文件里的所有方法
六、Python中的包
簡單地說其實(shí)包就是文件夾陶舞,文件夾下面必須存在init.py文件
十四單元 Python面向?qū)ο?br>
一嗽测、面向?qū)ο?/b>
類. 類變量. 數(shù)據(jù)成員. 方法重寫. 局部變量. 實(shí)例變量. 繼承. 實(shí)例化. 方法. 對象
二、創(chuàng)建類
classClassName:
'類的幫助信息'#類文檔字符串
class_suite#類體
三肿孵、創(chuàng)建實(shí)例對象
1唠粥、創(chuàng)建
"創(chuàng)建 Employee 類的第一個(gè)對象"
emp1=Employee("Zara",2000)
"創(chuàng)建 Employee 類的第二個(gè)對象"
emp2=Employee("Manni",5000)
2、訪問屬性
emp1.displayEmployee()
emp2.displayEmployee()
print"Total Employee %d"%Employee.empCount
3停做、增刪改
emp1.age=7# 添加一個(gè) 'age' 屬性
emp1.age=8# 修改 'age' 屬性
delemp1.age# 刪除 'age' 屬性
也可以使用以下函數(shù)的方式來訪問屬性:
getattr : 訪問對象的屬性晤愧。
hasattr : 檢查是否存在一個(gè)屬性。
setattr : 設(shè)置一個(gè)屬性雅宾。如果屬性不存在养涮,會(huì)創(chuàng)建一個(gè)新屬性
delattr: 刪除屬性。
hasattr(emp1,'age')# 如果存在 'age' 屬性返回 True眉抬。
getattr(emp1,'age')# 返回 'age' 屬性的值
setattr(emp1,'age',8)# 添加屬性 'age' 值為 8
delattr(emp1,'age')# 刪除屬性 'age'
四贯吓、Python內(nèi)置類屬性
dict : 類的屬性
doc :類的文檔字符串
name: 類名
module: 類定義所在的模塊
bases : 類的所有父類構(gòu)成元素
五、類的繼承
1蜀变、繼承介紹
通過繼承創(chuàng)建的新類稱為子類或派生類悄谐,被繼承的類稱為基類、父類或超類
2库北、語法
class派生類名(基類名)
?? ...
3爬舰、可以繼承多個(gè)類
classA:# 定義類 A
.....
classB:# 定義類 B
.....
classC(A,B):# 繼承類 A 和 B
.....
六、方法重寫
1寒瓦、概念
如果你的父類方法的功能不能滿足你的需求情屹,你可以在子類重寫你父類的方法
七、基礎(chǔ)重載方法
序號(hào)方法杂腰、描述垃你、簡單的調(diào)用
1*init* ( self [,args...] ) 構(gòu)造函數(shù) 簡單的調(diào)用方法: obj = className(args)
2*del*( self ) 析構(gòu)方法, 刪除一個(gè)對象 簡單的調(diào)用方法 : del obj
3*repr*( self ) 轉(zhuǎn)化為供解釋器讀取的形式 簡單的調(diào)用方法 : repr(obj)
4*str*( self ) 用于將值轉(zhuǎn)化為適于人閱讀的形式 簡單的調(diào)用方法 : str(obj)
5*cmp* ( self, x ) 對象比較 簡單的調(diào)用方法 : cmp(obj, x)
八、運(yùn)算符重載
九喂很、類屬性與方法
1惜颇、類的私有屬性
__pri_attr:兩個(gè)下劃線開頭,聲明該屬性為私有
在類內(nèi)部的方法中使用時(shí)self.__pri_attr
2少辣、類的方法
在類的內(nèi)部凌摄,使用def關(guān)鍵字可以為類定義一個(gè)方法
3、類的私有方法 __pri_attr:兩個(gè)下劃線開頭漓帅,聲明該方法為私有方法
在類的內(nèi)部調(diào)用__pri_attr
第十五單元 Python單元測試之unittest
一锨亏、單元測試、集成測試忙干、功能測試
單元測試
顆粒度最小屯伞,一般由開發(fā)小組采用白盒方式來測試,主要測試單元是否符合“設(shè)計(jì)”豪直;是指對軟件中的最小可測試單元進(jìn)行檢查和驗(yàn)證
集成測試
介于單元測試和系統(tǒng)測試之間劣摇,一般由開發(fā)小組采用白盒+黑盒的方法來測試,即驗(yàn)證“設(shè)計(jì)”又驗(yàn)證“需求”弓乙。主要用來測試模板與模板之間的接口末融,同時(shí)還要測試一些主要的業(yè)務(wù)功能。
功能測試
顆粒度最大暇韧,一般由獨(dú)立的測試小組采用黑盒的方式來測試勾习,主要測試系統(tǒng)是否符合“需求規(guī)格說明書
白盒測試
主要應(yīng)用于單元測試階段,主要是對代碼級(jí)別的測試懈玻,針對程序內(nèi)部的邏輯結(jié)構(gòu)
黑盒測試
測試系統(tǒng)的功能是否滿足“需求規(guī)格說明書
二巧婶、Unittest重要組成
TestFixture
作用:用于一個(gè)測試環(huán)境的準(zhǔn)備和銷毀還原
功能:當(dāng)測試用例每次執(zhí)行之前需要準(zhǔn)備測試環(huán)境,每次測試完成后還原測試環(huán)境
主要方法:
setUp():準(zhǔn)備環(huán)境,執(zhí)行每個(gè)測試用例的前置條件艺栈;
tearDown():環(huán)境還原英岭,執(zhí)行每個(gè)測試用例的后置條件;
setUpClass():必須使用@classmethod裝飾器湿右,所有case執(zhí)行的前置條件诅妹,只運(yùn)行一次;
tearDownClass():必須使用@classmethod裝飾器毅人,所有case運(yùn)行完后只運(yùn)行一次吭狡;
TestCase:測試用例
定義:一個(gè)類class繼承 unittest.TestCase,就是一個(gè)測試用例
測試用例:就是一個(gè)完整的測試流程
包括測試前準(zhǔn)備環(huán)境的搭建(setUp)丈莺,執(zhí)行測試代碼(run)划煮,以及測試后環(huán)境的還原(tearDown)
測試用例命名規(guī)則
測試方法的名稱要以test開頭。只會(huì)執(zhí)行以test開頭定義的方法
十六單元 單元測試之pytest
前提:需要安裝pytest和pytest-html(生成html測試報(bào)告)
一.命名規(guī)則
**Pytest單元測試中的類名和方法名必須是以test開頭
importpytest
fromxml.domimportminidom
classTestPy01():
deftestPy001(self):
print("第一個(gè)pytest")
assert1==1
deftestPy002(self):
print("第二個(gè)pytest")
assert1==2
deftestPy003(self):
print("第三個(gè)pytest")
assert1==1
if__name__=='__main__':
pytest.main()
二缔俄、Pytest生成自帶的html測試報(bào)告
前提條件:需要下載pytest-html模塊(python自帶的生成測試報(bào)告模塊)
方式一:
pytest.main(["--html=./report.html","模塊.py"])#運(yùn)行該模塊的所有測試用例
方式二:
pytest.main([‘--html=./report.html’,‘模塊.py::類::test_a_001']) #指定運(yùn)行的測試用例
方式三:
pytst.main(['-x','--html=./report.html','t12est000.py'])#填一個(gè)附加參數(shù)
方式四:
pytest.main(["--html=./report.html"])#無效 ? ? ? ?
-x:出現(xiàn)一條測試用例失敗就退出測試
-v:豐富信息模式,輸出更詳細(xì)的用例執(zhí)行信息
-s:顯示print內(nèi)容
-q:簡化結(jié)果信息般此,不會(huì)顯示每個(gè)用例的文件名
跳過該用例使用@pytest.mark.skip()
@pytest.mark.skip()
deftest001(self):
assert2==2
三、Pytest的運(yùn)行方式
.點(diǎn)號(hào)牵现,表示用例通過
F表示失敗Failure
E表示用例中存在異常Error
四铐懊、文件讀取
##讀取csv文件
importcsv#導(dǎo)入csv模塊
classReadCsv():
defread_csv(self):
item=[]#定義一個(gè)空列表
c=csv.reader(open("../commonDemo/test1.csv","r"))#得到csv文件對象
forcsv_iinc:
item.append(csv_i)#將獲取的數(shù)據(jù)添加到列表中
returnitem
r=ReadCsv()
print(r.read_csv())
##讀取xml文件
fromxml.domimportminidom
classReadxml():
defread_xml(self,filename,onename,twoname):
root=minidom.parse(filename)
firstnode=root.getElementsByTagName(onename)[0]
secondnode=firstnode.getElementsByTagName(twoname)[0].firstChild.data
returnsecondnode
五、Allure
Allure是一款輕量級(jí)并且非常靈活的開源測試報(bào)告框架瞎疼,它支持絕大多數(shù)測試框架科乎, 例如TestNG、Pytest贼急、JUint等茅茂。它簡單易用,易于集成
1.先下載Allure→配置Alluer環(huán)境變量→輸入allure檢驗(yàn)配置是否成功→安裝allure,輸入(pip install allure-pytest)
2.Allure常用的特性
@allure.feature# 用于描述被測試產(chǎn)品需求
@allure.story# 用于描述feature的用戶場景太抓,即測試需求
withallure.step():# 用于描述測試步驟空闲,將會(huì)輸出到報(bào)告中
allure.attach# 用于向測試報(bào)告中輸入一些附加的信息,通常是一些測試數(shù)據(jù)走敌,截圖等
案例:
importpytest,allure,os
classTestClass005():
@allure.feature("用戶登錄功能")#用于定義被測試的功能碴倾,被測產(chǎn)品的需求點(diǎn)
@allure.story("登錄成功")#用于定義被測功能的用戶場景,即子功能點(diǎn)
deftest_success(self):
assert1==1
@allure.feature("用戶登錄功能")#用于定義被測試的功能掉丽,被測產(chǎn)品的需求點(diǎn)
@allure.story("登錄失敗")#用于定義被測功能的用戶場景从藤,即子功能點(diǎn)
deftest_fail(self):
assert1==2
if__name__=='__main__':
pytest.main(['--alluredir','report/result','test_06.py'])#生成json類型的測試報(bào)告
split='allure '+'generate '+'./report/result '+'-o '+'./report/html '+'--clean'#將測試報(bào)告轉(zhuǎn)為html格式
os.system(split)# system函數(shù)可以將字符串轉(zhuǎn)化成命令在服務(wù)器上運(yùn)行
十七單元 requests接口測試
1.介紹:
Requests是一個(gè)很實(shí)用的Python HTTP客戶端庫领舰,用來做接口測試
*做接口測試前需要pip install requests
2.get請求
一、無參請求
r=requests.get('http://www.baidu.com')
二伸辟、get傳參
payload={'key1':'value1','key2':'value2','key3':None}
r=requests.get('http://www.baidu.com ',params=payload)
3.post請求
payload={'key1':'value1','key2':'value2'}
r=requests.post("http://httpbin.org/post",data=payload)
4.requests響應(yīng)
r.status_code響應(yīng)狀態(tài)碼
r.heards響應(yīng)頭
r.cookies響應(yīng)cookies
r.text響應(yīng)文本
r.encoding當(dāng)前編碼
r.content以字節(jié)形式(二進(jìn)制)返回
5.requests擴(kuò)充
1.添加等待時(shí)間
requests.get(url,timeout=1)#超過等待時(shí)間則報(bào)錯(cuò)
2.添加請求頭信息
requests.get(url,headers=headers)#設(shè)置請求頭
3.添加文件
requests.post(url,files=files)#添加文件
6.requests+pytest+allure
1.步驟如下:
讀取文件中的數(shù)據(jù)
requests拿到數(shù)據(jù)請求接口返回狀態(tài)碼
通過斷言驗(yàn)證返回狀態(tài)碼和200對比
生成allure的測試報(bào)告
也可以這樣說:
dataDemo(存放數(shù)據(jù))>> readDemo(讀取數(shù)據(jù))
useRequests(發(fā)送請求)>>testDemo(生成報(bào)告)
2.讀取csv數(shù)據(jù)流程
1.通過excel另存為csv
2.讀取
importcsv
classReadCsv():
defreadCsv(self):
item= []
rr=csv.reader(open("../dataDemo/123.csv"))
forcsv_iinrr:
item.append(csv_i)
item=item[1:]
returnitem
3.requests請求接口返回狀態(tài)碼
importrequests
fromreadDataDemo.readcsvimportReadCsv
r=ReadCsv()
ee=r.readCsv()
# print(ee)
classRequestCsv():
defrequestsCsv(self):
item= []
forcsv_iinee:
ifcsv_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)
returnitem
4.生成測試報(bào)告
3.讀取excel文件流程
1.新建excel文件
2.讀取數(shù)據(jù)通危,安裝pip install openpyxl
class ReadXlsx: ? ?
def readXlsx(self): ? ? ?
?? wordbook=load_workbook("絕對路徑") ? ? ? ?
?? sheet = wordbook["requests"] ? ? ? ?
?? testdata = [] ? ? ? ?
?? for i in range(2, sheet.max_row + 1): ? ? ? ? ? ?
? ? ?? d = {} ? ? ? ? ? ?
? ? ?? for j in range(1, sheet.max_column + 1): ? ? ? ? ? ? ? ? ? ? ? ? ?? d[sheet.cell(1, j).value] = sheet.cell(i, j).value ? ? ? ? ? ? ?? testdata.append(d) ? ? ? ? ? ?
? ? return testdata
3.requests請求接口返回狀態(tài)碼
importrequests
fromrequestdemo.readexcelimportReadxcel
classGetStatusCode():
defgetStatusCode(self):
t=Readxcel()
f=t.getTestExcel()
item= []
forexcel_iinf:
ifexcel_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)
returnitem
print(GetStatusCode().getStatusCode())
4.生成測試報(bào)告
importallure,pytest,os
fromrequestdemo.getStatusCodeimportGetStatusCode
get=GetStatusCode()
statusCodes=get.getStatusCode()
classTestReadExcel():
deftestReadExcel(self):
forcodeinstatusCodes:
assertcode==200
if__name__=="__main__":
# 生成測試報(bào)告json
pytest.main(["-s","-q",'--alluredir','report/result','testreadexcel.py'])
# 將測試報(bào)告轉(zhuǎn)為html格式
split='allure '+'generate '+'./report/result '+'-o '+'./report/html '+'--clean'
os.system(split)
十八單元 自動(dòng)化持續(xù)繼承
一边篮、概念
互聯(lián)網(wǎng)軟件的開發(fā)和發(fā)布揭厚,已經(jīng)形成了一套標(biāo)準(zhǔn)流程,最重要的組成部分就是持續(xù)集成(Continuous integration示绊,簡稱CI)
1.持續(xù)繼承:頻繁地(一天多次)將代碼集成到主干。
2.持續(xù)交付:頻繁地將軟件的新版本暂论,交付給質(zhì)量團(tuán)隊(duì)或者用戶面褐,以供評(píng)審。如果評(píng)審?fù)ㄟ^空另,代碼就進(jìn)入生產(chǎn)階段
3.持續(xù)部署:是持續(xù)交付的下一步盆耽,指的是代碼通過評(píng)審以后蹋砚,自動(dòng)部署到生產(chǎn)環(huán)境
二扼菠、Jenkins
1.概念:Jenkins 是一個(gè)開源軟件項(xiàng)目,是基于Java開發(fā)的一種可拓展持續(xù)集成工具坝咐,主要用于持續(xù)循榆、自動(dòng)地構(gòu)建 / 測試 / 集成軟件項(xiàng)目以及監(jiān)控一些定時(shí)執(zhí)行的任務(wù)
2.目的:
1、持續(xù)墨坚、自動(dòng)地構(gòu)建/測試軟件項(xiàng)目秧饮。 2、監(jiān)控軟件開放流程泽篮,快速問題定位及處理盗尸,提示開放效率。
3.特性:易于安裝帽撑、易于配置泼各、分布式構(gòu)建、插件支持
4.產(chǎn)品發(fā)布流程:產(chǎn)品設(shè)計(jì)成型 → 開發(fā)人員開發(fā)代碼 → 測試人員測試功能 → 運(yùn)維人員發(fā)布上線
三亏拉、安裝配置Jenkins
去官網(wǎng)下載jenkins.war包
3.1 兩種方式開啟Jenkins
方式1:在tomcat的bin目錄下啟動(dòng)(最常用)
方式2:打開cmd扣蜻,進(jìn)入jenkins目錄,然后運(yùn)行命令:java -jar jenkins.war
四及塘、搭建Jmeter+Jenkins+Ant持續(xù)化
<?xml version="1.0" encoding="UTF-8"?><projectname="ant-jmeter-test"default="run"basedir="."><!-- 需要改成自己本地的 Jmeter 目錄--><propertyname="jmeter.home"value="G:\jmeter\apache-jmeter-3.0"/><!-- jmeter生成jtl格式的結(jié)果報(bào)告的路徑--><propertyname="jmeter.result.jtl.dir"value="G:\jmeter\jmeter-ant-jenkins\testResult"/><!-- jmeter生成html格式的結(jié)果報(bào)告的路徑--><propertyname="jmeter.result.html.dir"value="G:\jmeter\jmeter-ant-jenkins\testResult"/><!-- 生成的報(bào)告的前綴--><propertyname="ReportName"value="TestReport"/><propertyname="jmeter.result.jtlName"value="${jmeter.result.jtl.dir}/report.jtl"/><propertyname="jmeter.result.htmlName"value="${jmeter.result.html.dir}/index.html"/><!-- 接收測試報(bào)告的郵箱 --><propertyname="mail_to"value="barryli89@163.com"/><propertyname="lib.dir"value="${jmeter.home}/lib"/><pathid="xslt.classpath"><filesetdir="${lib.dir}"includes="xalan*.jar"/><filesetdir="${lib.dir}"includes="serializer*.jar"/></path><targetname="run"><antcalltarget="test"/><antcalltarget="report"/></target><targetname="test"><taskdefname="jmeter"classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask"/><jmeterjmeterhome="${jmeter.home}"resultlog="${jmeter.result.jtlName}"><!-- 聲明要運(yùn)行的腳本莽使。"*.jmx"指包含此目錄下的所有jmeter腳本--><testplansdir="G:\jmeter\jmeter-ant-jenkins"includes="*.jmx"/><propertyname="jmeter.save.saveservice.output_format"value="xml"/></jmeter></target><targetname="report"><!-- 因?yàn)樯厦嫔蓤?bào)告的時(shí)候,不會(huì)將相關(guān)的圖片也一起拷貝至目標(biāo)目錄笙僚,所以芳肌,需要手動(dòng)拷貝 --></xslt><copytodir="${jmeter.result.html.dir}"><filesetdir="${jmeter.home}/extras"><includename="collapse.png"/><includename="expand.png"/></fileset></copy></target></project>
進(jìn)行命令行模式后,進(jìn)入剛才創(chuàng)建的xml文件存放目錄肋层,如:D:\build 輸入ant即可
五庇勃、繼承Jenkins
打開Jenkins,配置Ant環(huán)境
新建一個(gè)自由風(fēng)格任務(wù)
構(gòu)建觸發(fā)器
構(gòu)建配置
配置HTML插件
立即構(gòu)建
針對報(bào)告中不顯示聚合報(bào)告的情況
Jenkins執(zhí)行自動(dòng)化測試后發(fā)送測試報(bào)告郵件
第十九單元 web端自動(dòng)化
1.什么是自動(dòng)化
使用測試工具 或者其他手段對軟件進(jìn)行測試
2.自動(dòng)化測試好處
1.縮短測試周期? 2.避免人為出錯(cuò)? 3.測試信息存儲(chǔ)? 4.輕易獲取覆蓋率? 5.實(shí)現(xiàn)自動(dòng)或者定時(shí)執(zhí)行
3.使用自動(dòng)化的前提條件
1)手動(dòng)測試已經(jīng)完成,后期再不影響進(jìn)度的前提下逐漸實(shí)現(xiàn)自動(dòng)化
2)項(xiàng)目周期長槽驶,重復(fù)性的工作都交給機(jī)器去實(shí)現(xiàn)
3)需求穩(wěn)定,項(xiàng)目變動(dòng)不大
4)自動(dòng)化測試腳本復(fù)雜度比較低
5)可重復(fù)利用
4.使用自動(dòng)化測試的場景
1)頻繁的回歸測試
2)冒煙測試
3)傳統(tǒng)行業(yè)需求變化不大责嚷,應(yīng)用頻繁
4)性能測試
5.常用工具
QTP、Selenium掂铐、RFT
6.為什么要學(xué)習(xí)元素定位
1)計(jì)算機(jī)沒有智能到人的程度罕拂。
2)計(jì)算機(jī)不能像手動(dòng)測試人員一樣通過眼看揍异,手操作鼠標(biāo)點(diǎn)擊,操作鍵盤輸入爆班。
3)計(jì)算機(jī)通過一系列計(jì)數(shù)手段找到元素(按鈕衷掷、輸入框、模擬鍵盤等)
7.元素定位的工具或手段有哪些
css選擇器柿菩、xpath
8.環(huán)境搭建
1. 下載瀏覽器插件
2. 菜單 → 添加附件 → 設(shè)置圖標(biāo) → 從文件中添加附件
9.什么是xpath
XPath即為XML路徑語言戚嗅,它是一種用來(標(biāo)準(zhǔn)通用標(biāo)記語言的子集)在 HTML\XML 文檔中查找信息的語言
10.什么是xml
XML 指可擴(kuò)展標(biāo)記語言(EXtensible Markup Language)
XML 是一種標(biāo)記語言,很類似 HTML
XML 的設(shè)計(jì)宗旨是傳輸數(shù)據(jù)枢舶,而非顯示數(shù)據(jù)
11.xml和html 的區(qū)別
html是用來顯示數(shù)據(jù)懦胞、xml是用來傳輸和存儲(chǔ)數(shù)據(jù)
12.獲取元素
①/:從根節(jié)點(diǎn)選取? #/html/head/meta[1]第一個(gè);[last()]最后一個(gè)元素凉泄;[last()-1]倒數(shù)第二個(gè)元素躏尉;? ? ? ? ? ? ? ? ? ? [position()<3] 前兩個(gè)元素
②//:從匹配選擇的當(dāng)前節(jié)點(diǎn)選擇文檔中的節(jié)點(diǎn) #//link
③.選取當(dāng)前節(jié)點(diǎn)
④..選取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)
⑤@:選取屬性 #//meta[@name] 或者//meta[@name="referrer"]
⑥//meta[@*]:所有帶有屬性的meta元素
⑦//head/meta | //head/title:選取head元素的所有meta元素和title元素
⑧//meta | //title:選取文檔中的所有title和meta元素
13.css選擇器
13.1什么是css選擇器
CSS 中,選擇器是一種模式后众,用于選擇需要添加樣式的元素
13.2css選擇器語法
①.info: 選擇class=“info”的所有元素
②#name: 選擇id=“name”的所有元素
③* :選擇所有的元素
④元素1,元素2: 選擇元素1和元素2的所有元素
⑤元素1 元素2: 選擇元素1內(nèi)部的所有元素2的元素
⑥元素1>元素2: 選擇父元素為元素1的元素的所有元素2的元素
⑦[target]: 選擇帶有target屬性的所有元素
⑧[target=blank]: 選擇target="blank"的所有元素
Web自動(dòng)化測試進(jìn)階
什么是框架框架(framework)是一個(gè)框子 -- 指其約束性胀糜,也是一個(gè)架子 -- 指其支撐性,是一個(gè)基本概念上的結(jié)構(gòu)蒂誉,用于去解決或者處理復(fù)雜的問題教藻。
為什么使用框架1)自己從頭實(shí)現(xiàn)太復(fù)雜
? 2)使用框架能夠更專注于業(yè)務(wù)邏輯,加快開發(fā)速度
? 3)框架的使用能夠處理更多細(xì)節(jié)問題
? 4)使用人數(shù)多右锨,穩(wěn)定性括堤,擴(kuò)展性好
selenium工作原理
? 4.selenium對瀏覽器操作
1)庫的導(dǎo)入
from selenium import webdriver
2)創(chuàng)建瀏覽器對象
必須為大寫
driver = webdriver.Firefox()
driver = webdriver.Chrome()
3)瀏覽器尺寸相關(guān)操作
maximize_window() 最大化
get_window_size()? ? 獲取瀏覽器尺寸,打印查看
set_window_size()? ? 設(shè)置瀏覽器尺寸陡蝇,400*400
4)瀏覽器位置相關(guān)操作
get_window_position() 獲取瀏覽器位置
set_window_position(x,y)? ? 設(shè)置瀏覽器位置
5)瀏覽器的關(guān)閉操作
close()關(guān)閉當(dāng)前標(biāo)簽/窗口
quit()關(guān)閉所有標(biāo)簽/窗口
6)頁面請求操作
driver.get(url)請求某個(gè)url對應(yīng)的響應(yīng)
refresh()刷新頁面操作
back()回退到之前的頁面
forward()前進(jìn)到之后的頁面
fromselenium import webdriver
import time
driver = webdriver.Chrome()#不可以找到痊臭,必須導(dǎo)入對應(yīng)的驅(qū)動(dòng)器
driver=webdriver.Firefox()
url1="http://www.baidu.com"
url2="https://zhuanlan.zhihu.com/"
請求第一個(gè)接口
driver.get(url1)
time.sleep(3)
刷新
driver.refresh()
driver.get(url2)
回退
driver.back()time.sleep(3)
前進(jìn)driver.forward()
time.sleep(3)
driver.close()
5.selenium獲取斷言信息1)什么是斷言
斷言是編程術(shù)語,表示為一些布爾表達(dá)式登夫,程序員相信在程序中的某個(gè)特定點(diǎn)該表達(dá)式值為真广匙,可以在任何時(shí)候啟用和禁用斷言驗(yàn)證,因此可以在測試時(shí)啟用斷言而在部署時(shí)禁用斷言恼策。
2)獲取斷言信息的操作
current_url 獲取當(dāng)前訪問頁面url
title 獲取當(dāng)前瀏覽器標(biāo)題
page_source 獲取網(wǎng)頁源碼
print(driver.current_url)
print(driver.title)
print(driver.page_source)
截圖:
get_screenshot_as_png() 保存圖片
data=driver.get_screenshot_as_png()
withopen("a.png","wb")asf:
f.write(data)
get_screenshot_as_file(file) 直接保存
driver.get_screenshot_as_file("b.png")
6.selenium八大元素定位from selenium import webdriver
driver=webdriver.Firefox()
url = "http://www.baidu.com"
driver.get(url)
第一種 id
ele = driver.find_element_by_id("kw")
ele.send_keys(12306) # 輸入數(shù)據(jù)
from selenium.webdriver.common.by import By
ele = driver.find_element(By.ID,"kw")# ele.send_keys(12306) # 輸入數(shù)據(jù)
第二種? 標(biāo)簽名字
ele = driver.find_element_by_name("wd")
ele.send_keys(12306) # 輸入數(shù)據(jù)
第三種? class
ele = driver.find_element_by_class_name("s_ipt")
ele.send_keys(12306) # 輸入數(shù)據(jù)
第四種? Xpath
ele = driver.find_element_by_xpath("http://*[@id='kw']")
ele.send_keys(12306) # 輸入數(shù)據(jù)
第五種? css class
ele = driver.find_element_by_css_selector("#kw")
ele.send_keys(12306) # 輸入數(shù)據(jù)
第六種? text
ele = driver.find_element_by_link_text("地圖")
ele.click() # 輸入數(shù)據(jù)
第七種:類似于模糊匹配
ele = driver.find_element_by_partial_link_text("地")
ele.click()
第八種:標(biāo)簽名定位鸦致,必須得保證只有一個(gè)這種名字的標(biāo)簽,使用下面這個(gè)搜索
url = "http://cn.bing.com/"
driver.get(url)# ele = driver.find_element_by_tag_name("input")
ele.send_keys(12306) # 輸入數(shù)據(jù)
7.元素的操作對元素的相關(guān)操作涣楷,一般要先獲取到元素分唾,再調(diào)用相關(guān)方法
element = driver.find_element_by_xxx(value)
1)點(diǎn)擊和輸入
點(diǎn)擊操作---------->element.click()
清空/輸入操作:
element.clear()---------------------->清空輸入框
element.send_keys(data)-------->輸入數(shù)據(jù)
2)提交操作
element.submit()
8.多標(biāo)簽之間的切換場景:有的時(shí)候點(diǎn)擊一個(gè)鏈接,新頁面并非由當(dāng)前頁面跳轉(zhuǎn)過去狮斗,而是新開一個(gè)頁面打開绽乔,這種情況下,計(jì)算機(jī)需要識(shí)別多標(biāo)簽或窗口的情況碳褒。
1)獲取所有窗口的句柄
handles = driver.window_handlers
調(diào)用該方法會(huì)得到一個(gè)列表折砸,在selenium運(yùn)行過程中的每一個(gè)窗口都有一個(gè)對應(yīng)的值存放在里面看疗。
2)通過窗口的句柄進(jìn)入的窗口
driver.switch_to_window(handles[n])
driver.switch_to.window(handles[n])
通過窗口句柄激活進(jìn)入某一窗口
案例:
58同城租房信息:http://bj.58.com
使用句柄driver.get("http://bj.58.com")
print("點(diǎn)擊之前句柄:",driver.window_handles)
ele=driver.find_element_by_xpath(".//*[@id='fcNav']/em/a[1]")ele.click()
list_windowns=driver.window_handles
print("點(diǎn)擊之后句柄:",driver.window_handles)
driver.switch_to.window(list_windowns[1])
eleDaxing=driver.find_element_by_link_text("大興")
eleDaxing.click()
9.多表單
? ? el = driver.find_element_by_xxx(value)
? ? driver.switch_to.frame(el)/driver.switch_to_frame(el)
案例:
fromseleniumimportwebdriver
#打開游覽器
driver=webdriver.Firefox()
#登錄QQ
url="https://qzone.qq.com/"
driver.get(url)
#獲取元素
#定位表單元素
ele_bd=driver.find_element_by_id("login_frame")
driver.switch_to.frame(ele_bd)
ele=driver.find_element_by_xpath(".//*[@id='switcher_plogin']")
ele.click()
#輸入賬號(hào)
ele2=driver.find_element_by_id("u")
ele2.send_keys()
#輸入密碼
ele3=driver.find_element_by_id("p")
ele3.send_keys("")
ele4=driver.find_element_by_id("login_button")
ele4.click()
彈出框操作
# 進(jìn)入到彈出框中
driver.switch_to.alert
#接收警告
accept()
#解散警告
dismiss()
#發(fā)送文本到警告框
send_keys(data)
用法:driver.switch_to.alert.accept()
下拉框
案例:
fromseleniumimportwebdriver
importtime
driver=webdriver.Firefox()
driver.get("http://www.baidu.com")
ele=driver.find_element_by_id("s-usersetting-top")
ele.click()
ele1=driver.find_element_by_xpath(".//*[@id='s-user-setting-menu']/div/a[2]")
ele1.click()
time.sleep(2)
ele2=driver.find_element_by_xpath(".//*[@id='yadv-setting-gpc']/div/div[1]/i[1]")
ele2.click()
list_ele=driver.find_elements_by_class_name("c-select-item")
print(list_ele)
list_ele[2].click()
# for list_i in list_ele:
# ? ? print(list_i.text)
# ? ? if list_i.text =="最近一周":
# ? ? ? ? list_i.click()
鼠標(biāo)和鍵盤操作
鼠標(biāo)
1.先導(dǎo)入動(dòng)作鏈類:
fromselenium.webdriverimportActionChains
ActionChains(driver)
2.常用鼠標(biāo)動(dòng)作:
ActionChains(driver).context_click(ele).perform()點(diǎn)擊鼠標(biāo)右鍵
ActionChains(driver).double_click(ele).perform()點(diǎn)擊鼠標(biāo)左鍵
ActionChains(driver).move_to_element(el).perform()鼠標(biāo)懸停
3.perform()對前面的方法執(zhí)行
#案例:
fromselenium.webdriverimportActionChains
fromseleniumimportwebdriver
importtime
driver=webdriver.Firefox()
driver.get("http://www.baidu.com")
ele=driver.find_element_by_xpath(".//*[@id='s-top-left']/div/a")
# ele.click()
ActionChains(driver).double_click(ele).perform()
鍵盤
1.導(dǎo)入
fromselenium.webdriver.common.keysimportKeys
2.常用鍵盤操作
send_keys(Keys.BACK_SPACE) ?? 刪除鍵(BackSpace)
send_keys(Keys.SPACE) ? ? ? ? 空格鍵(Space)
send_keys(Keys.TAB) ? ? ? ? ? 制表鍵(Tab)
send_keys(Keys.ESCAPE) ? ? ?? 回退鍵(Esc)
send_keys(Keys.ENTER) ? ? ? ? 回車鍵(Enter)
send_keys(Keys.CONTROL,‘a(chǎn)’) ? 全選(Ctrl+A)
send_keys(Keys.CONTROL,‘a(chǎn)’) ? 全選(Ctrl+A)
send_keys(Keys.CONTROL,‘x’) ? 剪切(Ctrl+X)
send_keys(Keys.CONTROL,‘v’) ? 粘貼(Ctrl+V)
send_keys(Keys.F1) ? ? ? ? ?? 鍵盤F1
send_keys(Keys.F12) ? ? ? ? ? 鍵盤F12
瀏覽器等待
1.為什么要進(jìn)行等待
1.網(wǎng)速慢 2.網(wǎng)站內(nèi)容過多 3.如果不進(jìn)行等待而直接定位元素,可能會(huì)拋出異常
2.selenium中等待的分類
1.固定等待
2.顯示等待
WebDriverWait(driver,10,0.5).until(EC.presence_of_element_located(
(By.CLASS_NAME,"g-hu")))
3.隱式等待?
driver.implicitly_wait(n)
PO模型
1.介紹
在自動(dòng)化中睦授,Selenium自動(dòng)化測試中有一個(gè)名字經(jīng)常被提及PageObject(思想與 面向?qū)ο蟮奶卣飨嗤?两芳,通常PO模型可以大大提高測試用例的維護(hù)效率
優(yōu)點(diǎn):重用,業(yè)務(wù)和對象分離去枷,代碼結(jié)構(gòu)清晰怖辆,方便代碼維護(hù)
2.核心要素
1.在PO模式中抽離封裝集成一個(gè)BasePage類,該基類應(yīng)該擁有一個(gè)只實(shí)現(xiàn) webdriver實(shí)例的屬性
2.每一個(gè)page都繼承BasePage删顶,通過driver來管理本page中元素竖螃,將page中 的操作封裝成一個(gè)個(gè)方法
3.TestCase繼承unittest.Testcase類,并依賴page類翼闹,從而實(shí)現(xiàn)相應(yīng)的測試步 驟
3.實(shí)現(xiàn)BasePage
fromseleniumimportwebdriver
fromselenium.webdriver.common.action_chainsimportActionChains#鼠標(biāo)操作
classBasePage():
'''BasePage封裝所有界面都公用的方法斑鼻。例如driver,find_element等'''
'''實(shí)例化BasePage類時(shí)蒋纬,事先執(zhí)行的__init__方法猎荠,該方法需要傳遞參數(shù)'''
def__init__(self,driver,url):
self.driver=driver
self.base_url=url
# 進(jìn)入網(wǎng)址
defget(self):
self.driver.get(self.base_url)
#元素定位,替代八大定位
defget_element(self,*locator):
returnself.driver.find_element(*locator)
#點(diǎn)擊
defleft_click(self,*locator):
ActionChains(self.driver).click(self.get_element(*locator)).perform()
#輸入
defsend_text(self,text,*locator):
self.driver.find_element(*locator).send_keys(text)
#清除
defclear_text(self,*locator):
self.driver.find_element(*locator).clear()
實(shí)現(xiàn)SearchPage
'''
實(shí)現(xiàn)步驟:(1)繼承basepage,(2)元素傳參,(3)調(diào)取方法
'''
fromselenium.webdriver.common.byimportBy
frompomodel.Base.base_pageimportBasePage
classSearch(BasePage):
def__init__(self,driver,url):
BasePage.__init__(self,driver,url)
#進(jìn)入百度
defopen_baidu(self):
self.get()
#輸入搜索內(nèi)容
definput_search_content(self,text):
self.send_text(text,By.ID,"kw")
#點(diǎn)擊按鈕
defclick_baidu_search(self):
self.left_click(By.ID,"su")
實(shí)現(xiàn)TestCase
importunittest
fromseleniumimportwebdriver
frompomodel.Pages.search_pagesimportSearch
classBaiBu(unittest.TestCase):
defsetUp(self)->None:
self.driver=webdriver.Firefox()
self.driver.implicitly_wait(10)
deftest_serach(self):
url="http://www.baidu.com"
s=Search(self.driver,url)
s.open_baidu()
s.input_search_content("jack")
s.click_baidu_search()
deftearDown(self)->None:
self.driver.quit()
if__name__=='__main__':
unittest.main()
4.總結(jié)
PO設(shè)計(jì)模式中的BasePage基類對應(yīng)案例中的BasePage.py文件 PO模式中的pages中的案例顯示Search.py PO模式設(shè)計(jì)中TestCase對應(yīng)案例中的TestCase.py
5.po模式的優(yōu)點(diǎn)
1.PO提供了一種業(yè)務(wù)流程與頁面元素操作分離的模式,這使得測試代碼變得更加清晰
2.頁面對象與用例分離蜀备,使得我們更好的復(fù)用對象
3.可復(fù)用的頁面方法代碼會(huì)變得更加優(yōu)化
4.更加有效的命令方式使得我們更加清晰的知道方法所操作的UI元素
Android開發(fā)关摇、adb、monkey測試
1.手機(jī)測試概念
傳統(tǒng)手機(jī)測試 VS 手機(jī)應(yīng)用軟件測試
傳統(tǒng)手機(jī)測試:指測試手機(jī)本身比如抗壓碾阁,抗摔输虱,抗疲勞,抗低溫高溫等脂凶。也包括手機(jī)本身功能宪睹、性能等測試。
手機(jī)應(yīng)用軟件測試 C/S Client/Server
手機(jī)應(yīng)用軟件是基于手機(jī)操作系統(tǒng)之上開發(fā)出來的軟件蚕钦,做這樣的測試就叫做手機(jī)應(yīng)用軟件測試亭病。
2.手機(jī)端常規(guī)測試
Android后綴apk,ios后綴是IPA(iPhoneApplication)
13大測試:
UI測試嘶居,功能罪帖,性能測試,兼容性測試邮屁,安裝卸載測試整袁,軟件升級(jí)測試,登陸測試佑吝,安全性測試坐昙,消息推送,前后臺(tái)切換芋忿,網(wǎng)絡(luò)環(huán)境測試炸客,monkey測試襟士,異常測試
3.Android介紹
介紹:Android是一種基于Linux的自由及開放源代碼的操作系統(tǒng),主要使用于移動(dòng)設(shè)備嚷量,如智能手機(jī)和平板電腦
四層:Android分為四個(gè)層陋桂,從高層到低層分別是應(yīng)用程序?qū)印?yīng)用程序框架層蝶溶、系統(tǒng)運(yùn)行庫層和Linux內(nèi)核層
4.ADB
1.簡介:ADB全稱Android Debug Bridge, 是android sdk里的一個(gè)工具, 用這個(gè)工具可以直接操作管理android模擬器或者真實(shí)的andriod設(shè)備(如G1手機(jī))
它的主要功能有:
運(yùn)行設(shè)備的shell(命令行)
管理模擬器或設(shè)備的端口映射
計(jì)算機(jī)和設(shè)備之間上傳/下載文件
將本地apk軟件安裝至模擬器或android設(shè)備
2.配置ADB環(huán)境變量
打開:adt-bundle-windows-x86_64_20140101文件找到adb.exe所在路徑配置ADB_HOME環(huán)境變量
3.ADB常用指令
查看設(shè)備:adb devices
安裝軟件:adb install -r (APK路徑)
卸載軟件 adb uninstall <軟件名> adb uninstall -k <軟件名>
登錄設(shè)備shell adb shell adb shell <command命令>
查看手機(jī)內(nèi)存情況? ? adb shell dumpsys cpuinfo
查看內(nèi)存情況 adb shell getprop | findstr dalvik 本機(jī)內(nèi)存的使用情況
查看應(yīng)用內(nèi)存使用情況 adb shell dumpsys meminfo +包名:應(yīng)用的內(nèi)存使用情況
列出手機(jī)裝的所有app的包名: adb shell pm list packages
列出系統(tǒng)應(yīng)用的所有包名: adb shell pm list packages -s
列出除了系統(tǒng)應(yīng)用的第三方應(yīng)用包名: adb shell pm list packages -3
adb logcat 查看手機(jī)日志
Android 的日志分為如下幾個(gè)級(jí)別:
V —— Verbose(最低嗜历,輸出得最多)
D —— Debug
I —— Info
W —— Warning
E —— Error
F —— Fatal
S —— Silent(最高,啥也不輸出
5.APK牢固性
應(yīng)用加固防篡改:通過完整性保護(hù)和簽名校驗(yàn)保護(hù)抖所,能有效避免應(yīng)用被二次打包梨州,杜絕盜版應(yīng)用的產(chǎn)生;防逆向:通過對代碼進(jìn)行隱藏以及加密處理田轧,使攻擊者無法對二進(jìn)制代碼進(jìn)行反編譯暴匠,獲得源代碼或代碼運(yùn)行邏輯;防調(diào)試:通過反調(diào)試技術(shù)傻粘,使攻擊者無法調(diào)試原生代碼或Java代碼每窖,阻止攻擊者獲取代碼里的敏感數(shù)據(jù)。
6.Monkey測試
1.簡介
顧名思義弦悉,Monkey就是猴子窒典, Monkey測試,就像一只猴子稽莉, 在電腦面前瀑志,亂敲鍵盤在測試
Monkey 主要用于Android 的壓力測試自動(dòng)的一個(gè)壓力測試小工具, 主要目的就是為了測試app 是否會(huì)Crash
2.Monkey前提條件
1.環(huán)境配置:把a(bǔ)db加入系統(tǒng)環(huán)境污秆,手機(jī)開啟開發(fā)者模式
2.連接手機(jī)劈猪,獲取測試的包名。獲取包名的方法
3.Monkey編寫測試命令,并運(yùn)行良拼。[monkey操作命令
7.Monkey命令 基本參數(shù)介紹
1.-p <允許的包名列表>:adb shell monkey -p com.example.login 100
2.顯示日志詳細(xì)程度
1.adb shell monkey -p com.example.login -v 100 // 缺省值战得,僅提供啟動(dòng)提示、測試完成和最終結(jié)果等少量信息
2. adb shell monkey -p com.example.login -v? -v 100? ? ? ? ? // 提供較為詳細(xì)的日志将饺,包括每個(gè)發(fā)送到Activity的事件信息
3.adb shell monkey -p com.example.login -v? -v? -v 100? ? // 最詳細(xì)的日志贡避,包括了測試中選中/未選中的Activity信息
3..Monkey日志分析
將log信息寫到文檔中:adb shell monkey 100 >c:/log/b.txt
4.--throttle <毫秒>
adb shell monkey -p com.example.login --throttle 300 100
表示執(zhí)行100個(gè)偽隨機(jī)用戶事件流,事件間隔為300毫秒予弧。
5.-pct-touch 調(diào)整觸摸事件的百分比
6.--pct-motion? 調(diào)整motion事件百分比
7.--ignore-crashes 通常刮吧,應(yīng)用發(fā)生崩潰或異常時(shí)Monkey會(huì)停止運(yùn)行
8.--ignore-timeouts 通常,應(yīng)用程序發(fā)生任何超時(shí)錯(cuò)誤(如“Application Not responding”對話框)Monkey將停止運(yùn)行
Monkey實(shí)例:monkey -p com.tencent.mtaexample -s 23? --throttle2000 --ignore-crashes --ignore-timeouts -v -v -v 100000>/data/local/tmp/log.txt 2>&1 &
9.Monkey異常分析
日志中可能的錯(cuò)誤:
1.程序異常退出掖蛤,uncausedexception (ctrl+f搜索‘Fatal’)
2.程序強(qiáng)制關(guān)閉杀捻,F(xiàn)orceClosed (簡稱FC) (同上)
3.程序無響應(yīng),ApplicationNo Response(ctrl+f搜索‘ANR ’蚓庭,加空格是為了屏蔽掉一些無效信息)
4.手動(dòng)生成致讥。
8.手機(jī)兼容性測試
? App云測試平臺(tái):Testin仅仆、貫眾云測試、百度MTC垢袱、阿里MQC等
9.真機(jī)測試
手機(jī)打開開發(fā)者選項(xiàng)→勾選USB調(diào)試→輸入adb devices監(jiān)測連接設(shè)備