1. 程式人生 > >robotframework-requests--中文註解版

robotframework-requests--中文註解版

raise 所有 bject options turn 基本 mat 字符串 字符

最近工作原因在研究RobotFramework對REST測試的方案,找到幾個相關類庫。但使用requests感覺更方便,研究了一下requests類庫的源碼,並將註釋換成中文為方便使用。關於Requests類庫的源碼找到兩個版本,VCR版本,另一個下面這個算是普通版吧。關於VCR部分的內容還在研究,稍後發出來。

[lang=python]

#! /url/bin/python
# -*- coding: UTF-8 -*-

import requests import
import json
from urllib import urlencode
from robot.libraries.BuiltIn import BuiltIn
from robot import utils
try:
from requests_ntlm import HttpNtlmAuth
except ImportError:
pass


class RestKeywords(object):
ROBOT_LIBRARY_SCOPE = ‘Global‘

def __init__(self):
self._cache = utils.ConnectionCache(u‘未創建Sessions‘)
self.builtin = BuiltIn()

def _utf8_urlencode(self, data):
if isinstance(data, unicode):
return data.encode(‘utf-8‘)

if not isinstance(data, dict):
return data

utf8_data = {}
for k, v in data.iteritems():
utf8_data[k] = unicode(v).encode(‘utf-8‘)

return urlencode(utf8_data)

def _create_session(self, alias, url, headers, cookies,
auth, timeout, proxies, verify):
""" Create Session: 創建一個連接server的HTTP會話

`url` 服務器基本的URL地址

`alias` Robot Framework 對當前創建的HTTP會話指定的別名

`headers` 默認的headers字典

`auth` 對於HTTP基本身份驗證詞典的用戶名和密碼

`timeout` 連接超時

`proxies` 代理服務器URL

`verify` 如果請求驗證證書,該值設置為True
"""

self.builtin.log(u‘創建Session:%s‘ % alias, ‘DEBUG‘)
session = requests.Session()
session.headers.update(headers)
session.auth = auth if auth else session.auth
session.proxies = proxies if proxies else session.proxies

session.verify = self.builtin.convert_to_boolean(verify)

# 通過傳遞進入說請求
# cant pass these into the Session anymore
self.timeout = timeout
self.cookies = cookies
self.verify = verify

# cant use hooks:(
session.url = url

self._cache.register(session, alias=alias)

return session

def create_session(self, alias, url, headers={}, cookies=None,
auth=None, timeout=None, proxies=None, verify=False):
""" Create Session: 創建一個連接server的HTTP會話

`url` 服務器基本的URL地址

`alias` Robot Framework 對當前創建的HTTP會話指定的別名

`headers` 默認的headers字典

`auth` 對於HTTP基本身份驗證詞典的[‘DOMAIN‘, ‘用戶名‘, ‘密碼‘]

`timeout` 連接超時

`proxies` 代理服務器URL

`verify` 如果請求驗證證書,該值設置為True
"""

auth = request.auth.HTTPBasicAuth(*auth) if auth else None

return self._create_session(alias, url, headers, cookies, auth,
timeout, proxies, verify)

def create_ntln_session(self, alias, url, headers={}, cookies=None,
auth=None, timeout=None, proxies=None, verify=False):
""" Create Session: 創建一個連接server的HTTP會話

`url` 服務器基本的URL地址

`alias` Robot Framework 對當前創建的HTTP會話指定的別名

`headers` 默認的headers字典

`auth` 對於HTTP基本身份驗證詞典的[‘DOMAIN‘, ‘用戶名‘, ‘密碼‘]

`timeout` 連接超時

`proxies` 代理服務器URL

`verify` 如果請求驗證證書,該值設置為True
"""
if not HttpNtlmAuth:
raise AssertionError(u‘未加載Reuqest HTLM模塊‘)
elif len(auth) != 3:
raise AssertionError(u‘驗證參數數量不正確 ‘
u‘- 預期3個參數, 實際{}‘.format(len(auth)))
else:
ntlm_auth = HttpNtlmAuth(‘{}\\{}‘.format(auth[0], auth[1]), auth[2])

return self._create_session(alias, url, headers, cookies,
ntlm_auth, timeout, proxies, verify)

def delete_all_sessions(self):
"""刪除所有Session對象"""

self._cache.empty_cache()

def to_json(self, content, pretty_print=False):
"""將字符串轉換為一個JSON對象
`content`字符串的內容轉換成JSON
`pretty_print`如果被定義,將content輸出打印JSON格式
"""
if pretty_print:
json_ = self._json_pretty_print(content)
else:
json_ = json.loads(content)
return json_

def get_request(self, alias, uri, headers=None, params={}, allow_redirects=None):
""" 使用指定別名中找到的會話對象發送GET請求

`uri` 向該uri發送GET 請求

`alias` 將用於識別在高速緩存中的Session 對象

`headers` 請求以字典格式的報頭

"""
# 根據alias獲取Session對象
session = self._cache.switch(alias)
# 對參數進行encode編碼轉換
params = self._utf8_urlencode(params)
# 判斷是否允許重定向
redir = True if allow_redirects is None else allow_redirects
response = self._get_request(session, uri, headers, params, redir)

return response

def get(self, alias, uri, headers=None, params={}, allow_redirects=None):
""" * * * 警告 - 建議使用get request * * *
使用指定別名中找到的會話對象發送GET請求

`uri` 向該uri發送GET 請求

`alias` 將用於識別在高速緩存中的Session 對象

`headers` 請求以字典格式的報頭

"""
print u"警告強烈反對當前使用GET方法提交請求"
session = self._cache.switch(alias)
params = self._utf8_urlencode(params)
redir = True if allow_redirects is None else allow_redirects
response = self._get_request(session, uri, headers, params, redir)

return response

def post_request(self, alias, uri, data={}, headers=None, files={}, allow_redirects=None):
""" 使用指定別名中找到的會話對象發送POST請求

`uri` 向該uri發送POST 請求

`alias` 將用於識別在高速緩存中的Session 對象

`headers` 請求以字典格式的報頭

`data` 將原Body內容POST的數據或二進帛數據轉換為鍵值字典,並以urlencoded編碼形式發送

`files` 包含數據文件的文件名的字典才能POST到服務器

"""
# 根據alias獲取Session對象
session = self._cache.switch(alias)
# 對data進行encode編碼轉換
data = self._utf8_urlencode(data)
# 判斷是否允許重定向
redir = True if allow_redirects is None else allow_redirects
response = self._post_request(session, uri, data, headers, files, redir)

return response

def post(self, alias, uri, data={}, headers=None, files={}, allow_redirects=None):
""" * * * 警告 - 建議使用post request * * *
使用指定別名中找到的會話對象發送POST請求

`uri` 向該uri發送POST 請求

`alias` 將用於識別在高速緩存中的Session 對象

`headers` 請求以字典格式的報頭

`data` 將原Body內容POST的數據或二進帛數據轉換為鍵值字典,並以urlencoded編碼形式發送

`files` 包含數據文件的文件名的字典才能POST到服務器

"""
print u"警告強烈反對當前使用POST方法提交請求"
session = self._cache.switch(alias)
data = self._utf8_urlencode(data)
redir = True if allow_redirects is None else allow_redirects
response = self._post_request(session, uri, data, headers, files, redir)

return response

def patch_request(self, alias, uri, data={}, headers=None, files={}, allow_redirects=None):
""" 使用指定別名中找到的會話對象發送PATCH請求

`uri` 向該uri發送PATCH請求

`alias` 將用於識別在高速緩存中的Session 對象

`headers` 請求以字典格式的報頭

`data` 將原Body內容PATCH的數據或二進帛數據轉換為鍵值字典,並以urlencoded編碼形式發送

`files` 包含數據文件的文件名的字典才能PATCH到服務器

"""
session = self._cache.switch(alias)
data = self._utf8_urlencode(data)
redir = True if allow_redirects is None else allow_redirects
response = self._patch_request(session, uri, data, headers, files, redir)
return response

def patch(self, alias, uri, data={}, headers=None, files={}, allow_redirects=None):
""" * * * 警告 - 建議使用patch request * * *
使用指定別名中找到的會話對象發送PATCH請求

`uri` 向該uri發送PATCH請求

`alias` 將用於識別在高速緩存中的Session 對象

`headers` 請求以字典格式的報頭

`data` 將原Body內容PATCH的數據或二進帛數據轉換為鍵值字典,並以urlencoded編碼形式發送

`files` 包含數據文件的文件名的字典才能PATCH到服務器

"""
print u"警告強烈反對當前使用PATCH方法提交請求"
session = self._cache.switch(alias)
data = self._utf8_urlencode(data)
redir = True if allow_redirects is None else allow_redirects
response = self._patch_request(session, uri, data, headers, files, redir)

return response

def put_request(self, alias, uri, data=None, headers=None, allow_redirects=None):
"""使用指定別名中找到的會話對象發送PUT請求

`uri` 向該uri發送PUT請求

`alias` 將用於識別在高速緩存中的Session 對象

`headers` 請求以字典格式的報頭

`data` 將原Body內容PUT的數據或二進帛數據轉換為鍵值字典,並以urlencoded編碼形式發送

"""
session = self._cache.switch(alias)
data = self._utf8_urlencode(data)
redir = True if allow_redirects is None else allow_redirects
response = self._put_request(session, uri, data, headers, redir)

return response

def put(self, alias, uri, data=None, headers=None, allow_redirects=None):
"""* * * 警告 - 建議使用put request * * *
使用指定別名中找到的會話對象發送PUT請求

`uri` 向該uri發送PUT請求

`alias` 將用於識別在高速緩存中的Session 對象

`headers` 請求以字典格式的報頭

`data` 將原Body內容PUT的數據或二進帛數據轉換為鍵值字典,並以urlencoded編碼形式發送

"""
print u"警告強烈反對當前使用put方法提交請求"
session = self._cache.switch(alias)
data = self._utf8_urlencode(data)
redir = True if allow_redirects is None else allow_redirects
response = self._put_request(session, uri, data, headers, redir)

return response

def delete_request(self, alias, uri, data=(), headers=None, allow_redirects=None):
""" 使用指定別名中找到的會話對象發送DELETE請求

`uri` 向該uri發送DELETE請求

`alias` 將用於識別在高速緩存中的Session 對象

`headers` 請求以字典格式的報頭

`data` 將原Body內容DELETE的數據或二進帛數據轉換為鍵值字典,並以urlencoded編碼形式發送

"""
session = self._cache.switch(alias)
data = self._utf8_urlencode(data)
redir = True if allow_redirects is None else allow_redirects
response = self._delete_request(session, uri, data, headers, redir)

return response

def delete(self, alias, uri, data=(), headers=None, allow_redirects=None):
"""* * * 警告 - 建議使用delete request * * *
使用指定別名中找到的會話對象發送DELETE請求

`uri` 向該uri發送DELETE請求

`alias` 將用於識別在高速緩存中的Session 對象

`headers` 請求以字典格式的報頭

`data` 將原Body內容DELETE的數據或二進帛數據轉換為鍵值字典,並以urlencoded編碼形式發送

"""
print u"警告強烈反對當前使用delete方法提交請求"
session = self._cache.switch(alias)
data = self._utf8_urlencode(data)
redir = True if allow_redirects is None else allow_redirects
response = self._delete_request(session, uri, data, headers, redir)

return response

def head_request(self, alias, uri, headers=None, allow_redirects=None):
""" 使用指定別名中找到的會話對象發送HEAD請求

`uri` 向該uri發送HEAD請求

`alias` 將用於識別在高速緩存中的Session 對象

`headers` 請求以字典格式的報頭

"""
session = self._cache.switch(alias)
redir = False if allow_redirects is None else allow_redirects
response = self._head_request(session, uri, headers, redir)

return response

def head(self, alias, uri, headers=None, allow_redirects=None):
"""* * * 警告 - 建議使用head request * * *
使用指定別名中找到的會話對象發送HEAD請求

`uri` 向該uri發送HEAD請求

`alias` 將用於識別在高速緩存中的Session 對象

`headers` 請求以字典格式的報頭

"""
print u"警告強烈反對當前使用head方法提交請求"
session = self._cache.switch(alias)
redir = False if allow_redirects is None else allow_redirects
response = self._head_request(session, uri, headers, redir)

return response

def options_request(self, alias, uri, headers=None, allow_redirects=None):
""" 使用指定別名中找到的會話對象發送OPTIONS請求

`uri` 向該uri發送OPTIONS請求

`alias` 將用於識別在高速緩存中的Session 對象

`headers` 請求以字典格式的報頭

"""
session = self._cache.switch(alias)
redir = True if allow_redirects is None else allow_redirects
response = self._options_request(session, uri, headers, redir)

return response

def options(self, alias, uri, headers=None, allow_redirects=None):
"""* * * 警告 - 建議使用options request * * *
使用指定別名中找到的會話對象發送OPTIONS請求

`uri` 向該uri發送OPTIONS請求

`alias` 將用於識別在高速緩存中的Session 對象

`headers` 請求以字典格式的報頭

"""
print u"警告強烈反對當前使用options方法提交請求"
session = self._cache.switch(alias)
redir = True if allow_redirects is None else allow_redirects
response = self._options_request(session, uri, headers, redir)

return response

def _get_request(self, session, uri, headers, params, allow_redirects):
resp = session.get(self._get_url(session, uri),
headers=headers,
params=params,
cookies=self.cookies, timeout=self.timeout,
allow_redirects=allow_redirects)
# 存儲最後響應對象
session.last_resp = resp
self.builtin.log("GET 響應: %s DEBUG" % resp.content)
return resp

def _post_request(self, session, uri, data, headers, files, allow_redirects):
resp = session.post(self._get_url(session, uri),
data=data, headers=headers,
files=files,
cookies=self.cookies, timeout=self.timeout,
allow_redirects=allow_redirects)

# 存儲最後響應對象
session.last_resp = resp
self.builtin.log("POST 響應: %s DEBUG" % resp.content)
return resp

def _patch_request(self, session, uri, data, headers, files, allow_redirects):
resp = session.patch(self._get_url(session, uri),
data=data, headers=headers,
files=files,
cookies=self.cookies, timeout=self.timeout,
allow_redirects=allow_redirects)
# 存儲最後響應對象
session.last_resp = resp
self.builtin.log("PATCH 響應: %s DEBUG" % resp.content)
return resp

def _put_request(self, session, uri, data, headers, allow_redirects):
resp = session.put(self._get_url(session, uri),
data=data, heaers=headers,
cookies=self.cookies, timeout=self.timeout,
allow_redirects=allow_redirects)

self.builtin.log("PUT 響應: %s DEBUG" % resp.content)

# 存儲最後響應對象
session.last_resp =resp
return resp

def _delete_request(self, session, uri, data, headers, allow_redirects):
resp = session.delete(self._get_url(session, uri), data=data,
headers=headers, cookies=self.cookies,
timeout=self.timeout,
allow_redirects=allow_redirects)

# 存儲最後響應對象
session.last_resp = resp
self.builtin.log("DELETE 響應: %s DEBUG" % resp.content)
return resp

def _head_request(self, session, uri, headers, allow_redirects):
resp = session.head(self._get_url(session, uri), headers=headers,
cookies=self.cookies, timeout=self.timeout,
allow_redirects=allow_redirects)

# 存儲最後響應對象
session.last_resp = resp
self.builtin.log("HEAD 響應: %s DEBUG" % resp.content)
return resp

def _options_request(self, session, uri, headers, allow_redirects):
resp = session.head(self._get_url(session, uri), headers=headers,
cookies=self.cookies, timeout=self.timeout,
allow_redirects=allow_redirects)

# 存儲最後響應對象
session.last_resp = resp
self.builtin.log("OPTIONS 響應: %s DEBUG" % resp.content)
return resp

def _get_url(self, session, uri):
"""根據Helper 模塊獲取完整URL"""
url = session.url
if uri:
slash = ‘‘ if uri.startswith(‘/‘) else ‘/‘
url = "%s%s%s" % (session.url, slash, uri)

return url

def _json_pretty_print(self, content):
""" 轉換為JSON 對象
‘content‘ 將content轉換為JSON object
"""
temp = json.loads(content)
return json.dumps(temp, sort_keys=True, indent=4, separators=(‘,‘, ‘: ‘))

robotframework-requests--中文註解版