目次
前回の研究の後、インターフェース自動化ユースケースを書くという考え方を明確にするために、pytest フレームワークを使用してインターフェース自動化テストケースを作成しようとしました。
Baidu で天気に関するクエリを検索すると、次の図に示す結果が表示されます。
次に、天気クエリ インターフェイスを例として、インターフェイス テスト ケース スクリプトを作成します。
1. テストオブジェクトを定義する
特定の関数のインターフェイス テストを行うには、まず、この関数を実装するためにどのインターフェイスが呼び出されるかを決定する必要があります。このインターフェイスの特定の情報 (関数、プロトコル、URL、リクエスト メソッド、リクエスト パラメータの説明、レスポンス パラメータの説明、開発によって提供されるインターフェイス ドキュメントは、パケット キャプチャを通じて取得することもできます (インターフェイス ドキュメントがない場合)。対応するインターフェイス、つまりテスト オブジェクトを見つけたら、次のステップを意図的に実行できます。
1. 明らかに、ここにはインターフェイス関連の情報を提供するインターフェイス ドキュメントはなく、リクエスト URL さえわからないため、最初に Fiddler でパケットをキャプチャしてインターフェイス情報を取得します。
パケット キャプチャを通じて、次のようにこのインターフェイスの情報をキャプチャしました。
リクエストURL: https://weathernew.pae.baidu.com/weathernew/pc
リクエストメソッド:GET
リクエストパラメータ:
2. 上記のインターフェイス情報を取得したら、まず次のようにインターフェイスを要求する簡単なスクリプトを作成します。
url = "https://weathernew.pae.baidu.com/weathernew/pc"
params = {
"query": "浙江杭州天气",
"srcid": 4982
}
res = requests.get(url=url, params=params)
print(res.status_code)
print(res.text)
コードを実行すると、インターフェイスのデバッグが完了し、次のように結果を取得できます。
3. 要件を明確にし、ユースケースを決定します。
インターフェースの自動テストを行う場合、ユースケースで検証する必要があるテストポイントを明確にする必要があります。一部のインターフェイスでは前方検証と異常検証の両方を実行する必要がありますが、一部のインターフェイスでは自動化中に例外検証を行わずに前方検証のみを実行する必要がある場合があります。
例の天気クエリ インターフェイスを分析しましょう。主なテスト ポイントは 2 つあります。
- リクエストの転送: 既存の都市を入力し、対応する都市の天気を検索します。
- 異常なリクエスト: 存在しない都市を入力するとエラーが表示されます
次に、テスト ケースを作成します。
テスト ケースを作成するときは、コードをカプセル化する必要があります。コードは、テスト クラス/メソッドおよびテスト関数にカプセル化できます。pytestのユースケースカプセル化の命名方法には要件があり、詳しくは以前の記事pytestテストの命名規則を参照してください。
クラスや関数へのカプセル化については特に規定はなく、一般に同じシーンや同じテストポイントに関連するインタフェースをクラスとして定義することができます。
同時に、ユースケースでは、返されたコンテンツが予期したコンテンツであるかどうかを検証するためのアサーションを設定する必要もあります。テスト ケースはアサートする必要があります。そうでない場合は意味がありません。
リクエストデータを構築する
転送リクエストのデータは次のとおりです。
params = {
"query": "浙江杭州天气",
"srcid": 4982
}
異常なリクエストの場合、データは次のとおりです。
params = {
"query": "微信公众号:测试上分之路",
"srcid": 4982
}
上のスクリーンショットに示すように、上記のインターフェイスをデバッグしてリクエストしたときに、転送リクエストの結果をすでに取得しています。
その後のアサーションの設定に備えて、異常なリクエストの結果を見てみましょう。結果は次のとおりです。
異常なリクエストを送信した後、返されるコードも 200 であり、その結果は都市がまだオープンされておらず、転送リクエストに window.tplData コンテンツが存在しないことを示します。
パッケージテストコード
同じインターフェイスの 2 つの異なるテスト ケースを次に示します。このインターフェイスをテストするためのテスト クラスを直接カプセル化します。サンプルコードは次のとおりです。
class TestWeather:
'''
校验百度天气查询接口:https://weathernew.pae.baidu.com/weathernew/pc
'''
def test_get_weather_normal(self):
'''正向校验-查询存在的城市的天气'''
url = "https://weathernew.pae.baidu.com/weathernew/pc"
params = {
"query": "浙江杭州天气",
"srcid": 4982
}
res = requests.get(url=url, params=params)
def test_get_weather_error(self):
'''异常校验-查询不存在的城市的天气'''
url = "https://weathernew.pae.baidu.com/weathernew/pc"
params = {
"query": "微信公众号:测试上分之路",
"srcid": 4982
}
res = requests.get(url=url, params=params)
コードにはアサーションがなく、完全なユースケースではないことに注意してください。ここでは、プロセスを説明するためにアサーションを次のステップに置き、分析後にアサーションを書きます。
アサーション設定
アサーション、つまり検証結果が期待どおりであるかどうか。pytest がアサートする方法については、記事 pytest-assertion を参照してください。
アサーションを設定するときは、最初にチェックするフィールドを指定する必要があります。一般に、インターフェイス応答のコードをアサートする必要があり、status_code == 200 はインターフェイス要求が渡されたことを示します。次に、他の必要なフィールドをアサートして、インターフェイス機能が実現されているかどうかを確認します。
上記の結果から、転送リクエストは次のアサーションを行うことができることがわかります。
# 断言code是否等于200,存在则该断言通过
assert res.status_code == 200
# 断言结果中是否存在"window.tplData",存在则该断言通过
assert "window.tplData" in res.text
上記の結果から、異常なリクエストは次のアサーションを行う可能性があることがわかります。
# 断言code是否等于200,存在则该断言通过
assert res.status_code == 200
# 断言结果中是否存在"window.tplData",注意这里是不存在则该断言通过
assert "window.tplData" not in res.text
# 断言结果中是否存在"暂未开通此城市查询",存在则该断言通过
assert "暂未开通此城市查询" in res.text
3. スクリプトを実行してテスト結果を取得します。
pytest フレームワークを使用してユース ケースを管理および実行する場合は、最初に pytest をインストールし、モジュールにインポートする必要があります。よくわからない学生は、私の pytest シリーズの記事を確認してください。ここではあまり説明しません。
完全なサンプルコードは次のとおりです。
# @time: 2022-03-20
# @author: 给你一页白纸
# 微信公众号:测试上分之路
import requests
import pytest
class TestWeather:
'''
校验百度天气查询接口:https://weathernew.pae.baidu.com/weathernew/pc
'''
def test_get_weather_normal(self):
'''正向校验-查询存在的城市的天气'''
url = "https://weathernew.pae.baidu.com/weathernew/pc"
params = {
"query": "浙江杭州天气",
"srcid": 4982
}
res = requests.get(url=url, params=params)
# print(res.status_code)
# print(res.text)
assert res.status_code == 200
assert "window.tplData" in res.text
def test_get_weather_error(self):
'''异常校验-查询不存在的城市的天气'''
url = "https://weathernew.pae.baidu.com/weathernew/pc"
params = {
"query": "微信公众号:测试上分之路",
"srcid": 4982
}
res = requests.get(url=url, params=params)
print(res.status_code)
print(res.text)
assert res.status_code == 200
assert "window.tplData" not in res.text
assert "暂未开通此城市查询" in res.text
if __name__ == '__main__':
# 使用pytest执行用例
pytest.main()
もちろん、URL はここで共有されているため、次の図に示すように、テスト メソッドごとにこの変数を 1 回定義するのではなく、URL を抽出する方がよいでしょう。
実行結果は以下の通りです。
4、まとめ
単一のインターフェイス自動化テスト ケースの場合、上記の手順に従うことができます。つまり、テスト オブジェクトを指定します --> テスト ケースを作成します --> テスト スクリプトを作成します --> スクリプトを実行してテスト結果を取得します。これらの手順を通じて、自動化されたユースケースを作成するための基本的なアイデアが得られ (これは自動化されたテストの考え方を形成するために非常に重要です)、その後の学習と実践の基礎を築きます。
実際、プログラミング言語を使用してプロジェクトのテストを自動化する場合、テスト ケースが 1 つだけであることはほとんど不可能です。そのため、複数のテストがある場合に、ユース ケースをどのように管理し、実行し、テスト結果を取得するかが重要になります。場合?これは、単体テスト フレームワークが解決する必要がある問題です。