第五單元、性能測試
1.什么是性能測試
? ? ? ? 通過自動化的測試工具模擬系統(tǒng)正常、異常、峰值的場景對系統(tǒng)的各項性能指標測試
2.什么是性能
? ? ? ? 時間:系統(tǒng)處理用戶請求的響應時間
? ? ? ? 資源:系統(tǒng)運行過程中,系統(tǒng)資源的消耗情況
3.為什么進行性能測試
? ? ? ? 1.評估當前系統(tǒng)的能力
? ? ? ? 2.評估軟件是否滿足未來的需要
? ? ? ? 3.尋找性能瓶頸,優(yōu)化系統(tǒng)性能
? ? ? ? 4.招聘需要
4.性能測試的分類
? ? ? ? 1.基準測試
? ? ? ? ? ? 單用戶測試/建立基準線,當系統(tǒng)軟硬件環(huán)境發(fā)生變化之后
? ? ? ? ? ? 再進行一次基準測試以確定變化對性能的影響。
? ? ? ? 2.負載測試
? ? ? ? ? ? 增加系統(tǒng)負載,在滿足性能指標的情況下,找出系統(tǒng)所能承受最大負載量的測試
? ? ? ? 3.穩(wěn)定性測試
? ? ? ? ? ? 服務器穩(wěn)定運行的情況下進行長時間測試并最終保證服務器能滿足線上業(yè)務需求
? ? ? ? 4.壓力測試
? ? ? ? ? ? 在強壓下,查看系統(tǒng)是否具有良好的容錯能力和修復能力
? ? ? ? 5.并發(fā)測試
? ? ? ? ? ? 在極短時間內(nèi),發(fā)送多個請求,驗證服務器對并發(fā)的處理能力
5.性能測試的指標
? ? ? ? 1.響應時間? 2s? 5s? 8s
? ? ? ? ? ? 客戶端發(fā)送請求開始,到客戶端接收到結(jié)果的總時間
? ? ? ? ? ? 服務器處理時間+網(wǎng)絡傳輸時間
? ? ? ? 2.并發(fā)用戶數(shù)
? ? ? ? ? ? 某一時刻同時向服務器發(fā)送請求的用戶數(shù)
? ? ? ? 3.吞吐量
? ? ? ? ? ? 單位時間內(nèi)處理客戶端的請求數(shù)量,直接體現(xiàn)軟件系統(tǒng)的承載能力。
? ? ? ? 4.QPS
? ? ? ? ? ? 每秒查詢數(shù),即控制服務器每秒處理的指定請求的數(shù)量
? ? ? ? 5.TPS
? ? ? ? ? ? 每秒事務數(shù),即控制服務數(shù)每秒處理事務請求的數(shù)量
? ? ? ? 6.點擊數(shù)
? ? ? ? ? ? 所有頁面元素的請求總數(shù)量
? ? ? ? 7.錯誤率
? ? ? ? ? ? 系統(tǒng)在負載情況下,失敗業(yè)務的概率
? ? ? ? 8.資源利用率
? ? ? ? ? ? 系統(tǒng)各種資源的使用情況? ? 率=資源使用率/總資源可用率*100%
? ? ? ? ? ? 常見資源指標:
? ? ? ? ? ? CPU使用率:不高于75%-85%
? ? ? ? ? ? 內(nèi)存大小使用率:不高于80%
? ? ? ? ? ? 磁盤IO(速率):不高于90%
? ? ? ? ? ? 網(wǎng)路(速率):不高于80%
? ? ? ? 9.業(yè)務成功率
? ? ? ? ? ? 多用戶對某一業(yè)務發(fā)送操作的成功率
6.jmeter的作用
? ? ? ? 1.接口測試 面試說postman,因為方便好用。
? ? ? ? 2.性能測試 jmeter,也可以用postman(runner),但是沒有性能指標
? ? ? ? 3.數(shù)據(jù)庫測試
7.線程組是什么?
? ? ? ? 概念:性質(zhì)相同的線程放在一個組內(nèi)
? ? ? ? 線程組包含線程數(shù)、準備時長、循環(huán)次數(shù)
? ? ? ? 1.線程數(shù):虛擬用戶數(shù)
? ? ? ? 2.準備時長:啟動所有用戶的時間
? ? ? ? 3.循環(huán)次數(shù):每個線程發(fā)送請求的次數(shù)
8.jmeter主要組件
? ? ? ? 1.測試計劃
? ? ? ? 2.線程組:性質(zhì)相同的一組線程(線程數(shù)、準備時間、循環(huán)次數(shù))
? ? ? ? 3.采樣器:HTTP
協(xié)議、主機地址、端口號(選填)、請求方法、路徑、編碼格式(選填)、參數(shù)
? ? ? ? 4.監(jiān)聽器:采集測試結(jié)構(gòu)
? ? ? ? ? ? 察看結(jié)果樹、用表格查看、聚合報告
? ? ? ? 5.循環(huán)控制器
? ? ? ? 6.事務控制器
? ? ? ? ? ? 事務:多個操作組合
? ? ? ? ? ? 作用:
? ? ? ? 7.固定定時器
? ? ? ? ? ? ? ? 作用:控制兩個采樣器的間隔
? ? ? ? 8.斷言
? ? ? ? ? ? ? ? 1.Json斷言:判斷某個key對應某個value
? ? ? ? ? ? ? ? 2.響應斷言:響應中包含某個串
? ? ? ? 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 → 復制文件路徑 → 字段編號 → 生成 → 自動復制,過去粘貼
10.接口依賴
? ? ? ? 正則語法:* + ? . ()
? ? ? ? 實現(xiàn):
? ? ? ? ? ? ①添加HTTP請求,使用正則提取一個需要字段
? ? ? ? ? ? ②在第一個HTTP請求里邊調(diào)用字段${字段}
第六單元 jmeter腳本錄制和壓測
1.什么是腳本錄制
在進行測試的時候,可能有好多腳本或者界面需要操作測試,并且有些測試鏈接需要重復多線程高并發(fā)進行測試,我們一般會針對這一些操作,進行一個腳本錄制,錄制好之后,之后測試就可以在這個基礎(chǔ)上進行測試。
2.腳本錄制方式
? ? web端:badboy腳本錄制
? ? app端:使用Jmeter自帶的代理服務器進行腳本錄制
3.Android手機端腳本錄制
? ? 1.同網(wǎng)
? ? 2.添加http代理服務器
? ? 3.在線程中添加錄制控制器
? ? 4.在http代理服務器中指定錄制腳本的路徑,默認端口8888
? ? 5.查看本地的ip
? ? 6.設(shè)置移動端代理,IP和端口號
? ? 7.啟動
? ? 8.打開手機app,抓取接口
4.web端腳本錄制
安裝badboy腳本軟件→打開badboy軟件→使用
第七單元 Jmeter壓測
一.數(shù)據(jù)庫壓測
? ? 1.為什么要緊行數(shù)據(jù)庫壓測
? ? ? ? 不斷給數(shù)據(jù)庫施加壓力,驗證數(shù)據(jù)庫處理的性能
? ? 2.如何進行數(shù)據(jù)庫壓測
? ? ? ? 1.jdbc配置:創(chuàng)建線程組→添加配置元件JDBC Connection Configuration→對數(shù)據(jù)庫連接的配置進行設(shè)置→添加jdbc Request請求→運行
select statement:只支持單條查詢,只支持第一條數(shù)據(jù)查詢
updata statement:修改數(shù)據(jù)
Callable Statement:支持查詢、修改、支持多個查詢
Prepared Select Statement:類型必須為varchar**結(jié)合csv配置數(shù)據(jù)
二.1.jmeter對服務器壓測(windows)
? ? ? 資源準備:? JMeterPlugins-Extras.jar和JMeterPlugins-Standard.jar放到apache-jmeter-3.0\lib\ext目錄下
? ? 操作:打開server的監(jiān)聽→添加監(jiān)聽器-jp@gc - PerfMon Metrics Collector→添加性能指標,線程組設(shè)置線程數(shù)和時間
? ? 2.jmeter對服務器壓測(linux)
同上
第八單元 Python基本語法
一、Python介紹
? ? Python 是一個高層次的結(jié)合了解釋性、編譯性、互動性和面向?qū)ο蟮哪_本語言
二、發(fā)展歷程
Python: Guido van Rossum 八十年代末和九十年代初 荷蘭
三、Python的特點
易于學習, 易于閱讀, 易于維護, 一個廣泛的標準庫, 互動模式的支持
可移植, 可擴展, 提供數(shù)據(jù)局接口,GUI編程,可嵌入
四、Pycharm及python安裝詳細教程
五、Python變量和數(shù)據(jù)類型
Python3 的六個標準數(shù)據(jù)類型中:
不可變數(shù)據(jù)(3 個):Number(數(shù)字)、String(字符串)、Tuple(元組);
可變數(shù)據(jù)(3 個):List(列表)、Dictionary(字典)、Set(集合)
六、標識符
. 標識符只能由字母、下劃線“_”、數(shù)字組成。
. 標識符不能以數(shù)字開頭。
. 標識符不能使用關(guān)鍵字
. 標識符對大小寫敏感。
(建議:標識符命名應“見名知意”)
七、關(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'
八、運算符
算術(shù)運算符: +,-,*,/,%,**,//
邏輯運算符:and, or, not
比較運算符: ==, !=, >,<,>=,<=
賦值運算符:=, +=, -=, /=, %=, **=, //=, :=
第九單元 python基礎(chǔ)--語句
一、判斷語句
if語句的使用格式
if 要判斷的條件:
? ? ?? 條件成立時,要做的事情
if-else的使用格式
if要判斷的條件:
?? 條件成立時,要做的事情
else:
?? 條件不成立時,要做的事情
if-elif-else的使用格式
if要判斷的條件:
?? 條件成立時,要做的事情
elif要判斷的條件:
?? 條件成立時,要做的事情
else:
?? 條件不成立時,要做的事情
if嵌套
if要判斷的條件:
?? 條件成立時,要做的事情
if要判斷的條件:
? ? ?? 條件成立時,要做的事情
else:
? ? ?? 條件不成立時,要做的事情
else:
?? 條件不成立時,要做的事情
二:循環(huán)語句
while循環(huán)的格式
while條件:
?? 條件成立時,要做的事情
?? 條件成立時,要做的事情
?? .....
while循環(huán)嵌套
while條件:
?? 條件成立時,要做的事情
?? 條件成立時,要做的事情
?? .....
while條件:
? ? ?? 條件成立時,要做的事情
? ? ?? 條件成立時,要做的事情
? ? ?? .....
for循環(huán)
for 臨時變量 in 列表或者字符串等可迭代對象:
?? 循環(huán)滿足條件時執(zhí)行的代碼
pass的使用
1.Pythonpass是空語句,是為了保持程序結(jié)構(gòu)的完整性。
2.pass不做任何事情,一般用做占位語句。
第十單元列表
1.格式:listName=[元素,元素]
2.特點:有序,可重復,可變,任意類型,性能不好
3.增:
? ? ? ? 1.append:list.append(元素),追加到末尾
2.extend:list.extend(元素),追加到末尾,散開添加
3.insert:list.insert:(index,元素),添加元素到指定位置,如果新增的索引不存在添加到末尾
4.改:list[index]=新元素
注意:如果index存在則修改,不存在則越界
5.刪
1.del:del list[index],刪除指定下標對應的元素,如果index不存在,則報錯索引越界
2.pop:list.pop(),刪除末尾元素
3.remove:刪除指定元素,list.remove(元素),如果元素不存在報錯
6.查
1.list.index(元素):查看元素下標
2.list.count(元素):查詢列表中的元素的個數(shù)
7.排序:
1.升序:list.sort()
2.降序:
1.list.sort(Reverse=True)
2.list.sort().reverse()
注意:如果不是數(shù)字,則報錯
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[外層下標][內(nèi)層下標】
3.刪除:del [外層下標][內(nèi)層下標】
4.添加:list[外層下標].insert(內(nèi)層插入下標,元素)
5.[外層下標][內(nèi)層下標】=值
第十一單元 元組和字典
1.格式:t=(元素,元素)
2.特點:有序,可重復,不可變,任意類型
3.訪問元組
索引值存在:print(t[2])
索引值不存在:報錯
4.查詢:
1.查詢個數(shù):t.count(元素
2.查詢下標: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.特點:有序,可重復,不可變,任意類型,性能好
3.訪問元組
索引值存在:print(t[2])
索引值不存在:報錯
4.查詢:
1.查詢個數(shù):t.count(元素)
2.查詢下標: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.特點:有序,不可重復,可變,任意類型,性能不好
3.根據(jù)鍵訪問
1.z={key1:value,key2:value}
print(z["key"])
2.z={key1:value,key2:value}
print(z.get("name"))
4.修改
1.有對應的key
z["key"]="value"
print(z)
2.沒有對應的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.擴充的
for i,j in enumerate(z):
?? print(i,j,z[j])
十二單元
一、集合
1.集合的特點:無序、唯一、去重
2.格式:j={元素,元素}
3.添加:
1.j.add(元素)
2.
j={1,"vfd",5,2,"vedfbrgb"}
i=["小何","真美",48]
j.update(i)
4.刪除
1.remove:刪除集合中的元素 如果有直接刪除 如果沒有程序報錯
j.remove(元素)
2.pop:都是數(shù)字,刪最小的,其余升序排序;
? 都是非數(shù)字,隨機刪,其余隨機排序;
數(shù)字和非數(shù)字,隨機刪,刪數(shù)字的話就是最小的,刪非數(shù)字的話,隨機刪
注意:如果集合中沒有元素,則報錯
j.pop()
3.discard:如果元素存在直接刪除 如果元素不存在不做任何操作
j.discard(元素)
5.交集
連接多個集合,輸出相同的元素(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ù)
其實就是方法、功能
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ù)(默認參數(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ù)
*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'解決讀文件中文報錯
? ? 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) ? #控制臺只出現(xiàn)八個字符
2.寫文件:
? ? ? ? 方式一:
? ? ? ? f=open('文件名.txt','w')
? ? ? ? ? ? ?? f.write("要寫入的信息")
? ? ? ? ? ? ?? f.close()
? ? ? ? 方式二:
? ? ? ? f=open('b.txt','a')? #追加寫入數(shù)據(jù)
? ? ? ? ? ? ?? f.write("新的數(shù)據(jù)")
? ? ? ? ? ? ?? f.close()
3.二進制讀寫
二進制讀數(shù)據(jù)
with open("照片.jpg","rb") as 對象:
? 變量名 = 對象.read()
?? print(變量名)
三、文件和文件夾的操作
1.文件操作
1.文件重命名
import os
os.rename("要修改的文件.txt","新文件.txt")
2.刪除文件
import os
os.remove("要刪除的文件")
2.文件夾操作
1.創(chuàng)建文件夾
import os
os.mkdir("文件夾名")
2.獲取當前目錄
print(os.getcwd())
四、異常
1.什么是異常
其實就是正常運行的程序發(fā)生了一個錯誤
2.異常處理
? ? 語法
一、
try:
<語句>#運行別的代碼
except<名字>:
<語句>#如果在try部份引發(fā)了'name'異常
else:
<語句>#如果沒有異常發(fā)生
二、
try:
異常的操作
except(Exception1[,Exception2[,...ExceptionN]]]):
發(fā)生以上多個異常中的一個,執(zhí)行這塊代碼
? ......................
else:
如果沒有異常執(zhí)行這塊代碼
三、
try:
<語句>
finally:
<語句>#退出try時總會執(zhí)行
五、模塊
1.含義:是一個Python文件,以.py 結(jié)尾,包含了Python 對象定義和Python語句
2.模塊的引入
1.import
importaa#aa是文件名,test2是aa文件里面的一個方法
aa.test2()
開平方根
importmath
print(math.sqrt(4))
#2
2.from...import
一、
from 要調(diào)用的文件 import 文件里面的方法
方法()
二、
from modname import *? #調(diào)用文件里的所有方法
六、Python中的包
簡單地說其實包就是文件夾,文件夾下面必須存在init.py文件
十四單元 Python面向?qū)ο?br>
一、面向?qū)ο?/b>
類. 類變量. 數(shù)據(jù)成員. 方法重寫. 局部變量. 實例變量. 繼承. 實例化. 方法. 對象
二、創(chuàng)建類
classClassName:
'類的幫助信息'#類文檔字符串
class_suite#類體
三、創(chuàng)建實例對象
1、創(chuàng)建
"創(chuàng)建 Employee 類的第一個對象"
emp1=Employee("Zara",2000)
"創(chuàng)建 Employee 類的第二個對象"
emp2=Employee("Manni",5000)
2、訪問屬性
emp1.displayEmployee()
emp2.displayEmployee()
print"Total Employee %d"%Employee.empCount
3、增刪改
emp1.age=7# 添加一個 'age' 屬性
emp1.age=8# 修改 'age' 屬性
delemp1.age# 刪除 'age' 屬性
也可以使用以下函數(shù)的方式來訪問屬性:
getattr : 訪問對象的屬性。
hasattr : 檢查是否存在一個屬性。
setattr : 設(shè)置一個屬性。如果屬性不存在,會創(chuàng)建一個新屬性
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、可以繼承多個類
classA:# 定義類 A
.....
classB:# 定義類 B
.....
classC(A,B):# 繼承類 A 和 B
.....
六、方法重寫
1、概念
如果你的父類方法的功能不能滿足你的需求,你可以在子類重寫你父類的方法
七、基礎(chǔ)重載方法
序號方法、描述、簡單的調(diào)用
1*init* ( self [,args...] ) 構(gòu)造函數(shù) 簡單的調(diào)用方法: obj = className(args)
2*del*( self ) 析構(gòu)方法, 刪除一個對象 簡單的調(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)
八、運算符重載
九、類屬性與方法
1、類的私有屬性
__pri_attr:兩個下劃線開頭,聲明該屬性為私有
在類內(nèi)部的方法中使用時self.__pri_attr
2、類的方法
在類的內(nèi)部,使用def關(guān)鍵字可以為類定義一個方法
3、類的私有方法 __pri_attr:兩個下劃線開頭,聲明該方法為私有方法
在類的內(nèi)部調(diào)用__pri_attr
第十五單元 Python單元測試之unittest
一、單元測試、集成測試、功能測試
單元測試
顆粒度最小,一般由開發(fā)小組采用白盒方式來測試,主要測試單元是否符合“設(shè)計”;是指對軟件中的最小可測試單元進行檢查和驗證
集成測試
介于單元測試和系統(tǒng)測試之間,一般由開發(fā)小組采用白盒+黑盒的方法來測試,即驗證“設(shè)計”又驗證“需求”。主要用來測試模板與模板之間的接口,同時還要測試一些主要的業(yè)務功能。
功能測試
顆粒度最大,一般由獨立的測試小組采用黑盒的方式來測試,主要測試系統(tǒng)是否符合“需求規(guī)格說明書
白盒測試
主要應用于單元測試階段,主要是對代碼級別的測試,針對程序內(nèi)部的邏輯結(jié)構(gòu)
黑盒測試
測試系統(tǒng)的功能是否滿足“需求規(guī)格說明書
二、Unittest重要組成
TestFixture
作用:用于一個測試環(huán)境的準備和銷毀還原
功能:當測試用例每次執(zhí)行之前需要準備測試環(huán)境,每次測試完成后還原測試環(huán)境
主要方法:
setUp():準備環(huán)境,執(zhí)行每個測試用例的前置條件;
tearDown():環(huán)境還原,執(zhí)行每個測試用例的后置條件;
setUpClass():必須使用@classmethod裝飾器,所有case執(zhí)行的前置條件,只運行一次;
tearDownClass():必須使用@classmethod裝飾器,所有case運行完后只運行一次;
TestCase:測試用例
定義:一個類class繼承 unittest.TestCase,就是一個測試用例
測試用例:就是一個完整的測試流程
包括測試前準備環(huán)境的搭建(setUp),執(zhí)行測試代碼(run),以及測試后環(huán)境的還原(tearDown)
測試用例命名規(guī)則
測試方法的名稱要以test開頭。只會執(zhí)行以test開頭定義的方法
十六單元 單元測試之pytest
前提:需要安裝pytest和pytest-html(生成html測試報告)
一.命名規(guī)則
**Pytest單元測試中的類名和方法名必須是以test開頭
importpytest
fromxml.domimportminidom
classTestPy01():
deftestPy001(self):
print("第一個pytest")
assert1==1
deftestPy002(self):
print("第二個pytest")
assert1==2
deftestPy003(self):
print("第三個pytest")
assert1==1
if__name__=='__main__':
pytest.main()
二、Pytest生成自帶的html測試報告
前提條件:需要下載pytest-html模塊(python自帶的生成測試報告模塊)
方式一:
pytest.main(["--html=./report.html","模塊.py"])#運行該模塊的所有測試用例
方式二:
pytest.main([‘--html=./report.html’,‘模塊.py::類::test_a_001']) #指定運行的測試用例
方式三:
pytst.main(['-x','--html=./report.html','t12est000.py'])#填一個附加參數(shù)
方式四:
pytest.main(["--html=./report.html"])#無效 ? ? ? ?
-x:出現(xiàn)一條測試用例失敗就退出測試
-v:豐富信息模式,輸出更詳細的用例執(zhí)行信息
-s:顯示print內(nèi)容
-q:簡化結(jié)果信息,不會顯示每個用例的文件名
跳過該用例使用@pytest.mark.skip()
@pytest.mark.skip()
deftest001(self):
assert2==2
三、Pytest的運行方式
.點號,表示用例通過
F表示失敗Failure
E表示用例中存在異常Error
四、文件讀取
##讀取csv文件
importcsv#導入csv模塊
classReadCsv():
defread_csv(self):
item=[]#定義一個空列表
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是一款輕量級并且非常靈活的開源測試報告框架,它支持絕大多數(shù)測試框架, 例如TestNG、Pytest、JUint等。它簡單易用,易于集成
1.先下載Allure→配置Alluer環(huán)境變量→輸入allure檢驗配置是否成功→安裝allure,輸入(pip install allure-pytest)
2.Allure常用的特性
@allure.feature# 用于描述被測試產(chǎn)品需求
@allure.story# 用于描述feature的用戶場景,即測試需求
withallure.step():# 用于描述測試步驟,將會輸出到報告中
allure.attach# 用于向測試報告中輸入一些附加的信息,通常是一些測試數(shù)據(jù),截圖等
案例:
importpytest,allure,os
classTestClass005():
@allure.feature("用戶登錄功能")#用于定義被測試的功能,被測產(chǎn)品的需求點
@allure.story("登錄成功")#用于定義被測功能的用戶場景,即子功能點
deftest_success(self):
assert1==1
@allure.feature("用戶登錄功能")#用于定義被測試的功能,被測產(chǎn)品的需求點
@allure.story("登錄失敗")#用于定義被測功能的用戶場景,即子功能點
deftest_fail(self):
assert1==2
if__name__=='__main__':
pytest.main(['--alluredir','report/result','test_06.py'])#生成json類型的測試報告
split='allure '+'generate '+'./report/result '+'-o '+'./report/html '+'--clean'#將測試報告轉(zhuǎn)為html格式
os.system(split)# system函數(shù)可以將字符串轉(zhuǎn)化成命令在服務器上運行
十七單元 requests接口測試
1.介紹:
Requests是一個很實用的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響應
r.status_code響應狀態(tài)碼
r.heards響應頭
r.cookies響應cookies
r.text響應文本
r.encoding當前編碼
r.content以字節(jié)形式(二進制)返回
5.requests擴充
1.添加等待時間
requests.get(url,timeout=1)#超過等待時間則報錯
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)碼
通過斷言驗證返回狀態(tài)碼和200對比
生成allure的測試報告
也可以這樣說:
dataDemo(存放數(shù)據(jù))>> readDemo(讀取數(shù)據(jù))
useRequests(發(fā)送請求)>>testDemo(生成報告)
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.生成測試報告
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.生成測試報告
importallure,pytest,os
fromrequestdemo.getStatusCodeimportGetStatusCode
get=GetStatusCode()
statusCodes=get.getStatusCode()
classTestReadExcel():
deftestReadExcel(self):
forcodeinstatusCodes:
assertcode==200
if__name__=="__main__":
# 生成測試報告json
pytest.main(["-s","-q",'--alluredir','report/result','testreadexcel.py'])
# 將測試報告轉(zhuǎn)為html格式
split='allure '+'generate '+'./report/result '+'-o '+'./report/html '+'--clean'
os.system(split)
十八單元 自動化持續(xù)繼承
一、概念
互聯(lián)網(wǎng)軟件的開發(fā)和發(fā)布,已經(jīng)形成了一套標準流程,最重要的組成部分就是持續(xù)集成(Continuous integration,簡稱CI)
1.持續(xù)繼承:頻繁地(一天多次)將代碼集成到主干。
2.持續(xù)交付:頻繁地將軟件的新版本,交付給質(zhì)量團隊或者用戶,以供評審。如果評審通過,代碼就進入生產(chǎn)階段
3.持續(xù)部署:是持續(xù)交付的下一步,指的是代碼通過評審以后,自動部署到生產(chǎn)環(huán)境
二、Jenkins
1.概念:Jenkins 是一個開源軟件項目,是基于Java開發(fā)的一種可拓展持續(xù)集成工具,主要用于持續(xù)、自動地構(gòu)建 / 測試 / 集成軟件項目以及監(jiān)控一些定時執(zhí)行的任務
2.目的:
1、持續(xù)、自動地構(gòu)建/測試軟件項目。 2、監(jiān)控軟件開放流程,快速問題定位及處理,提示開放效率。
3.特性:易于安裝、易于配置、分布式構(gòu)建、插件支持
4.產(chǎn)品發(fā)布流程:產(chǎn)品設(shè)計成型 → 開發(fā)人員開發(fā)代碼 → 測試人員測試功能 → 運維人員發(fā)布上線
三、安裝配置Jenkins
去官網(wǎng)下載jenkins.war包
3.1 兩種方式開啟Jenkins
方式1:在tomcat的bin目錄下啟動(最常用)
方式2:打開cmd,進入jenkins目錄,然后運行命令: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é)果報告的路徑--><propertyname="jmeter.result.jtl.dir"value="G:\jmeter\jmeter-ant-jenkins\testResult"/><!-- jmeter生成html格式的結(jié)果報告的路徑--><propertyname="jmeter.result.html.dir"value="G:\jmeter\jmeter-ant-jenkins\testResult"/><!-- 生成的報告的前綴--><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"/><!-- 接收測試報告的郵箱 --><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}"><!-- 聲明要運行的腳本。"*.jmx"指包含此目錄下的所有jmeter腳本--><testplansdir="G:\jmeter\jmeter-ant-jenkins"includes="*.jmx"/><propertyname="jmeter.save.saveservice.output_format"value="xml"/></jmeter></target><targetname="report"><!-- 因為上面生成報告的時候,不會將相關(guān)的圖片也一起拷貝至目標目錄,所以,需要手動拷貝 --></xslt><copytodir="${jmeter.result.html.dir}"><filesetdir="${jmeter.home}/extras"><includename="collapse.png"/><includename="expand.png"/></fileset></copy></target></project>
進行命令行模式后,進入剛才創(chuàng)建的xml文件存放目錄,如:D:\build 輸入ant即可
五、繼承Jenkins
打開Jenkins,配置Ant環(huán)境
新建一個自由風格任務
構(gòu)建觸發(fā)器
構(gòu)建配置
配置HTML插件
立即構(gòu)建
針對報告中不顯示聚合報告的情況
Jenkins執(zhí)行自動化測試后發(fā)送測試報告郵件
第十九單元 web端自動化
1.什么是自動化
使用測試工具 或者其他手段對軟件進行測試
2.自動化測試好處
1.縮短測試周期? 2.避免人為出錯? 3.測試信息存儲? 4.輕易獲取覆蓋率? 5.實現(xiàn)自動或者定時執(zhí)行
3.使用自動化的前提條件
1)手動測試已經(jīng)完成,后期再不影響進度的前提下逐漸實現(xiàn)自動化
2)項目周期長,重復性的工作都交給機器去實現(xiàn)
3)需求穩(wěn)定,項目變動不大
4)自動化測試腳本復雜度比較低
5)可重復利用
4.使用自動化測試的場景
1)頻繁的回歸測試
2)冒煙測試
3)傳統(tǒng)行業(yè)需求變化不大,應用頻繁
4)性能測試
5.常用工具
QTP、Selenium、RFT
6.為什么要學習元素定位
1)計算機沒有智能到人的程度。
2)計算機不能像手動測試人員一樣通過眼看,手操作鼠標點擊,操作鍵盤輸入。
3)計算機通過一系列計數(shù)手段找到元素(按鈕、輸入框、模擬鍵盤等)
7.元素定位的工具或手段有哪些
css選擇器、xpath
8.環(huán)境搭建
1. 下載瀏覽器插件
2. 菜單 → 添加附件 → 設(shè)置圖標 → 從文件中添加附件
9.什么是xpath
XPath即為XML路徑語言,它是一種用來(標準通用標記語言的子集)在 HTML\XML 文檔中查找信息的語言
10.什么是xml
XML 指可擴展標記語言(EXtensible Markup Language)
XML 是一種標記語言,很類似 HTML
XML 的設(shè)計宗旨是傳輸數(shù)據(jù),而非顯示數(shù)據(jù)
11.xml和html 的區(qū)別
html是用來顯示數(shù)據(jù)、xml是用來傳輸和存儲數(shù)據(jù)
12.獲取元素
①/:從根節(jié)點選取? #/html/head/meta[1]第一個;[last()]最后一個元素;[last()-1]倒數(shù)第二個元素;? ? ? ? ? ? ? ? ? ? [position()<3] 前兩個元素
②//:從匹配選擇的當前節(jié)點選擇文檔中的節(jié)點 #//link
③.選取當前節(jié)點
④..選取當前節(jié)點的父節(jié)點
⑤@:選取屬性 #//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自動化測試進階
什么是框架框架(framework)是一個框子 -- 指其約束性,也是一個架子 -- 指其支撐性,是一個基本概念上的結(jié)構(gòu),用于去解決或者處理復雜的問題。
為什么使用框架1)自己從頭實現(xiàn)太復雜
? 2)使用框架能夠更專注于業(yè)務邏輯,加快開發(fā)速度
? 3)框架的使用能夠處理更多細節(jié)問題
? 4)使用人數(shù)多,穩(wěn)定性,擴展性好
selenium工作原理
? 4.selenium對瀏覽器操作
1)庫的導入
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)閉當前標簽/窗口
quit()關(guān)閉所有標簽/窗口
6)頁面請求操作
driver.get(url)請求某個url對應的響應
refresh()刷新頁面操作
back()回退到之前的頁面
forward()前進到之后的頁面
fromselenium import webdriver
import time
driver = webdriver.Chrome()#不可以找到,必須導入對應的驅(qū)動器
driver=webdriver.Firefox()
url1="http://www.baidu.com"
url2="https://zhuanlan.zhihu.com/"
請求第一個接口
driver.get(url1)
time.sleep(3)
刷新
driver.refresh()
driver.get(url2)
回退
driver.back()time.sleep(3)
前進driver.forward()
time.sleep(3)
driver.close()
5.selenium獲取斷言信息1)什么是斷言
斷言是編程術(shù)語,表示為一些布爾表達式,程序員相信在程序中的某個特定點該表達式值為真,可以在任何時候啟用和禁用斷言驗證,因此可以在測試時啟用斷言而在部署時禁用斷言。
2)獲取斷言信息的操作
current_url 獲取當前訪問頁面url
title 獲取當前瀏覽器標題
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ù)
第二種? 標簽名字
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()
第八種:標簽名定位,必須得保證只有一個這種名字的標簽,使用下面這個搜索
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)點擊和輸入
點擊操作---------->element.click()
清空/輸入操作:
element.clear()---------------------->清空輸入框
element.send_keys(data)-------->輸入數(shù)據(jù)
2)提交操作
element.submit()
8.多標簽之間的切換場景:有的時候點擊一個鏈接,新頁面并非由當前頁面跳轉(zhuǎn)過去,而是新開一個頁面打開,這種情況下,計算機需要識別多標簽或窗口的情況。
1)獲取所有窗口的句柄
handles = driver.window_handlers
調(diào)用該方法會得到一個列表,在selenium運行過程中的每一個窗口都有一個對應的值存放在里面。
2)通過窗口的句柄進入的窗口
driver.switch_to_window(handles[n])
driver.switch_to.window(handles[n])
通過窗口句柄激活進入某一窗口
案例:
58同城租房信息:http://bj.58.com
使用句柄driver.get("http://bj.58.com")
print("點擊之前句柄:",driver.window_handles)
ele=driver.find_element_by_xpath(".//*[@id='fcNav']/em/a[1]")ele.click()
list_windowns=driver.window_handles
print("點擊之后句柄:",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()
#輸入賬號
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()
彈出框操作
# 進入到彈出框中
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()
鼠標和鍵盤操作
鼠標
1.先導入動作鏈類:
fromselenium.webdriverimportActionChains
ActionChains(driver)
2.常用鼠標動作:
ActionChains(driver).context_click(ele).perform()點擊鼠標右鍵
ActionChains(driver).double_click(ele).perform()點擊鼠標左鍵
ActionChains(driver).move_to_element(el).perform()鼠標懸停
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.導入
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.為什么要進行等待
1.網(wǎng)速慢 2.網(wǎng)站內(nèi)容過多 3.如果不進行等待而直接定位元素,可能會拋出異常
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.介紹
在自動化中,Selenium自動化測試中有一個名字經(jīng)常被提及PageObject(思想與 面向?qū)ο蟮奶卣飨嗤?,通常PO模型可以大大提高測試用例的維護效率
優(yōu)點:重用,業(yè)務和對象分離,代碼結(jié)構(gòu)清晰,方便代碼維護
2.核心要素
1.在PO模式中抽離封裝集成一個BasePage類,該基類應該擁有一個只實現(xiàn) webdriver實例的屬性
2.每一個page都繼承BasePage,通過driver來管理本page中元素,將page中 的操作封裝成一個個方法
3.TestCase繼承unittest.Testcase類,并依賴page類,從而實現(xiàn)相應的測試步 驟
3.實現(xiàn)BasePage
fromseleniumimportwebdriver
fromselenium.webdriver.common.action_chainsimportActionChains#鼠標操作
classBasePage():
'''BasePage封裝所有界面都公用的方法。例如driver,find_element等'''
'''實例化BasePage類時,事先執(zhí)行的__init__方法,該方法需要傳遞參數(shù)'''
def__init__(self,driver,url):
self.driver=driver
self.base_url=url
# 進入網(wǎng)址
defget(self):
self.driver.get(self.base_url)
#元素定位,替代八大定位
defget_element(self,*locator):
returnself.driver.find_element(*locator)
#點擊
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()
實現(xiàn)SearchPage
'''
實現(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)
#進入百度
defopen_baidu(self):
self.get()
#輸入搜索內(nèi)容
definput_search_content(self,text):
self.send_text(text,By.ID,"kw")
#點擊按鈕
defclick_baidu_search(self):
self.left_click(By.ID,"su")
實現(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è)計模式中的BasePage基類對應案例中的BasePage.py文件 PO模式中的pages中的案例顯示Search.py PO模式設(shè)計中TestCase對應案例中的TestCase.py
5.po模式的優(yōu)點
1.PO提供了一種業(yè)務流程與頁面元素操作分離的模式,這使得測試代碼變得更加清晰
2.頁面對象與用例分離,使得我們更好的復用對象
3.可復用的頁面方法代碼會變得更加優(yōu)化
4.更加有效的命令方式使得我們更加清晰的知道方法所操作的UI元素
Android開發(fā)、adb、monkey測試
1.手機測試概念
傳統(tǒng)手機測試 VS 手機應用軟件測試
傳統(tǒng)手機測試:指測試手機本身比如抗壓,抗摔,抗疲勞,抗低溫高溫等。也包括手機本身功能、性能等測試。
手機應用軟件測試 C/S Client/Server
手機應用軟件是基于手機操作系統(tǒng)之上開發(fā)出來的軟件,做這樣的測試就叫做手機應用軟件測試。
2.手機端常規(guī)測試
Android后綴apk,ios后綴是IPA(iPhoneApplication)
13大測試:
UI測試,功能,性能測試,兼容性測試,安裝卸載測試,軟件升級測試,登陸測試,安全性測試,消息推送,前后臺切換,網(wǎng)絡環(huán)境測試,monkey測試,異常測試
3.Android介紹
介紹:Android是一種基于Linux的自由及開放源代碼的操作系統(tǒng),主要使用于移動設(shè)備,如智能手機和平板電腦
四層:Android分為四個層,從高層到低層分別是應用程序?qū)印贸绦蚩蚣軐印⑾到y(tǒng)運行庫層和Linux內(nèi)核層
4.ADB
1.簡介:ADB全稱Android Debug Bridge, 是android sdk里的一個工具, 用這個工具可以直接操作管理android模擬器或者真實的andriod設(shè)備(如G1手機)
它的主要功能有:
運行設(shè)備的shell(命令行)
管理模擬器或設(shè)備的端口映射
計算機和設(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命令>
查看手機內(nèi)存情況? ? adb shell dumpsys cpuinfo
查看內(nèi)存情況 adb shell getprop | findstr dalvik 本機內(nèi)存的使用情況
查看應用內(nèi)存使用情況 adb shell dumpsys meminfo +包名:應用的內(nèi)存使用情況
列出手機裝的所有app的包名: adb shell pm list packages
列出系統(tǒng)應用的所有包名: adb shell pm list packages -s
列出除了系統(tǒng)應用的第三方應用包名: adb shell pm list packages -3
adb logcat 查看手機日志
Android 的日志分為如下幾個級別:
V —— Verbose(最低,輸出得最多)
D —— Debug
I —— Info
W —— Warning
E —— Error
F —— Fatal
S —— Silent(最高,啥也不輸出
5.APK牢固性
應用加固防篡改:通過完整性保護和簽名校驗保護,能有效避免應用被二次打包,杜絕盜版應用的產(chǎn)生;防逆向:通過對代碼進行隱藏以及加密處理,使攻擊者無法對二進制代碼進行反編譯,獲得源代碼或代碼運行邏輯;防調(diào)試:通過反調(diào)試技術(shù),使攻擊者無法調(diào)試原生代碼或Java代碼,阻止攻擊者獲取代碼里的敏感數(shù)據(jù)。
6.Monkey測試
1.簡介
顧名思義,Monkey就是猴子, Monkey測試,就像一只猴子, 在電腦面前,亂敲鍵盤在測試
Monkey 主要用于Android 的壓力測試自動的一個壓力測試小工具, 主要目的就是為了測試app 是否會Crash
2.Monkey前提條件
1.環(huán)境配置:把adb加入系統(tǒng)環(huán)境,手機開啟開發(fā)者模式
2.連接手機,獲取測試的包名。獲取包名的方法
3.Monkey編寫測試命令,并運行。[monkey操作命令
7.Monkey命令 基本參數(shù)介紹
1.-p <允許的包名列表>:adb shell monkey -p com.example.login 100
2.顯示日志詳細程度
1.adb shell monkey -p com.example.login -v 100 // 缺省值,僅提供啟動提示、測試完成和最終結(jié)果等少量信息
2. adb shell monkey -p com.example.login -v? -v 100? ? ? ? ? // 提供較為詳細的日志,包括每個發(fā)送到Activity的事件信息
3.adb shell monkey -p com.example.login -v? -v? -v 100? ? // 最詳細的日志,包括了測試中選中/未選中的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個偽隨機用戶事件流,事件間隔為300毫秒。
5.-pct-touch 調(diào)整觸摸事件的百分比
6.--pct-motion? 調(diào)整motion事件百分比
7.--ignore-crashes 通常,應用發(fā)生崩潰或異常時Monkey會停止運行
8.--ignore-timeouts 通常,應用程序發(fā)生任何超時錯誤(如“Application Not responding”對話框)Monkey將停止運行
Monkey實例: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異常分析
日志中可能的錯誤:
1.程序異常退出,uncausedexception (ctrl+f搜索‘Fatal’)
2.程序強制關(guān)閉,F(xiàn)orceClosed (簡稱FC) (同上)
3.程序無響應,ApplicationNo Response(ctrl+f搜索‘ANR ’,加空格是為了屏蔽掉一些無效信息)
4.手動生成。
8.手機兼容性測試
? App云測試平臺:Testin、貫眾云測試、百度MTC、阿里MQC等
9.真機測試
手機打開開發(fā)者選項→勾選USB調(diào)試→輸入adb devices監(jiān)測連接設(shè)備