目次: はじめに
序文
パラメータの関連付けとは何ですか?
パラメータの関連付けは、インターフェイスの関連付けとも呼ばれ、インターフェイス間にパラメータの接続または依存関係があることを意味します。ある機能的な業務を遂行する際、複数のインターフェースを順番に要求する必要がある場合があり、この場合、いくつかのインターフェース間に関連性が存在することがあります。
例: インターフェイス B の 1 つまたはいくつかのリクエスト パラメータは、インターフェイス A を呼び出すことによって取得されます。つまり、最初にインターフェイス A をリクエストし、インターフェイス A の戻りデータから必要なフィールド値を取得し、それらをリクエスト パラメータとして渡す必要があります。インターフェイス B を要求する場合は、入力します。
パラメーターの関連付けにはどのようなシナリオがありますか?
最も一般的なシナリオ: ログイン インターフェイスをリクエストした後、トークン値が取得されます。その後、他のインターフェイスにリクエストを行うときは、トークンをリクエスト パラメーターとして渡す必要があります。
もう 1 つの例は、注文 -> 支払いのシナリオです。注文インターフェイスを呼び出して注文を生成した後、注文番号が返され、その注文番号は支払いのために支払いインターフェイスに渡されます。
1.パラメータ関連付けシナリオ
最も一般的なオンライン ショッピングを例に挙げると、対応するシナリオとリクエストは次のように大まかに単純化できます (特定の製品のショッピング プロセスを考えることができます)。
ユーザーはショッピング カートで商品を選択し、[チェックアウトに進む] をクリックして注文確認ページに入ります。注文確認ページで [注文を送信] をクリックすると、まず注文インターフェイスに注文を作成するよう要求されます。
次に、作成された注文を使用して支払い伝票インターフェイスが要求され、このインターフェイスにより、パスワードを入力するための支払いインターフェイスである支払いページが呼び出されます。
決済パスワードを入力すると、決済サービスの決済インターフェースに実際の決済が要求され、決済が成功したかどうかを示す決済結果が要求者に返されます。
このプロセスに関係するインターフェイスは実際には関連しているため、プロセス全体をテストしたい場合は、関係するすべてのインターフェイスを順番に呼び出す必要があります。
ただし、ここではパラメーターの関連付けのみを理解する必要があるため、注文インターフェイスと支払い伝票取得インターフェイスを例として取り上げるだけで十分です。つまり、最初に注文インターフェイスに注文番号の生成をリクエストし、次にこの注文番号を使用してリクエストを実行します。支払い伝票インターフェイスを使用して初めて、支払いインターフェイスを表示して支払いを行うことができます。
注文インターフェイスは次のとおりです。
インターフェイスアドレス: <サーバー>/trade/order/purchase
リクエストタイプ: post
リクエストパラメータ:
{
"goodsId": 10, //商品id
"goodsSkuId": 33, //sku id
"num": 2, //购买数量
"tradePromotion": {
//选择的优惠项
"type": 1, //类型<1:优惠券>
"promotionId": 1 //优惠id
}
}
戻り値データ:
{
"code": 0,
"msg": "成功",
"data": {
"tradeNo": "0020220116204344962706666" //交易订单号
},
"t": 1639658625474
}
支払い伝票を取得するためのインターフェイスは次のとおりです。
インターフェイスアドレス: <server>/pay/pre/consum
リクエストタイプ: post
リクエストパラメータ:
{
"orderNo":"0020220116204344962706666", //交易订单号
"product":"alipayWapClient" //支付渠道<alipayWapClient:支付宝手机网页支付>
}
戻り値データ:
{
"code": 0,
"msg": "成功",
"data": {
"payNo":"123213213219379213",
"certificate": "<form name=\"punchout_form\xxxxxxx >\n</form>\n<script>document.forms[0].submit();</script>"
},
"t": 1639659171031
}
orderNo フィールドは 2 つのインターフェイスを関連付けます。生成される注文番号は毎回異なるため、このシナリオをテストするときは、2 つのインターフェイスのパラメーターを関連付けて機能させる必要があります。
2. スクリプトの作成
では、pytest フレームワークの自動テストではパラメーターの関連付けをどのように処理できるのでしょうか? ここでは、次の 2 つのアイデアが提供されます。
ビジネスシナリオの呼び出し順序に従い、ユースケース内で順番にインターフェースを呼び出し、
依存するインターフェースをフィクスチャ関数として記述し、yieldを使用して次のインターフェースに必要なパラメータを返します。
1) ユースケースで順番に呼び出します。
コード例は次のとおりです。
import requests
import json
import pytest
def test_order_pay():
'''
创建订单->获取支付凭证,调起支付界面
:return:
'''
# 先调用下单接口生成订单
url_order = "https://gouwu.com/trade/order/purchase"
data_order = {
"goodsId": 10,
"goodsSkuId": 33,
"num": 2,
"tradePromotion": {
"type": 1,
"promotionId": 1
},
"tradeDirectionArticle": {
"articleId": 1
}
}
res_order = requests.post(url=url_order, json=data_order).text
tradeNo = json.loads(res_order)["tradeNo"]
# 再请求获取支付凭证接口
url_pay = "https://gouwu.com/pay/pre/consum"
data_pay = {
"orderNo": tradeNo, # tradeNo通过下单接口获取
"product": "alipayWapClient"
}
res_pay = requests.post(url=url_pay, json=data_pay).text
res_pay = json.loads(res_pay)
# 断言
assert res_pay["code"]==0
assert res_pay["data"]["payNo"]
assert res_pay["data"]["certificate"]
if __name__ == '__main__':
pytest.main()
上記のコードは、単なる合理化された呼び出しです。各インターフェイス リクエストを個別の関数にカプセル化することもできます。テスト ケースでは、これらの関数を順番に呼び出すだけで済みます。これについては、次の記事で説明します。
2) pytest で Fixture 関数を使用するには
、以前の記事 pytest-Fixture (ファームウェア) を参照してください。
フィクスチャ関数を定義します。コード例は次のとおりです。
@pytest.fixture()
def get_order():
'''
请求下单接口,创建订单
:return:
'''
url_order = "https://gouwu.com/trade/order/purchase"
data_order = {
"goodsId": 10,
"goodsSkuId": 33,
"num": 2,
"tradePromotion": {
"type": 1,
"promotionId": 1
},
"tradeDirectionArticle": {
"articleId": 1
}
}
res_order = requests.post(url=url_order, json=data_order).text
tradeNo = json.loads(res_order)["tradeNo"]
yield tradeNo
テスト関数で上で定義したフィクスチャ関数を呼び出します。コード例は次のとおりです。
def test_pay(get_order):
'''
下单->支付场景校验
:param get_order: 调用上面的Fixture函数,函数名get_order即返回的tradeNo
:return:
'''
url_pay = "https://gouwu.com/pay/pre/consum"
data_pay = {
"orderNo": get_order, # get_order即为上面定义的fixture函数返回值
"product": "alipayWapClient"
}
res_pay = requests.post(url=url_pay, json=data_pay).text
res_pay = json.loads(res_pay)
# 断言
assert res_pay["code"] == 0
assert res_pay["data"]["payNo"]
assert res_pay["data"]["certificate"]
以下は、私がまとめた 2023 年の最も包括的なソフトウェア テスト エンジニア学習ナレッジ アーキテクチャ システム図です。 |
1. Python プログラミングの入門から習熟まで
2. インターフェース自動化プロジェクトの実践
3. Web自動化プロジェクトの実戦
4. アプリ自動化プロジェクトの実践
5. 一流メーカーの履歴書
6. DevOps システムのテストと開発
7. 一般的に使用される自動テストツール
8. JMeter パフォーマンス テスト
9. まとめ(最後にちょっとしたサプライズ)
時間はあっという間に過ぎ、チャンスはあっという間に過ぎてしまいます。あらゆる貴重な瞬間を捉え、汗で夢の花に水をやりましょう。努力を続け、卓越性を追求してください。一生懸命働くことによってのみ、人生の輝かしい旅を始めることができます。自分を信じて前に進んでいきましょう!
人生は課題と不確実性に満ちていますが、確固たる信念と不断の努力が成功を勝ち取ります。自分を信じて勇敢に進み、自分の無限の可能性を追求してください!
闘争は人生のメロディーであり、粘り強さは成功のパスワードです。どんなに困難に遭遇しても、夢の炎を燃やし続け、勇敢に前進して、あなた自身の輝かしい章を切り開いてください!自分を信じれば何でもできる!