測試筆記

第五單元、性能測試

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è)備

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末墓拜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子请契,更是在濱河造成了極大的恐慌咳榜,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爽锥,死亡現(xiàn)場離奇詭異涌韩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)氯夷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門臣樱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人腮考,你說我怎么就攤上這事雇毫。” “怎么了秸仙?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵嘴拢,是天一觀的道長桩盲。 經(jīng)常有香客問我寂纪,道長,這世上最難降的妖魔是什么赌结? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任捞蛋,我火速辦了婚禮,結(jié)果婚禮上柬姚,老公的妹妹穿的比我還像新娘拟杉。我一直安慰自己,他們只是感情好量承,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布搬设。 她就那樣靜靜地躺著,像睡著了一般撕捍。 火紅的嫁衣襯著肌膚如雪拿穴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天忧风,我揣著相機(jī)與錄音默色,去河邊找鬼。 笑死狮腿,一個(gè)胖子當(dāng)著我的面吹牛腿宰,可吹牛的內(nèi)容都是我干的呕诉。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼吃度,長吁一口氣:“原來是場噩夢啊……” “哼甩挫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起椿每,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對情侶失蹤捶闸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后拖刃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體删壮,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年兑牡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了央碟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡均函,死狀恐怖亿虽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情苞也,我是刑警寧澤洛勉,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站如迟,受9級(jí)特大地震影響收毫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜殷勘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一此再、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧玲销,春花似錦输拇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瘩绒,卻和暖如春猴抹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背草讶。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國打工洽糟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓坤溃,卻偏偏與公主長得像拍霜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子薪介,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348