より多くの情報を学び、QQグループを追加してください:822 601 020取得
結果を実現
需要シナリオ:
- 毎回ポストマンデバッグインタフェースを使用してデジタル署名を使用して、会社マイクロサービス・インターフェースは、あなたが看板を確認するために、ソースコード一時的に閉鎖を変更する必要がありますが、閉じた後、他のマイクロサービスは、通常のサービスを呼び出すことはできません
- ELKは、パラメータへのインタフェースからクロールJSON形式を必要とする、私は通常、崇高なテキスト+ PrettyJsonプラグを使用し、ポストマンのデバッグ、いくつかのフォームクラスのインタフェースを使用し、また、あなたが、うち特に厄介各パラメータの値をコピーする必要があります。
原則:
- ビルドシステムをカスタマイズすることができます崇高テキスト3
- 便利なPythonのJSONデータ処理
- Pythonの署名アルゴリズム
- リクエストの送信を要求するインターフェース
目標:
- JSONファイル、データドライバを使用してJSONを支持する複数のインタフェースを備えました
- サポートGET / POST / DELETE / ...方法
- サポートフォームクラス/ JSONリクエストクラス
- 支持ヘッダ、クッキー、パラメータ、データ、ファイル、タイムアウト
- サポートセッション依存性、中間変数
データファイル形式:
- リクエストを取得
{
"url": "http://127.0.0.1:5000/api/user/logout/?name=张三"
}
若しくは
{
"url": "http://127.0.0.1:5000/api/user/logout/",
"params": {"name": "张三"}
}
- ポストリクエストフォーム:
{
"url": "http://127.0.0.1:5000/api/user/login/",
"data": {"name": "张三","password": "123456"}
}
- リクエストのJSON形式:
{
"url": "http://127.0.0.1:5000/api/user/reg/",
"headers": {"Content-Type": "application/json"},
"data": { "name": "张991", "password": "123456"}
}
若しくは
{
"url": "http://127.0.0.1:5000/api/user/reg/",
"type": "json",
"data": { "name": "张991","password": "123456"}
}
- フォーマットアサーション(ASSERT):
{
"url": "http://127.0.0.1:5000/api/user/login/",
"data": {"name": "张三","password": "123456"},
"ASSERT": ["response.status_code == 200", "'成功' in response.text"]
}
- 署名(SIGN)を必要とします。
{ "url": "http://127.0.0.1:5000/api/user/delUser/",
"type": "json",
"data": {"name": "张三"},
"SIGN": true
}
- マルチインターフェイス、セッション依存性、及び中間変数(STORE)
[
{
"url": "http://127.0.0.1:5000/api/user/getToken/",
"method": "get",
"params": {"appid": "136425"},
"STORE": {"token": "response.text.split('=')[1]"}
},
{ "url": "http://127.0.0.1:5000/api/user/updateUser/?token=%(token)s",
"headers": {"Content-Type": "application/json"},
"data": {"name": "张三","password": "123456"}
}
]
達成するためのツール:
sign.py
import hashlib
appid = user
appsecret = NTA3ZTU2ZWM5ZmVkYTVmMDBkMDM3YTBi
def md5(str):
m = hashlib.md5()
m.update(str.encode('utf8'))
return m.hexdigest() #返回摘要,作为十六进制数据字符串值
def makeSign(params):
if not isinstance(params, dict):
print("参数格式不正确,必须为字典格式")
return None
if 'sign' in params:
params.pop('sign')
sign = ''
for key in sorted(params.keys()):
sign = sign + key + '=' + str(params[key]) + '&'
sign = md5(sign + 'appsecret=' + appsecret)
params['sign'] = sign
return params
post_json.py
import json
import os
import requests
from sign import makeSign
timeout = 10
def postJson(path, timeout=60):
try:
with open(path, encoding='utf-8') as f:
apis = json.load(f)
except IOError as e:
print(e)
except json.decoder.JSONDecodeError:
print("json文件格式有误")
if isinstance(apis, dict):
apis=[apis]
session = requests.session()
for api in apis:
# 处理全局变量
str_api = json.dumps(api)
if '%' in str_api:
api = json.loads(str_api % globals())
# 获取接口相关项
url = api.get('url')
method = api.get('method')
type = api.get('type')
headers = api.get('headers')
cookies = api.get('cookies')
params = api.get('params')
data = api.get('data')
files = api.get('files')
# 特定动作(系统标签)
_sign = api.get('SIGN') # 对数据进行签名
_store = api.get('STORE') # 存储变量
_assert = api.get('ASSERT') # 结果断言
# 处理签名
if _sign:
data = makeSign(data)
# 如果json请求,转换一下数据
if type and type == 'json' or headers and 'json' in json.dumps(headers):
data = json.dumps(data)
# 根据method发送不同请求
if not method or method.lower() == 'post': # 有data字段默认使用post方法
response = session.post(url=url, headers=headers, cookies=cookies, params=params, data=data, files=files, timeout=timeout)
elif not data or method.lower() == 'get': # 没有data字段默认采用get方法
response = session.get(url=url, headers=headers, cookies=cookies, params=params, timeout=timeout)
elif method.lower() == 'delete':
response = session.delete(url=url, headers=headers, cookies=cookies, params=params, data=data, files=files, timeout=timeout)
elif method.lower() == 'put':
response = session.put(url=url, headers=headers, cookies=cookies, params=params, data=data, files=files, timeout=timeout)
elif method.lower() == 'patch':
response = session.patch(url=url, headers=headers, cookies=cookies, params=params, data=data, files=files, timeout=timeout)
elif method.lower() == 'head':
response = session.head(url=url, headers=headers, cookies=cookies, params=params, data=data, files=files, timeout=timeout)
else:
print("不支持当前方法")
# 存储中间结果
if _store:
for key in _store:
globals()[key]=eval(_store[key])
# 处理响应
try:
response_text = json.dumps(response.json(), ensure_ascii=False, indent=2)
except json.decoder.JSONDecodeError: # only python3
try:
response_text = response.text
except UnicodeEncodeError:
# print(response.content.decode("utf-8","ignore").replace('\xa9', ''))
response_text = response.content
finally:
pass
# 处理断言
status = "PASS"
if _assert:
assert_results = []
for item in _assert:
try:
assert eval(item)
assert_results.append("PASS: <%s>" % item)
except AssertionError:
assert_results.append("FAIL: <%s>" % item)
status = "FAIL"
except Exception as e:
assert_results.append("ERROR: <%s>\n%s" % (item, repr(e)))
status = "ERROR"
# 打印结果
print("="*80)
print("请求:")
print("Url: %s\nHeaders: %s\nData: %s" % (url, headers, data if isinstance(data, str) else json.dumps(data)))
print("-"*80)
print("响应:")
print(response_text)
if _assert:
print("-"*80)
print("断言:")
for assert_result in assert_results:
print(assert_result)
def main():
if len(sys.argv) != 2:
print("缺少参数:json文件")
else:
postJson(sys.argv[1])
main()
サブライムに統合
- 崇高テキスト3 - >ツール- >ビルド・システム- >新システムのビルド
、コピーし、次のコードをあなたのpost_json.pyパスのPythonスクリプト・パスのためのあなたのpython3環境を変更、PostJson.sublimetビルドのために保存し
- Windowsシステム
{
"cmd": ["python3","C:/PostJson/post_json.py","$file"],
"file_regex": "^[ ] *File \"(...*?)\", line ([0-9]*)",
"selector": "source.json",
"encoding":"cp936",
}
- Linuxの&マック
{
"cmd": ["/Library/Frameworks/Python.framework/Versions/3.6/bin/python3","-u","/Users/apple/Applications/PostJson/post_json.py","$file"],
"file_regex": "^[ ] *File \"(...*?)\", line ([0-9]*)",
"selector": "source.json",
"env": {"PYTHONIOENCODING": "utf8"},
}
使用
PrettyJsonは、プラグインをインストールすることをお勧めします
- 崇高なテキスト3、新しいJSONファイル、および* .jsonとして保存で
{
"url": "http://127.0.0.1:5000/api/user/login/",
"data": {"name": "张三","password": "123456"}
}
- Ctrlキーを押しながらBの実行
プロジェクトパス
Githubの:PostJson
これは、次の機能を補完します:
- ユースケースを発見、自動検出およびバッチ実行
- レポートの生成
- コマンドラインパラメータ
- 詳細:表示レベル:1.表示のみ例2の結果は、アサーション情報にのみ応答テキスト(デフォルト)表示要求、および応答を示し、
- ホスト:サーバーアドレスを指定
- ENV:環境を指定します。
- タイムアウト:指定のタイムアウト
- HTML:HTML形式のレポートが出力パスを指定します
- ログ:出力パスの指定を記録
- 収集のみ:リストのみすべてのユースケース
ToDoリスト
- 完全なテストレポート
- サポートデータベースの比較
- SQL、シェル、Cmdをコマンドの実装をサポートしています
- コルーチンを使用して、非同期同時
- 分散実行のサポート
- 定期的な実行のためのサポート
- 継続的インテグレーション