目次
序文:
HTTP インターフェイスをテストする場合、信頼できるテスト フレームワークを使用すると、テストの効率と品質を向上させることができます。HTTP インターフェイス テスト フレームワークは、HTTP インターフェイスの自動テストのためのツールまたはライブラリであり、HTTP リクエストの送信、応答結果の検証、アサーションとレポートの処理、およびその他のタスクのための一連の機能とメソッドを提供します。
実際の効果
- 1000 個のインターフェイスを検証するには平均 6 秒かかります (マシンの構成とネットワーク速度を参照)
- 初めて使用したとき、5 つのインターフェイス例外がすぐに検出され、検証プロセスにかかる時間は 30 秒未満でした。
フレームワークの次のステップ
-
現在、当社のすべてのアプリに対応しています
-
応答本文の完全なフィールド検証 (フィールド タイプを含む)
- すでにアイデアがある
-
フィールドの変更は 2 つの大きな問題を引き起こす
- 元の int (0/1) から Boolean へ
- タイムスタンプの長さが突然 10 ビットから 13 ビットに変更されました
-
外部ネットワーク データ/ユーザーに対する実行中のインターフェイスへの毎日の監視の影響を回避するように努めてください。
- 現在の実践では、関連するインターフェイスをブロックします。
- 現在の状態
- インターフェイスの実行時に作成されたデータ ID が変更されましたが、削除インターフェイスは依然として古い ID を呼び出して削除するため、データは削除されません
- 向上
- 作成されたデータのレスポンスボディをインターセプトし、IDを取得します。
- インターフェイスのリクエスト本文をインターセプトして削除し、前の手順でインターセプトした ID を渡します。
最新フレーム図(赤色部分は未完成)
コードの一部
設定ファイル
http接口测试框架配置信息
tester = tester
project = A
versionName = 2.2.2
versionCode = 237
host = a-webapi.test.b.com
getTokenHost = http://a-webapi.test.b.com/api/System/GetToken
loginHost = http://a-webapi.test.b.com/api/User/LoginV2
loginInfo = Phone=13750199962&Password=FGgIwe5oCdk%3D
SessionsPath = D:\Fiddler Sessions
ApiURL = http://apihelper.b.com/Home/API/c
# SpecialSessions >> 屏蔽的接口
SpecialSessions = ['GetToken', 'LoginV2', 'LogOut', 'BookingV2']
テストエントリーを開始する
"""
运行api测试总入口
"""
import sessions.Request
def launcher_api_test():
"""
1.获取接口列表
2.与本地sessions对比
3.差异化文件,是否继续
3.1否 继续录制接口
3.2是 开始跑接口
:return:
"""
r = sessions.Request.Request(0) # 0 >> A 1 >> B
r.start()
if __name__ == "__main__":
launcher_api_test()
ヘッダー、ログインインターフェイス
def __get_token_header(self):
"""
生成token头部
:return:
"""
des = self.__get_token_des()
arr = (des, self.conf['systemType'], self.conf['Model'], self.conf['Release'], self.conf['DeviceId'],
self.conf['versionCode'], self.conf['versionName'], self.conf['AppBuild'], self.conf['DeviceOS'], "0")
authorization = self.AUTHORIZATION_TOKEN % arr
headers = {'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', 'Authorization': authorization}
response = self.session.post(self.conf['getTokenHost'], headers=headers)
if json.loads(response.text)['StatsCode'] == 200:
data1 = json.loads(response.text)['Data']
self.time = data1['Time']
self.TOKEN_NAME = data1['TokenName']
self.TOKEN_VALUE = data1['TokenValue']
else:
print("GetToken失败,请手动检查")
utils.HandleJson.HandleJson.print_json(response.text)
def __login_session(self):
"""
调用登录接口,这样后面的接口都能正常访问了
:return:
"""
url_login = self.conf['loginHost']
headers = self.__get_session_header(url_login.split('api/')[-1])
data_login = r'%s' % self.conf['loginInfo']
response = self.session.post(url_login, headers=headers, data=data_login)
if json.loads(response.text)['StatsCode'] == 200:
data1 = json.loads(response.text)['Data']
self.uId = data1[self.head_uid]
self.uName = data1['NickName']
self.uPhone = data1['Phone']
self.SessionId = data1['Sid']
self.uType = data1['UserType']
self.uuid = data1['UID']
else:
print("登录失败,请手动检查")
utils.HandleJson.HandleJson.print_json(response.text)
インターフェースフラグメント
Request url: a-webapi.test.b.com/api/Circle/AddCancelCollectCircle
Request header: POST /api/Circle/AddCancelCollectCircle HTTP/1.1
Host: a-webapi.test.b.com
Accept: text/json
Authorization: Digest t="2016-08-04 16:41:19",SystemType="2",u="Circle/AddCancelCollectCircle",r="59e93eb1a6625adc6bff5ede5945a2f7",DeviceId="ffffffff-8416-49fe-3fdc-6ee400000000",Model="SM-N9100",DeviceOS="22",Release="5.1.1",VersionName="2.2.2",VersionCode="239",PushToken="",uId="3353",uName="123456ejz",uPhone="13750199962",SessionId="%2FZhckUf9%2Fd2soQZhYofjN021SdWUpLv0aW%2F3CJBr71vtOl1YHJda6J8p6P1hsQS0P3kqirm%2BtPs%3D",uType="1",bDChannelId="",bDUserId="",AppBuild="239",uUID="2255"
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Content-Length: 21
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.0.1
Request body: CircleId=6418&IsAdd=1
Response code: 200
Response body: {"StatsCode":200,"Message":"收藏成功","Data":null,"Other":null}
Session end
Request url: a-webapi.test.b.com/api/Circle/AddCancelCollectCircle
Request header: POST /api/Circle/AddCancelCollectCircle HTTP/1.1
Host: a-webapi.test.b.com
Accept: text/json
Authorization: Digest t="2016-08-04 16:41:22",SystemType="2",u="Circle/AddCancelCollectCircle",r="26dcb55ee9ac79995c21656517c455e8",DeviceId="ffffffff-8416-49fe-3fdc-6ee400000000",Model="SM-N9100",DeviceOS="22",Release="5.1.1",VersionName="2.2.2",VersionCode="239",PushToken="",uId="3353",uName="123456ejz",uPhone="13750199962",SessionId="%2FZhckUf9%2Fd2soQZhYofjN021SdWUpLv0aW%2F3CJBr71vtOl1YHJda6J8p6P1hsQS0P3kqirm%2BtPs%3D",uType="1",bDChannelId="",bDUserId="",AppBuild="239",uUID="2255"
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Content-Length: 21
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.0.1
Request body: CircleId=6418&IsAdd=0
Response code: 200
Response body: {"StatsCode":200,"Message":"取消收藏成功","Data":null,"Other":null}
Session end
インターフェースリスト
するべきこと
-
環境構成
- Python 3.x
- フィドラー (携帯電話のリクエストをキャプチャするように構成)
- PyCharm
-
トークン/セッションの置き換え
- プロジェクトなどに対応するトークンに置き換えてください。
- 設定ファイルを変更する
- レスポンスボディのJSON判定ロジックを変更
-
fiddler-js を置き換える
- プロジェクトのルート ディレクトリにある fiddler js のファイル コンテンツ全体が fiddler の js を置き換えます。
- フィドラーのルールのカスタマイズ機能を開く
- すべてのコンテンツを削除し、すべての fiddler js コンテンツをそこにコピーします
- インターセプトしたホストおよびその他の情報を変更する
- フィドラーの保存
リクエスト
fiddler js のカスタム情報
//自定义参数设置
public static var filterUrl = "a-webapi.test.b.com";
public static var filePath = "D:\\Fiddler Sessions\\Api\\";
public static var filePathForRequested = "D:\\Fiddler Sessions\\Requested.txt";
public static var filePathForErrorResponse = "D:\\Fiddler Sessions\\ErrorResponse.txt";
public static var filePathForVerifyRequset = "D:\\Fiddler Sessions\\VerifyRequset.txt";
public static var filePathForRemoveSession = "D:\\Fiddler Sessions\\RemoveSession.txt";
public static var filePathForAddSession = "D:\\Fiddler Sessions\\AddSession.txt";
ここに来た者として、皆さんも寄り道は避けていただきたいと思います。
ここでは、自動テストを進める上で必要なことをいくつか共有し、お役に立てれば幸いです。
(ソフトウェアテスト関連資料、自動テスト関連資料、技術的なQ&Aなど)
そうすることでより良い進歩が見込めると信じています!
下の小さなカードをクリックしてください