Mockツールwiremock-py

6325 ワード

作者|ミミ
wiremock-py
Wiremock-pyはWireMockに基づいて実現され、Pythonを用いて異なるテストシーンにおける異なるHTTP APIのmockデータを一括生成し、mock serverとしてAPIを迅速かつ包括的にテストする.
背景
デジタルアプリケーションのフロントエンドテストにおいて、フロントエンドは一般にバックエンドのデータに依存し、フロントエンドはバックエンドがゲートウェイ上で発行するHTTP APIによってデータを取得する.フロントエンドを十分にテストするには、バックエンドの導入が完了するのを待って、データ層に異なるタイプのデータソースを直接入力し、フロントエンドはバックエンドがゲートウェイに公開されたAPIを直接呼び出してテストするのが理想的です.
しかし、現実的には、フロントエンドとバックエンドの開発進捗が完全に一致していないため、フロントエンドが先に開発が完了した場合、バックエンドに対応するAPIの開発が完了してからテストを開始しなければならず、データ層のデータも構築しにくい.
この問題を解決するために、ゲートウェイプラットフォームは簡単なmock機能を行い、各APIはmockデータを記入し、フロントエンドがAPIを呼び出すときに直接このmockデータを使用することができる.
この方法では、ゲートウェイはmock serverとして機能します.
しかし、同じゲートウェイを使用しているため、1つのAPIではmockデータを1つしか保存できないため、以下の欠点があります.
  • 異なるテストシーンは異なるmockデータをテストする必要があり、この場合、前のテストシーンのmockデータを削除し、新しいシーンのmockデータを作成してからテスト
  • を行う必要がある.
  • は、テストシーンに基づいてAPI対応のmockデータ
  • を一定の規則に従って動的に生成することはできない.
  • 同じAPIを複数人で同時に使用できない場合は、同じmockデータのみを使用でき、それぞれの
  • を使用できない.
    wiremock-pyは、wiremock-pyが異なるテストシーンパラメータを入力することによって異なるmockデータを生成するとともに、異なるテストシーンで使用されるmockデータを保存することができるという問題を解決することができる.mockデータを生成する場合、wiremock-pyはPythonとjsコードを使用してmockデータを動的に生成することをサポートする(jsonデータを直接使用することもサポートされているが、mockデータのデータ量が大きいと、人工手書きmockのデータ量が大きくなり、コード生成が容易になる).異なるテスト担当者がそれぞれのmock serverを使用しても、他のテスト担当者のテストには影響しません.
    テスト担当者が行う必要があるのは、どのAPIがmockを行う必要があるのか、および異なるテストシーンで対応するmockルールが何なのかを決定することです.
    依存環境
    Java 1.8.0_144
    Node v8.6.0
    Python 3.4.3
    デモ
    クイックスタート
    貿易数v 1で.1.0バージョンのテスト環境を例に、wiremock-pyを使用してフロアの客流分布と店舗の客流分布の2枚の図を3つのシーンに分布させるテスト方法を実証します.
    まず、ローカルブラウザが正常にアクセスできるかどうかを確認します.http://mall-data.com:9012
    の準備を
    クローンコード
    git clone http://git.dtwave-inc.com:30000/baomi.wbm/wiremock-py.git
    インストール依存
    cd wiremock-py
    pip install -r requirements.txt
    npm install mockjs
    ディレクトリの生成
    python mock.py -g "demo"
    ➜ wiremock-py git:(master)✗ python mock.py -g "demo"
    DEBUG:root:mockdir=, scene=, target=, proxy_port=5506, generate=demo, wiremock=False, rewrite=False
    DEBUG:root:ディレクトリ/Users/wangbaomi/autotest/wiremock-py/demoを生成中
    DEBUG:root:ディレクトリ作成成功:demo
    DEBUG:root:ディレクトリ作成成功:demo/js
    DEBUG:root:ディレクトリ作成成功:demo/json
    DEBUG:root:ディレクトリの作成に成功しました:demo/python
    DEBUG:root:ディレクトリ作成成功:demo/wiremock
    DEBUG:root:ファイルの作成に成功しました:demo/mappings.json
    DEBUG:root:ディレクトリ生成完了:/Users/wangbaomi/autotest/wiremock-py/demo
    記入json、json、python、jsデータ
    mappings.jsonに記入する内容:
    [
    {
    
        "response": {
    
            "default": {
    
                "proxyBaseUrl": "target"

    }
        },
    
        "mapping_name": "request url not start with /api",
    
        "request": {
    
            "method": "ANY",
    
            "urlPattern": "/(?!api).*"
    
        }
    
    },
    
    {
    
        "mapping_name": "      ",
    
        "request": {
    
            "urlPattern": "/api/v1/mall_data/customer_flow/every_floor\\?(.*)",
    
            "method": "POST"
    
        },
    
        "response": {
    
            "default": {
    
                "proxyBaseUrl": "target"
    
            },
    
            "    1": {
    
                "bodyFileName": {
    
                    "json": "      .json"
    
                }
    
            },
    
            "    2": {
    
                "bodyFileName": {
    
                    "python": "      .py",
    
                    "python_args": "    2"
    
                }
    
            },
    
            "    3": {
    
                "bodyFileName": {
    
                    "js": "      .js"
    
                }
    
            }
    
        }
    
    },
    
    {
    
        "mapping_name": "      ",
    
        "request": {
    
            "urlPattern": "/api/v1/mall_data/customer_flow/every_shop\\?(.*)",
    
            "method": "POST"
    
        },
    
        "response": {
    
            "default": {
    
                "proxyBaseUrl": "target"
    
            },
    
            "    1": {
    
                "bodyFileName": {
    
                    "js": "      .js"
    
                }
    
            },
    
            "    2": {
    
                "bodyFileName": {
    
                    "json": "      .json"
    
                }
    
            },
    
            "    3": {
    
                "bodyFileName": {
    
                    "python": "      .py",
    
                    "python_args": "    3"
    
                }
    
            }
    
        }
    
    }

    ]
    jsフォルダに新規店舗の客流分布を作成する.jsファイル、内容:
    var r = {
    "success": true,
    "code": null,
    "message": null,
    "content": {
    "meta": {},
    
    "multi": {
    
      "group": [
    
        {
    
          "id": "rank",
    
          "name": "  ",
    
          "value": [
    
            1,
    
            2,
    
            3,
    
            4
    
          ]
    
        }
    
      ],
    
      "result": [
    
        {
    
          "id": "the_shop",
    
          "name": "  ",
    
          "value": [
    
            "  1",
    
            "  2",
    
            "  3",
    
            " 4   "
    
          ]
    
        },
    
        {
    
          "id": "customer_count",
    
          "name": "  ",
    
          "value": [
    
            10,
    
            100,
    
            1000,
    
            3242
    
          ]
    
        }
    
      ]
    
    },
    
    "single": []
    }
    
    };
    
    console.log(JSON.stringify(r));

    jsフォルダに新しいフロアの客流分布を作成する.jsファイル、内容:
    var r = {
    
    "success": true,
    
    "code": null,
    
    "message": null,
    
    "content": {"meta": {},
    
    "multi": {
    
      "group": [
    
        {
    
          "id": "the_floor",
    
          "name": "  ",
    
          "value": [
    
            "-1 ",
    
            "1 ",
    
            "2 ",
    
            "3 ",
    
          ]
    
        }
    
      ],
    
      "result": [
    
        {
    
          "id": "customer_count",
    
          "name": "  ",
    
          "value": [
    
            100,
    
            1000,
    
            5000,
    
            567
    
          ]
    
        }
    
      ]
    
    },
    
    "single": []
    }
    
    };
    
    console.log(JSON.stringify(r));
    
    json             .json,    :
    
    {
    
    "success": true,
    
    "code": null,
    
    "message": null,
    
    "content": {
    "meta": {},
    "multi": {