目次
序文
python+pytest インターフェイス自動化シリーズでは、これまでの記事では基本的にコードをカプセル化していませんでしたが、実際に自動テスト スクリプトを作成する場合は、テスト フレームワークで認識して実行できるようにテスト コードをカプセル化する必要があります。
たとえば、単一インターフェイスのリクエスト コードは次のとおりです。
import requests
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36"
}
url = "https://www.cnblogs.com/lfr0123/"
res = requests.get(url=h_url, headers=headers)
テスト フレームワークで実行できるテスト ケースに上記のコードを記述する必要があるとします。このようにコードを記述するだけでは明らかに十分ではなく、次の追加が必要です。
- コードは、単体テスト フレームワーク (pytest または Unittest) が認識できるテスト関数またはテスト クラスにカプセル化する必要があります。そうしないと、コードは認識され実行されません。
- 単体テストフレームワークがユースケースの実行結果が合格したかどうかを判定できるように、アサーション、つまり結果と期待値の比較を追加する必要があります。結果 == 期待値であれば合格を意味します。それ以外の場合は失敗します。
Python での関数とクラスのカプセル化については、ここでは説明しません。pytest アサーションについては、記事 pytest(5)-assertions を参照してください。この記事の目的は、インターフェイス自動テストでテスト コードをカプセル化する方法を誰もが理解できるようにすることです。
テストケースのカプセル化に関する一般規則
テストケースのカプセル化には、テスト関数とテストクラスの 2 種類があり、カプセル化の一般的な規則は次のとおりです。
- テスト関数はテスト ケースに対応します。
- テストクラスには複数のテストメソッドを定義でき、1つのテストメソッドは1つのテストケースに対応し、テストクラスはテストケースの集合とみなすことができます。
- pytest のテスト関数またはテスト メソッドの名前は test で始まる必要があり、テスト クラス名は Test で始まる必要があります。特定の命名規則については、以前の記事「pytest(3)-test 命名規則」を参照してください。
- 単一インターフェイスのテスト検証の場合、単一インターフェイスのテスト ケースにはインターフェイス要求が 1 つだけ含まれます。つまり、インターフェイス要求はテスト関数またはテスト メソッドにカプセル化されます。
- シナリオ (複数のインターフェイス) のテスト検証の場合、シナリオ テスト ケースは複数のインターフェイスを要求する必要があるため、複数のインターフェイスの要求を同じテスト関数またはメソッドにカプセル化する必要があります。
- 一般に、インターフェイスの肯定的な検証と異常な検証は、異なるメソッドにカプセル化され、同じテスト クラスにカプセル化されます。たとえば、ログイン テスト クラスを定義すると、正しいユーザー名とパスワードの要求は 1 つのメソッド (つまり、テスト ケース) にカプセル化され、正しいユーザー名と間違ったパスワードの要求は別のメソッド (つまり、別のテストケース)。
- 同じテスト クラス内の関数に関連付けられた関数ポイントまたはインターフェイス ケースをカプセル化することもできます。たとえば、パーソナル センターに関与するインターフェイスを同じテスト クラスにカプセル化できます。
テスト関数のカプセル化
一般に、テスト機能はユースケースに対応します。上記のコードはテスト ケースとして記述されており、例は次のとおりです。
pytest のテスト関数の名前は、test_get_home のように test で始まる必要があることに注意してください。
テストクラス/メソッドのカプセル化
テスト クラスはテスト ケース セットに相当し、クラス内の各メソッドはテスト ケースに対応します。ログイン インターフェイスを例として、それをテスト クラスにカプセル化します。例は次のとおりです。
pytest のテスト クラスの名前は、TestLogin のように Test で始まる必要があり、テスト クラスに init メソッドを含めることはできないことを強調します。テスト クラスのテスト メソッドは、test_login_normal など、test で始まる必要があります。
サンプルコード
pytest では、コマンド ラインを使用するか、コード メソッド、つまり pytest.main() を使用してユース ケースを実行できます。詳細については、記事「pytest(1) - 概要」を参照してください。
完全なサンプルコードは次のとおりです。
# @time: 2022-03-24
# @author: 给你一页白纸
# 微信公众号:测试上分之路
import requests
import pytest
import json
def test_get_home():
'''
请求首页接口
:return:
'''
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36"
}
url = "https://www.cnblogs.com/lfr0123/"
res = requests.get(url=url, headers=headers)
# 断言,判断返回结果的code是否等于200,当然实际接口测试中一般返回结果中还会有别的字段需要断言
assert res.status_code == 200
class TestLogin:
'''
登录接口校验
'''
url = "http://127.0.0.1:5000/login"
headers = {"Content-Type": "application/json;charset=utf8"}
def test_login_normal(self):
'''正确用户名、正确密码登录'''
data = {
"username": "AndyLiu",
"password": "123456"
}
res = requests.post(url=self.url, json=data, headers=self.headers)
# 断言
assert res.status_code == 200
assert json.loads(res.text)["token"]
def test_login_error(self):
'''正确用户名、错误密码登录'''
data = {
"username": "AndyLiu",
"password": "111111"
}
res = requests.post(url=self.url, json=data, headers=self.headers)
# 断言
assert res.status_code == 200
assert not json.loads(res.text)["token"]
if __name__ == '__main__':
pytest.main()
要約する
- テスト関数、テスト クラス/テスト メソッドのカプセル化は、実際、単体テスト フレームワークが何であっても、同じ方法に従います。
- それぞれには、命名方法に関して独自の要件があり、たとえば、pytest と Unittest のテスト命名方法には特定の違いがあります。
- 独自のアサーションを持つ関数またはメソッドをテスト ケースとして考えると、テスト クラスは実際には 1 つ以上のテスト ケースを含むテスト ケース セットであり、クラス内の各メソッドはテスト ケースに対応します。
- どのテストメソッドをテストクラスに入れるか、つまりどのテストケースをテストケースセットに含めるかは、プロジェクトの状況やテスタ自身の考えに応じて決めることができますが、主な目的は明確にすることです。