JSONベースのインターフェーステストフレームワーク

より多くの情報を学び、QQグループを追加してください:822 601 020取得

結果を実現
単一インターフェイス/アサーション

複数のインターフェイス/依存セッション/中間変数

需要シナリオ:

  1. 毎回ポストマンデバッグインタフェースを使用してデジタル署名を使用して、会社マイクロサービス・インターフェースは、あなたが看板を確認するために、ソースコード一時的に閉鎖を変更する必要がありますが、閉じた後、他のマイクロサービスは、通常のサービスを呼び出すことはできません
  2. 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()

サブライムに統合

  1. 崇高テキスト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は、プラグインをインストールすることをお勧めします

  1. 崇高なテキスト3、新しいJSONファイル、および* .jsonとして保存で
{
  "url": "http://127.0.0.1:5000/api/user/login/",
  "data": {"name": "张三","password": "123456"}
}
  1. Ctrlキーを押しながらBの実行

プロジェクトパス

Githubの:PostJson

これは、次の機能を補完します:

  • ユースケースを発見、自動検出およびバッチ実行
  • レポートの生成
  • コマンドラインパラメータ
    • 詳細:表示レベル:1.表示のみ例2の結果は、アサーション情報にのみ応答テキスト(デフォルト)表示要求、および応答を示し、
    • ホスト:サーバーアドレスを指定
    • ENV:環境を指定します。
    • タイムアウト:指定のタイムアウト
    • HTML:HTML形式のレポートが出力パスを指定します
    • ログ:出力パスの指定を記録
    • 収集のみ:リストのみすべてのユースケース

ToDoリスト

  • 完全なテストレポート
  • サポートデータベースの比較
  • SQL、シェル、Cmdをコマンドの実装をサポートしています
  • コルーチンを使用して、非同期同時
  • 分散実行のサポート
  • 定期的な実行のためのサポート
  • 継続的インテグレーション

おすすめ

転載: www.cnblogs.com/superhin/p/11455230.html