1. はじめに
この記事では、単純なログイン インターフェイス テストから開始し、インターフェイス呼び出しの状態を段階的に調整および最適化します。
次に、インターフェイス テスト フレームワークの重要なポイントについて簡単に説明し、
最後に、現在使用しているインターフェイス テスト フレームワークである残念を紹介します。
この記事を通じて、読者がインターフェース自動化テストについて一般的に理解できることを願っています。
2. はじめに
なぜインターフェース自動化テストを行う必要があるのでしょうか?
インターネット製品が頻繁に反復されている現在の状況では、回帰テストにかかる時間はますます少なくなり、反復ごとにすべての機能の回帰を完了するのは困難です。
しかし、インターフェイスの自動テストは、実装が簡単で、メンテナンスコストが低く、カバレッジを容易に改善できるため、ますます注目を集めています。
なぜ自分でフレームワークを書くのでしょうか?
リクエスト + ユニットテストを使用して自動化されたインターフェイス テストを実装するのは簡単で、リクエスト API は非常にユーザーフレンドリーでシンプルです。
ただし、カプセル化 (特に社内の特定のインターフェイスの場合) といくつかの共通ツールのカプセル化を通じて、ビジネス スクリプト作成の効率をさらに向上させることができます。
3. 環境整備
このマシンに python2.7 以降がインストールされていることを確認してから、次のライブラリをインストールします。
pip install flask
pip install requests
後で、フラスコを使用してテスト用のインターフェイスを作成し、テストにリクエストを使用します。
现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:110685036
4. テストインターフェイスの準備
以下では、フラスコを使用して 2 つの http インターフェイスを実装します。1 つはログイン用で、もう 1 つは詳細のクエリ用ですが、ログイン後にのみ実行されます。 新しいdemo.py ファイルを作成し(Windows のメモ帳は使用しないでください)、次のコードをコピーします。それを保存して閉じます。
インターフェースコード
#!/usr/bin/python# coding=utf-8from flask import Flask, request, session, jsonify
USERNAME = 'admin'PASSWORD = '123456'app = Flask(__name__)
app.secret_key = 'pithy'@app.route('/login', methods=['GET', 'POST'])def login():
error = None
if request.method == 'POST': if request.form['username'] != USERNAME:
error = 'Invalid username'
elif request.form['password'] != PASSWORD:
error = 'Invalid password'
else:
session['logged_in'] = True
return jsonify({'code': 200, 'msg': 'success'}) return jsonify({'code': 401, 'msg': error}), [email protected]('/info', methods=['get'])def info():
if not session.get('logged_in'): return jsonify({'code': 401, 'msg': 'please login !!'}) return jsonify({'code': 200, 'msg': 'success', 'data': 'info'})if __name__ == '__main__':
app.run(debug=True)
最後に次のコマンドを実行します。
python demo.py
応答は次のとおりです。
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with sta
ご覧のとおり、サービスが開始されました。
インターフェース情報
ログインインターフェース
リクエストURL
/ログイン
リクエスト方法
役職
リクエストパラメータ
| パラメータ名 | パラメータのタイプ | パラメータの説明 |
| :————: | :——-: | :——: |
| ユーザー名 | 文字列 | ログイン名 |
| パスワード | 文字列 | ログインパスワード |
応答メッセージ
| パラメータ名 | パラメータのタイプ | パラメータの説明 |
| :————: | :——-: | :——: |
| コード | 整数 | 結果コード |
| msg | 文字列 | 結果情報 |
詳細インターフェース
リクエストURL
/情報
リクエスト方法
得る
クッキーをリクエストする
| パラメータ名 | パラメータのタイプ | パラメータの説明 |
| :————: | :——-: | :——: |
| セッション | 文字列 | セッション |
応答メッセージ
| パラメータ名 | パラメータのタイプ | パラメータの説明 |
| :————: | :——-: | :——: |
| コード | 整数 | 結果コード |
| msg | 文字列 | 結果情報 |
| データ | 文字列 | データ情報 |
5. インターフェーステストの作成
テストのアイデア
- リクエスト ライブラリを使用して、HTTP リクエストの送信をシミュレートします。
- Python 標準ライブラリの Unittest を使用してテスト ケースを作成します。
スクリプトの実装
#!/usr/bin/python# coding=utf-8import requestsimport unittestclass TestLogin(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.login_url = 'http://127.0.0.1:5000/login'
cls.info_url = 'http://127.0.0.1:5000/info'
cls.username = 'admin'
cls.password = '123456'
def test_login(self):
"""
测试登录
"""
data = { 'username': self.username, 'password': self.password
}
response = requests.post(self.login_url, data=data).json() assert response['code'] == 200
assert response['msg'] == 'success'
def test_info(self):
"""
测试info接口
"""
data = { 'username': self.username, 'password': self.password
}
response_cookies = requests.post(self.login_url, data=data).cookies
session = response_cookies.get('session') assert session
info_cookies = { 'session': session
}
response = requests.get(self.info_url, cookies=info_cookies).json() assert response['code'] == 200
assert response['msg'] == 'success'
assert response['data'] == 'info'
6. 最適化
カプセル化されたインターフェイス呼び出し
このテスト ログイン スクリプトを作成した後、プロジェクトのテスト プロセス全体でログインが複数回使用される可能性があることがわかります。毎回このように記述すると冗長すぎますか?
はい、確かに冗長すぎます。単純なカプセル化を実行して、ログイン インターフェイス呼び出しをメソッドにカプセル化し、呼び出しパラメーターを公開しましょう。サンプル スクリプトは次のとおりです。
#!/usr/bin/python# coding=utf-8import requestsimport unittesttry: from urlparse import urljoinexcept ImportError: from urllib.parse import urljoinclass DemoApi(object):
def __init__(self, base_url):
self.base_url = base_url def login(self, username, password):
"""
登录接口
:param username: 用户名
:param password: 密码
"""
url = urljoin(self.base_url, 'login')
data = { 'username': username, 'password': password
} return requests.post(url, data=data).json() def get_cookies(self, username, password):
"""
获取登录cookies
"""
url = urljoin(self.base_url, 'login')
data = { 'username': username, 'password': password
} return requests.post(url, data=data).cookies def info(self, cookies):
"""
详情接口
"""
url = urljoin(self.base_url, 'info') return requests.get(url, cookies=cookies).json()class TestLogin(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.base_url = 'http://127.0.0.1:5000'
cls.username = 'admin'
cls.password = '123456'
cls.app = DemoApi(cls.base_url) def test_login(self):
"""
测试登录
"""
response = self.app.login(self.username, self.password) assert response['code'] == 200
assert response['msg'] == 'success'
def test_info(self):
"""
测试获取详情信息
"""
cookies = self.app.get_cookies(self.username, self.password)
response = self.app.info(cookies) assert response['code'] == 200
assert response['msg'] == 'success'
assert response['data'] == 'info'
このバージョンでは、再利用を実現するためにログイン インターフェイス呼び出しをインスタンス メソッドにカプセル化するだけでなく、ホスト (self.base_url) も抽出します。
しかし、問題は再び発生し、ログイン後、ログイン インターフェイスの http 応答によってセッションが Cookie の形式でクライアントに設定され、後続のインターフェイスはこのセッションを使用してリクエストを行うことになります。
また、インターフェイスの呼び出し処理中に、エラーが発生したときにデバッグや表示のためにログを出力できることを願っています。
よし、別のバージョンもやってみよう。
Cookie を保持し、ログ情報を追加する
リクエスト ライブラリで同じ Session オブジェクトを使用すると (同じ Session インスタンスによって発行されたすべてのリクエスト間の Cookie も維持されます)、上記の問題を解決できます。サンプル コードは次のとおりです。
#!/usr/bin/python# coding=utf-8import unittestfrom pprint import pprintfrom requests.sessions import Sessiontry: from urlparse import urljoinexcept ImportError: from urllib.parse import urljoinclass DemoApi(object):
def __init__(self, base_url):
self.base_url = base_url # 创建session实例
self.session = Session() def login(self, username, password):
"""
登录接口
:param username: 用户名
:param password: 密码
"""
url = urljoin(self.base_url, 'login')
data = { 'username': username, 'password': password
}
response = self.session.post(url, data=data).json()
print('\n*****************************************')
print(u'\n1、请求url: \n%s' % url)
print(u'\n2、请求头信息:')
pprint(self.session.headers)
print(u'\n3、请求参数:')
pprint(data)
print(u'\n4、响应:')
pprint(response) return response def info(self):
"""
详情接口
"""
url = urljoin(self.base_url, 'info')
response = self.session.get(url).json()
print('\n*****************************************')
print(u'\n1、请求url: \n%s' % url)
print(u'\n2、请求头信息:')
pprint(self.session.headers)
print(u'\n3、请求cookies:')
pprint(dict(self.session.cookies))
print(u'\n4、响应:')
pprint(response) return responseclass TestLogin(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.base_url = 'http://127.0.0.1:5000'
cls.username = 'admin'
cls.password = '123456'
cls.app = DemoApi(cls.base_url) def test_login(self):
"""
测试登录
"""
response = self.app.login(self.username, self.password) assert response['code'] == 200
assert response['msg'] == 'success'
def test_info(self):
"""
测试获取详情信息
"""
self.app.login(self.username, self.password)
response = self.app.info() assert response['code'] == 200
assert response['msg'] == 'success'
assert response['data'] == 'info'
完了しました。複数の関連するインターフェイス呼び出しを 1 つのクラスにカプセル化し、同じリクエストのセッション インスタンスを使用して Cookie を保持し、呼び出し中にログを出力しました。すべての目標は達成されました。
でも改めてスクリプトを見ると違和感があり、それぞれのメソッドでprint 1、2、3…と書かなければいけない、URLを綴らなければいけない、など細かいことがたくさんあります。
しかし、実際には、私たちが本当にしなければならないのは、主要なパラメータ (URL パラメータ、本文パラメータ、または受信ヘッダ情報) を詳しく説明することです。必要な情報を定義し、その他の一般的なものをカプセル化して、それらを 1 つの Where to にまとめることはできますか?管理?
最後に、私の記事をよく読んでくださった皆様に感謝申し上げます。ファンの増加と注目度を見ると、常に一定の礼儀が存在します。それほど価値のあるものではありませんが、使用できる場合は直接受け取ることができます!
ソフトウェアテスト面接文書
私たちは高給の仕事を見つけるために勉強しなければなりません。以下の面接の質問は、アリババ、テンセント、バイトなどの一流インターネット企業の最新の面接資料からのものであり、バイトの上司の中には権威ある回答をしている人もいます。 set 面接情報に基づいて、誰もが満足のいく仕事を見つけることができると思います。