Python接口測試實(shí)戰(zhàn)2 - 使用Python發(fā)送請求

簡書已停更岸浑,歡迎轉(zhuǎn)到個人博客查看對應(yīng)教程:https://www.cnblogs.com/superhin/p/10338930.html

課程目錄

Python接口測試實(shí)戰(zhàn)1(上)- 接口測試?yán)碚?/a>
Python接口測試實(shí)戰(zhàn)1(下)- 接口測試工具的使用
Python接口測試實(shí)戰(zhàn)2 - 使用Python發(fā)送請求
Python接口測試實(shí)戰(zhàn)3(上)- Python操作數(shù)據(jù)庫
Python接口測試實(shí)戰(zhàn)3(下)- unittest測試框架
Python接口測試實(shí)戰(zhàn)4(上) - 接口測試框架實(shí)戰(zhàn)
Python接口測試實(shí)戰(zhàn)4(下) - 框架完善:用例基類貌踏,用例標(biāo)簽寸五,重新運(yùn)行上次失敗用例
Python接口測試實(shí)戰(zhàn)5(上) - Git及Jenkins持續(xù)集成
Python接口測試實(shí)戰(zhàn)5(下) - RESTful礁遵、Web Service及Mock Server

更多學(xué)習(xí)資料請加添加作者微信:lockingfree獲取

本節(jié)內(nèi)容

  • requests安裝
  • requests使用
  • JSON類型解析
  • requests庫詳解
  • 帶安全認(rèn)證的請求

序言

上節(jié)課我們學(xué)習(xí)了接口測試的理論院领,抓包工具及使用Postman手工測試各種接口东囚,這節(jié)課我們主要講解使用Python語言來發(fā)送接口請求之剧,實(shí)現(xiàn)接口測試自動化郭卫。

發(fā)送請求,我們這里主要使用Python的一個第三方包(需要先安裝):requests
Python3自帶的http.client和urllib.request都能發(fā)送http請求背稼,不過相對來說使用較麻煩贰军,第三方庫requests讓發(fā)送請求更簡單,支持自動編碼解碼,會話保持词疼,長連等

參考: requests官方文檔

requests安裝

  • Windows: 打開cmd命令行俯树,輸入pip install requests,等待安裝完成即可
  • Linux: (建議使用Python3)贰盗,終端中輸入pip3 install requests许饿,等待安裝完成即可
  • Mac: (建議使用Python3), sudo python3 -m pip install requests,等待安裝完成即可

驗證是否安裝成功:

打開命令行舵盈,輸入python陋率,在python shell環(huán)境下輸入import requests沒有報錯即安裝成功

requests的使用

一個最簡單的GET請求

發(fā)送一個請求分3步:

  1. 組裝請求: 請求可能包含url,params(url參數(shù))秽晚,data(請求數(shù)據(jù))瓦糟,headers(請求頭),cookies等赴蝇,最少必須有url
  2. 發(fā)送請求菩浙,獲取響應(yīng):支持get,post等各種方法發(fā)送句伶,返回的是一個響應(yīng)對象
  3. 解析響應(yīng): 輸出響應(yīng)文本

打開Pycharm劲蜻,新建一個demo項目,項目下新建一個Python文件考余,輸入以下內(nèi)容:

# 導(dǎo)入requests包
import requests 

# 1. 組裝請求
url = "http://httpbin.org/get"  # 這里只有url斋竞,字符串格式
# 2. 發(fā)送請求,獲取響應(yīng)
res = requests.get(url) # res即返回的響應(yīng)對象
# 3. 解析響應(yīng)
print(res.text)  # 輸出響應(yīng)的文本

帶參數(shù)的GET請求

import requests 

url = "http://www.tuling123.com/openapi/api?key=ec961279f453459b9248f0aeb6600bbe&info=你好"  # 參數(shù)可以寫到url里
res = requests.get(url=url) # 第一個url指get方法的參數(shù)秃殉,第二個url指上一行我們定義的接口地址
print(res.text)  

import requests 

url = "http://www.tuling123.com/openapi/api"
params = {"key":"ec961279f453459b9248f0aeb6600bbe","info":"你好"} # 字典格式坝初,單獨(dú)提出來,方便參數(shù)的添加修改等操作
res = requests.get(url=url, params=params) 
print(res.text)  

傳統(tǒng)表單類POST請求(x-www-form-urlencoded)

import requests 

url = "http://httpbin.org/post"
data = {"name": "hanzhichao", "age": 18} # Post請求發(fā)送的數(shù)據(jù)钾军,字典格式
res = requests.post(url=url, data=data) # 這里使用post方法鳄袍,參數(shù)和get方法一樣
print(res.text)  

JSON類型的POST請求(application/json)

import requests 

url = "http://httpbin.org/post"
data = '''{
        "name": "hanzhichao",
        "age": 18
        }''' # 多行文本, 字符串格式,也可以單行(注意外層有引號吏恭,為字符串) data = '{"name": "hanzhichao", "age": 18}'
res = requests.post(url=url, data=data) #  data支持字典或字符串
print(res.text)  

data參數(shù)支持字典格式也支持字符串格式拗小,如果是字典格式,requests方法會將其按照默認(rèn)表單urlencoded格式轉(zhuǎn)換為字符串樱哼,如果是字符串則不轉(zhuǎn)化
如果data以字符串格式傳輸需要遵循以下幾點(diǎn):

  • 必須是嚴(yán)格的JSON格式字符串哀九,里面必須用雙引號,k-v之間必須有逗號搅幅,布爾值必須是小寫的true/false等等
  • 不能有中文阅束,直接傳字符串不會自動編碼

一般來說,建議將data聲明為字典格式(方便數(shù)據(jù)添加修改)茄唐,然后再用json.dumps()方法把data轉(zhuǎn)換為合法的JSON字符串格式

import requests 
import json # 使用到JSON中的方法息裸,需要提前導(dǎo)入

url = "http://httpbin.org/post"
data = {
        "name": "hanzhichao",
        "age": 18
        }  # 字典格式,方便添加
headers = {"Content-Type":"application/json"} # 嚴(yán)格來說,我們需要在請求頭里聲明我們發(fā)送的格式
res = requests.post(url=url, data=json.dumps(data), headers=headers) #  將字典格式的data變量轉(zhuǎn)換為合法的JSON字符串傳給post的data參數(shù)
print(res.text)  

或直接將字典格式的data數(shù)據(jù)賦給post方法的JSON參數(shù)(會自動將字典格式轉(zhuǎn)為合法的JSON文本并添加headers)

import requests 

url = "http://openapi.tuling123.com/openapi/api/v2"
data = {
    "reqType":0,
    "perception": {
        "inputText": {
            "text": "附近的酒店"
        },
        "inputImage": {
            "url": "imageUrl"
        },
        "selfInfo": {
            "location": {
                "city": "北京",
                "province": "北京",
                "street": "信息路"
            }
        }
    },
    "userInfo": {
        "apiKey": "ec961279f453459b9248f0aeb6600bbe",
        "userId": "206379"
    }
} 
res = requests.post(url=url, json=data) # JSON格式的請求呼盆,將數(shù)據(jù)賦給json參數(shù)
print(res.text)  

練習(xí):

  1. 利用圖靈聊天接口(GET) http://www.tuling123.com/openapi/api?key=ec961279f453459b9248f0aeb6600bbe&info=你好年扩,結(jié)合Python的input編寫一個機(jī)器人聊天室
  2. 利用圖靈查詢接口(POST)http://openapi.tuling123.com/openapi/api/v2,封裝一個實(shí)用的查詢方法访圃,查詢你附近的美食等等

JSON類型解析

序列化和反序列化

程序中的對象厨幻,如Python中的字典、列表腿时、函數(shù)况脆、類等,都是存在內(nèi)存中的圈匆,一旦斷電就會消失,不方便傳遞或存儲捏雌,所以我們需要將內(nèi)存中的對象轉(zhuǎn)化為文本或者文件格式跃赚,來滿足傳輸和持久化(存儲)需求

  • 序列化: 內(nèi)存對象 -> 文本/文件
  • 反序列化: 文本 -> 內(nèi)存對象

對象在HTTP中的傳輸過程
HTTP協(xié)議是超文本傳輸協(xié)議,是通過文本或二進(jìn)制進(jìn)行傳輸?shù)男允晕覀儼l(fā)送的請求要轉(zhuǎn)化成文本進(jìn)行傳輸纬傲,收到的響應(yīng)也是文本格式,如果是JSON肤频,一般還需要將文本格式重新轉(zhuǎn)化為對象

JSON對象(Python字典) -> 轉(zhuǎn)為文本請求 -> 發(fā)送請求
-> 服務(wù)器收到文本請求 -> 將文本請求轉(zhuǎn)化為對象叹括,獲取其中的參數(shù),處理業(yè)務(wù)
-> 返回文本格式的響應(yīng) -> 客戶端轉(zhuǎn)為對象格式來從響應(yīng)中取值

JSON對象與Python字典的區(qū)別

JSON對象是javascript object即javascript中的對象宵荒,是一種通用的格式汁雷,格式嚴(yán)格,不支持備注报咳。

JSON文本和JSON對象的區(qū)別:

  • JSON文本是符合JSON格式的文本,實(shí)際上是一個字符串
  • JSON對象是內(nèi)存中一個對象,擁有屬性和方法循衰,可以通過對象獲取其中的參數(shù)信息

Python中我們一般提到JSON對象指的是字典

Python的字典的格式和JSON格式蟋座,稍有不同:

  • 字典中的引號支持單引號和雙引號,JSON格式只支持雙引號
  • 字典中的True/False首字母大寫岩臣,JSON格式為true/false
  • 字典中的空值為None, JSON格式為null

JSON格式操作方法

  • 序列化(字典 -> 文本/文件句柄): json.dumps()/json.dump()
  • 反序列化(文本/文件句柄 -> 字典) : json.loads()/json.load()
import json # 需要導(dǎo)入JSON包

data = {'name': '張三', 'password': '123456', "male": True, "money": None} # 字典格式
str_data = json.dumps(data) # 序列化溜嗜,轉(zhuǎn)化為合法的JSON文本(方便HTTP傳輸)
print(str_data)

輸出:{"name": "\u5f20\u4e09", "password": "123456", "male": true, "money": null}

json.dumps()支持將json文本格式化輸出

import requests 
import json

res = requests.post("http://www.tuling123.com/openapi/api?key=ec961279f453459b9248f0aeb6600bbe&info=怎么又是你") 
print(res.text) # 輸出為一行文本
res_dict = res.json() # 將響應(yīng)轉(zhuǎn)為json對象(字典)等同于`json.loads(res.text)`
print(json.dumps(res_dict, indent=2, sort_keys=True, ensure_ascii=False)) # 重新轉(zhuǎn)為文本

看一下輸出結(jié)果對比:

{"code":100000,"text":"我才要說怎么又是你"}  # res.text,有些接口中文會返回為\u..
{
  "code": 100000,
  "text": "我才要說怎么又是你"  # 樹狀格式架谎,比較清晰炸宵,顯示中文
}
  • indent: 縮進(jìn)空格數(shù),indent=0輸出為一行
  • sork_keys=True: 將json結(jié)果的key按ascii碼排序
  • ensure_ascii=Fasle: 不確保ascii碼谷扣,如果返回格式為utf-8包含中文焙压,不轉(zhuǎn)化為\u...

反序列化

import json

res_text = {"name": "\u5f20\u4e09", "password": "123456", "male": true, "money": null}  # JSON文本格式的響應(yīng)信息
res_dict = json.loads(res_text) # 轉(zhuǎn)化為字典 
print(res_dict['name'])  # 方便獲取其中的參數(shù)值

輸出:張三

文件的序列化與反序列化

  1. 序列化:字典 -> 文件句柄
import json

res_dict = {'name': '張三', 'password': '123456', "male": True, "money": None} # 字典格式
f = open("demo1.json","w")
json.dump(res_dict, f)

查看同級目錄,增加了一個demo1.json文件,內(nèi)容為:

{"name": "\u5f20\u4e09", "password": "123456", "male": true, "money": null}
  1. 序列化: 文件句柄 -> 字典

在項目中(和下面腳本文件同一路徑下)新建demo2.json文件,內(nèi)容如下涯曲,保存

{
  "name": "張三",
  "password": "123456",
  "male": true,
  "money": null
}

新建Python文件

import json

f = open("demo.JSON","r", encoding="utf-8")  # 文件中有中文需要指定編碼
f_dict = json.load(f) # 反序列化將文件句柄轉(zhuǎn)化為字典
print(f['name']) # 讀取其中參數(shù)
f.close()

什么時候使用JSON對象(字典)什么時候使用JSON文本野哭?
一般在組裝data參數(shù)時,建議使用字典格式幻件,發(fā)送請求時用json.dumps(data)轉(zhuǎn)化為文本發(fā)送拨黔,收到請求后使用json.loads(res.text)轉(zhuǎn)化為字典,方便我們獲取其中的參數(shù)信息
練習(xí):

  1. 解析以下json格式文件绰沥,發(fā)送請求并打印響應(yīng)

注: method支持get和post篱蝇,如果沒有method,有data默認(rèn)發(fā)post請求徽曲,沒有data默認(rèn)發(fā)get請求零截,type支持:form或json,沒有默認(rèn)發(fā)form格式
demo1.json

{
  "url": "http://www.tuling123.com/openapi/api",
  "method": "get",
  "params": {
    "key": "ec961279f453459b9248f0aeb6600bbe",
    "info": "你好"
  }
}

demo2.json

{
  "url": "http://openapi.tuling123.com/openapi/api/v2",
  "method": "post",
  "type": "json",
  "data": {
    "reqType": 0,
    "perception": {
      "inputText": {
        "text": "附近的酒店"
      },
      "inputImage": {
        "url": "imageUrl"
      },
      "selfInfo": {
        "location": {
          "city": "北京",
          "province": "北京",
          "street": "信息路"
        }
      }
    },
    "userInfo": {
      "apiKey": "ec961279f453459b9248f0aeb6600bbe",
      "userId": "206379"
    }
  }
}

requests庫詳解

請求方法

  • requests.get()
  • requests.post()
  • requests.put()
    ...
  • requests.session(): 用于保持會話(session)
    除了requests.session()外秃臣,其他請求方法的參數(shù)都差不多涧衙,都包含url,params, data, headers, cookies, files, auth, timeout等等

請求參數(shù)

  • url: 字符串格式奥此,參數(shù)也可以直接寫到url中
  • params:url參數(shù)弧哎,字典格式
  • data: 請求數(shù)據(jù),字典或字符串格式
  • headers: 請求頭稚虎,字典格式
  • cookies: 字典格式撤嫩,可以通過攜帶cookies繞過登錄
  • files: 字典格式,用于混合表單(form-data)中上傳文件
  • auth: Basic Auth授權(quán)蠢终,數(shù)組格式 auth=(user,password)
  • timeout: 超時時間(防止請求一直沒有響應(yīng)序攘,最長等待時間),數(shù)字格式寻拂,單位為秒

響應(yīng)解析

  • res.status_code: 響應(yīng)的HTTP狀態(tài)碼
  • res.reason: 響應(yīng)的狀態(tài)碼含義
  • req.text:響應(yīng)的文本格式两踏,按req.encoding解碼
  • req.content: 響應(yīng)的二進(jìn)制格式
  • req.encoding: 解碼格式,可以通過修改req.encoding='utf-8'來解決一部分中文亂碼問題
  • req.apparent_encoding:真實(shí)編碼兜喻,由chardet庫提供的明顯編碼
  • req.json(): (注意梦染,有括號),響應(yīng)的json對象(字典)格式朴皆,慎用帕识!如果響應(yīng)文本不是合法的json文本,或報錯
  • req.headers: 響應(yīng)頭
  • req.cookies: 響應(yīng)的cookieJar對象遂铡,可以通過req.cookies.get(key)來獲取響應(yīng)cookies中某個key對應(yīng)的值
    ...
    示例:
import requests 

res = requests.get("https://www.baidu.com") 
print(res.status_code, res.reason) # 200 OK
print(res.text) # 文本格式肮疗,有亂碼
print(res.content) # 二進(jìn)制格式
print(res.encoding) # 查看解碼格式 ISO-8859-1
print(res.apparent_encoding) # utf-8
res.encoding='utf-8' # 手動設(shè)置解碼格式為utf-8
print(res.text) # 亂碼問題被解決
print(res.cookies.items()) # cookies中的所有的項 [('BDORZ', '27315')]
print(res.cookies.get("BDORZ")) # 獲取cookies中BDORZ所對應(yīng)的值 27315

詳情參考:Py.qi: python3之requests

帶安全認(rèn)證的請求

需要登錄的請求(Cookie/Session認(rèn)證)

例如:
直接訪問: https://demo.fastadmin.net/admin/dashboard?ref=addtabs
頁面(頁面可以看做一個返回html代碼的GET請求)會提示請登錄后操作
登錄頁面:https://demo.fastadmin.net/admin/index/login.html 用戶名/密碼:admin/123456(POST表單請求)

未登錄訪問接口

  1. 使用會話保持
import requests

s = requests.session() # 新建一個會話
s.post(url="https://demo.fastadmin.net/admin/index/login.html",data={"username":"admin","password":"123456"}) # 發(fā)送登錄請求
res = s.get("https://demo.fastadmin.net/admin/dashboard?ref=addtabs") # 使用同一個會話發(fā)送get請求,可以保持登錄狀態(tài)
print(res.text)

如果不使用session()而單獨(dú)發(fā)一個post登錄請求一個get請求是否可以呢扒接?你可以自己試一下(requests.get()或post()每次都會建立一個新會話)

  1. 抓取cookies
    1. 使用Chrome瀏覽器訪問https://demo.fastadmin.net/admin/index/login.html伪货,登錄
    2. 打開開發(fā)者工具刷新當(dāng)前頁面(https://demo.fastadmin.net/admin/index/login.html
    3. Network面包查看當(dāng)前請求们衙,將cookie后面的值復(fù)制出來,組裝成字典格式
抓取cookies
import requests

url = "https://demo.fastadmin.net/admin/dashboard?ref=addtabs"
cookies = {"PHPSESSID":"9bf6b19ddb09938cf73d55a094b36726"}
res = requests.get(url=url, cookies=cookies) # 攜帶cookies發(fā)送請求
print(res.text)

兩種方式的對比

  • 使用session方式:每次都要發(fā)送兩次請求碱呼,效率較低
  • 使用攜帶cookies方式:需要手動抓包蒙挑,提取組裝,cookies中是session有一定有效期愚臀,過期之后要重新抓取和更換cookies
  • 如果很多或所有請求都需要登錄忆蚀,可以發(fā)一次請求,保持該session為全局變量姑裂,其他接口都使用該session發(fā)送請求(同樣要注意登錄過期時間)
    練習(xí)
  1. 抓包并用腳本發(fā)一條微博或一篇博客

appid或token方式

  • appid: 系統(tǒng)為合法用戶賦予的訪問id馋袜,固定的字符串,一般經(jīng)過加密以確保HTTP傳輸中的安全
  • token: 即令牌舶斧,固定或需要動態(tài)申請(有一定有效期)欣鳖,一般由用戶信息及申請時間計算加密而成,用于驗證接口訪問的權(quán)限

token與session的區(qū)別

  • session是存在服務(wù)器的茴厉,服務(wù)端通過驗證客戶端的請求所攜帶的session值在服務(wù)會話中是否存在泽台,來驗證用戶是否合法
  • token: 是按一定算法加密計算出來的,服務(wù)端通過解密客戶端所攜帶的token值來驗證用戶是否合法
    **示例: **
  • 訪問百度AI開發(fā)者平臺:http://ai.baidu.com/呀忧,注冊并登錄师痕,成為開發(fā)者溃睹,選擇文字識別
  • 文字識別開發(fā)者文檔:http://ai.baidu.com/docs#/OCR-API/top
  • 根據(jù)文檔新建應(yīng)用而账,查看自己的App Key和Secret Key
創(chuàng)建應(yīng)用
獲取token
通用文字接口
  • 從網(wǎng)絡(luò)上找一張帶文字的圖片因篇,右鍵泞辐,復(fù)制圖片地址(注意不支持https地址的圖片)
帶文字的圖片
請求結(jié)果
import requests
import json

app_key = 'kPoFYw85FXsnojsy5bB9hu6x'
secret_key = 'l7SuGBkDQHkjiTPU3m6NaNddD6SCvDMC'
img_url = 'http://upload-images.jianshu.io/upload_images/7575721-40c847532432e852.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240'
# 獲取token
get_token_url = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={}&client_secret={}'.format(app_key,secret_key)
token = requests.get(url=get_token_url).json().get("access_token")  # 從獲取token接口的響應(yīng)中取得token值
# 識別圖片文字
orc_url = 'https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token={}'.format(token)
data = {"url": img_url}
res = requests.post(url=orc_url, data=data)
print(json.dumps(res.json(), indent=2, ensure_ascii=False)) # 格式化輸出

顯示結(jié)果:

{
  "log_id": 4745549456768330559,
  "words_result_num": 6,
  "words_result": [
    {
      "words": "我又問:那么何時,你帶我回去?"
    },
    {
      "words": "蓮師言:你是你,我是我。你若不愿流連凡塵,自會回去竞滓。"
    },
    {
      "words": "我問蓮師:我從哪里來,要到哪里去?"
    },
    {
      "words": "蓮師言:世間種種變相,皆有起源咐吼。來與去皆是命中定數(shù),不可參度。"
    },
    {
      "words": "我再問:我是否還會再見到你?"
    },
    {
      "words": "蓮師言:你若心中有我,自然會再見商佑。"
    }
  ]
}

練習(xí):

  1. 自己注冊任意一個開發(fā)者平臺(微信開發(fā)者平臺锯茄,百度開發(fā)者平臺,餓了么開發(fā)者平臺)茶没,創(chuàng)建應(yīng)用肌幽,根據(jù)相應(yīng)的授權(quán)方式獲取token,并使用token正常訪問一個接口

開放協(xié)議授權(quán)

reqeusts支持Basic Auth(基本授權(quán))和Digist Auth(摘要授權(quán))

Oauth1.0 Oauth2.0 參考: requests官方文檔

Basic Auth

import requests
import json

# 基本授權(quán)可以直接在請求方法中使用`auth = (user,password)`
res = requests.get("https://api.github.com/user", auth=("hanzhichao", "hanzhichao123"))
print(json.dumps(res.json(), indent=2, ensure_ascii=False))  # 格式化輸出 

數(shù)字簽名

無論是cookie/session還是appid/token方式抓半,只用來驗證請求者身份而不驗證參數(shù)喂急,因此無法防止請求參數(shù)被抓包攔截后篡改(仍攜帶合法的cookie或token)
數(shù)字簽名(sign或sig)是用來對原始參數(shù)整體進(jìn)行加密后生成的一個字符串,請求時參數(shù)和簽名一期發(fā)送笛求,服務(wù)器收到請求后對參數(shù)再次計算簽名核對和所攜帶的簽名是否一致廊移。
例如: 原始簽名{}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末糕簿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子狡孔,更是在濱河造成了極大的恐慌懂诗,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件步氏,死亡現(xiàn)場離奇詭異响禽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)荚醒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門芋类,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人界阁,你說我怎么就攤上這事侯繁。” “怎么了泡躯?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵贮竟,是天一觀的道長。 經(jīng)常有香客問我较剃,道長咕别,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任写穴,我火速辦了婚禮惰拱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘啊送。我一直安慰自己偿短,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布馋没。 她就那樣靜靜地躺著昔逗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪篷朵。 梳的紋絲不亂的頭發(fā)上勾怒,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機(jī)與錄音声旺,去河邊找鬼笔链。 笑死,一個胖子當(dāng)著我的面吹牛艾少,可吹牛的內(nèi)容都是我干的卡乾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼缚够,長吁一口氣:“原來是場噩夢啊……” “哼幔妨!你這毒婦竟也來了鹦赎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤误堡,失蹤者是張志新(化名)和其女友劉穎古话,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锁施,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡陪踩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了悉抵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肩狂。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖姥饰,靈堂內(nèi)的尸體忽然破棺而出傻谁,到底是詐尸還是另有隱情,我是刑警寧澤列粪,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布审磁,位于F島的核電站,受9級特大地震影響岂座,放射性物質(zhì)發(fā)生泄漏态蒂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一费什、第九天 我趴在偏房一處隱蔽的房頂上張望钾恢。 院中可真熱鬧,春花似錦吕喘、人聲如沸赘那。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至祠斧,卻和暖如春闻察,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背琢锋。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工辕漂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吴超。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓钉嘹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鲸阻。 傳聞我的和親對象是個殘疾皇子跋涣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 接口測試自動化的優(yōu)點(diǎn): 1缨睡,web自動化說起來很多人都會直接想到UI自動化這個設(shè)計,很少有人直接第一個概念是接口自...
    路邊看雪的小男孩閱讀 4,921評論 1 26
  • 目錄 Python接口測試課程(第一天)-Python基礎(chǔ)Python接口測試課程(第二天)-接口測試快速實(shí)踐Py...
    韓志超閱讀 4,981評論 2 26
  • 之前介紹了接口測試中需要關(guān)注得測試點(diǎn)陈辱,現(xiàn)在我們來看看如何進(jìn)行接口測試奖年,現(xiàn)在接口測試工具有很多種,例如:postma...
    MR_Hanjc閱讀 5,667評論 3 13
  • 抬頭看看,看到了什么?” “天空利赋∷溃”弟子答∶乃停“天空夠大吧之碗,”師父說,“但我可以用一只手掌遮住整個天空季希⊥誓牵”...
    筠尚姿閱讀 293評論 0 2
  • 鐘離權(quán)姓鐘離,名權(quán)式塌,字云房博敬,一字寂道,號正陽子峰尝,又號和谷子偏窝,漢咸陽人。因為原型為東漢大將武学,故又被稱做漢鐘離祭往。少工文...
    白江松閱讀 630評論 0 1