tep は、pytest テスト フレームワークに基づいてサードパーティのパッケージを統合し、プロジェクトの足場を提供し、Python コードを記述することで自動化されたプロジェクトの実装を迅速に実現するのに役立つテスト ツールです。
tep プロジェクトでは自動テストケースはtests
ディレクトリに配置されており、各.py
ファイルは依存関係なく独立しており、1 ファイルが 1 つのテストケースとして分離されています。
ユースケース同士で相互に参照することもできますが、よほどのことがない限り、全体につながり、後々のメンテナンスが困難になるため、基本的には推奨しません。
ユースケースのコード記述は従来のpytest/unittest/scriptの記述方法と同様に上から下に記述するため、学習コストはかからず、一般的には問題ありません。コストの問題は環境変数とフィクスチャである可能性があります。tep はカプセル化され、依存関係注入の共有方法を提供するためです。また、フィクスチャは pytest が理解するのが難しい知識ポイントであるため、tep 環境変数とフィクスチャについて説明する必要があります。この記事では、3 つのユースケースの関係を理解するのに役立ち、pytest 自動化プロジェクトを tep の助けを借りてより柔軟かつスムーズに実現できます。
環境変数とフィクスチャを使用しない場合
環境変数やフィクスチャを使用しない場合でも、それは完全に可能です。たとえば、tests
次の場所にlogin_test.py
。
from tep.client import request
def test():
response = request("post",
url="https://qa.com/api/users/login",
headers={"Content-Type": "application/json"},
json={
"username": "admin",
"password": "123456",
}
)
assert response.status_code < 400
要求インターフェイスは、https://qa.com/api/users/login
応答ステータス コードが 400 未満であることをアサートします。ここで問題が発生します。url
修正されました。2つの環境qa
間で切り替える必要がある場合はrelease
どうすればよいですか?
パラメータ化する
自動テストを行っている場合でも、パフォーマンス テストを行っている場合でも、パラメータ化という言葉に触れることがあります。コード内で固定データ(ハードコーディング)を変数として定義し、実行するたびにデータが異なり、固定データが動的データになることを指します。動的データのソースは、変数、データベース、外部ファイルなどです。動的データのタイプは通常、定数文字列、または JMeter の関数アシスタントなどの関数、または pytest のフィクスチャなどの依存関係注入です。
依存関係が注入されたフィクスチャ
「依存性注入は制御の反転 (IoC、制御の反転) の技術形式です。」この文は Wikipedia から引用したものですが、意味がわかりません。簡単に表現するために絵を描きます。
client
与えれinjector
ばclient
何もせずに使えるということですservice
。
pytest のフィクスチャは依存関係の注入を実装しているため、テスト コードを変更せずに追加のものを追加するフィクスチャを導入できます。
たとえばurl
、ドメイン名はパラメータ化する必要があり、ドメイン名は環境によって異なるため、 tep はそれをフィクスチャにし、関数パラメータを通じて導入します。
from tep.client import request
from tep.fixture import *
def test(url): # 引入fixture
response = request("post",
url=url("/api/users/login"),
headers={"Content-Type": "application/json"},
json={
"username": "admin",
"password": "123456",
}
)
assert response.status_code < 400
tep.fixture.url
次のように定義されます。
@pytest.fixture(scope="session")
def url(env_vars):
def domain_and_uri(uri):
if not uri.startswith("/"):
uri = "/" + uri
return env_vars.domain + uri
return domain_and_uri
一目で理解できればおめでとうございます。一目で混乱していても問題ありません。非常に重要なことなので、時間をかけてわかりやすく説明します。
フィクスチャを変数として扱う
定義上、フィクスチャはdef
キーワードで定義された関数ですが、変数として理解することもできます。例えば:
import pytest
@pytest.fixture
def name():
return "dongfanger"
一般的な関数の使用法は、関数名に括弧を追加し、それを渡してname()
取得します"dongfanger"
。フィクスチャが異なります。上記の定義は次のように理解できます。
name = "dongfanger"
"dongfanger"
値を に代入しますname
(フィクスチャ名 = 戻り値)。変数を通じてname
取得します"dongfanger"
。
変数なので、任意の値、str
、function
、class
、object
any を割り当てることができます。たとえば、フィクスチャ内で関数を定義します。
import pytest
@pytest.fixture
def who():
def get_name():
return "dongfanger"
return get_name
これは、関数名をget_name
フィクスチャ名変数に割り当てるものとして理解されます。
who = get_name
get_name
関数名です。get_name()
取得するには括弧を追加する必要があります"dongfanger"
。それを入手するにはwho
パスも必要です。もっと明確かどうか見てみましょう:who()
"dongfanger"
tep.fixture.url
@pytest.fixture(scope="session")
def url(env_vars):
def domain_and_uri(uri):
if not uri.startswith("/"):
uri = "/" + uri
return env_vars.domain + uri
return domain_and_uri
これは、関数名をdomain_and_uri
フィクスチャ名変数に割り当てるものとして理解されます。
url = domain_and_uri
使用する場合は、url("/api")
ドメイン名とURIを結合した結果を取得します。
2行目def url(env_vars):
にもパラメータがありenv_vars
、説明が続きます。
フィクスチャパラメータは別のフィクスチャです
フィクスチャのパラメータは他のフィクスチャのみにすることができます。例えば:
import pytest
@pytest.fixture
def chinese_name():
return "东方er"
@pytest.fixture
def english_name(chinese_name):
return "dongfanger"
を呼び出すとenglish_name
、pytest は最初にパラメータ内の他のフィクスチャを実行しchinese_name
、次にそれ自体を実行しますenglish_name
。
2 つのステップに分けて見てみるとtep.fixture.url
、非常に明確になります。
@pytest.fixture(scope="session")
def url(env_vars):
func = None
return func
ステップ2:
@pytest.fixture(scope="session")
def url(env_vars):
func = None
def domain_and_uri(uri):
if not uri.startswith("/"):
uri = "/" + uri
return env_vars.domain + uri
func = domain_and_uri
return func
環境変数
tep.fixture.url
パラメーターは別のフィクスチャenv_vars
環境変数であり、次のように定義されます。
from tep.fixture import *
@pytest.fixture(scope="session")
def env_vars(config):
class Clazz(TepVars):
env = config["env"]
"""Variables define start"""
# Environment and variables
mapping = {
"qa": {
"domain": "https://qa.com",
},
"release": {
"domain": "https://release.com",
}
# Add your environment and variables
}
# Define properties for auto display
domain = mapping[env]["domain"]
"""Variables define end"""
return Clazz()
"""Variables define start"""
この部分の真ん中のコメントを見てください"""Variables define end"""
。url
パラメータ化されたドメイン名がここにあり、mapping
辞書は環境と変数の間のマッピングを確立し、異なる環境キーに従って異なる変数値を取得します。
config
フィクスチャの役割は、conf.yaml
ファイル内の設定を読み取ることです。
パラメータ化には多くの方法があります。JMeter では 4 種類のパラメータ化方法が提供されています。tep のフィクスチャは、env_vars
JMeter のユーザー定義変数を利用します。
env_vars.put()
env_vars.get()
JMeter BeanShellvars.put()
およびから借用しましたvars.get()
。
例: 複数の URL のテスト
講演の最後にはアイデアが生まれ、実際の例を通して、環境変数、フィクスチャ、ユースケースがどのように使用されているかを見て、印象を深めました。qa
学校側と教育機関側の 2 つの Web サイトがある環境の場合は、両方のスクリプトを使用する必要があります。
最初の変更env_vars
、編集fixture_env_vars.py
:
"""Variables define start"""
# Environment and variables
mapping = {
"qa": {
"domain": "https://qa.com",
"domain_school": "https://school.qa.com", # 新增
"domain_org": "https://org.qa.com" # 新增
},
"release": {
"domain": "https://release.com",
"domain_school": "https://school.release.com" # 新增
"domain_org": "https://org.release.com" # 新增
}
# Add your environment and variables
}
# Define properties for auto display
domain = mapping[env]["domain"]
domain_school = mapping[env]["domain_school"] # 新增
domain_org = mapping[env]["domain_org"] # 新增
"""Variables define end"""
env_vars.domain_school
と を定義する 6 行のコードを追加しましたenv_vars.domain_org
。
2 番目のステップは、フィクスチャを定義し、新しいフィクスチャを作成することですfixture_url.py
。
@pytest.fixture(scope="session")
def url_school(env_vars):
def domain_and_uri(uri):
if not uri.startswith("/"):
uri = "/" + uri
return env_vars.domain_school + uri
return domain_and_uri
@pytest.fixture(scope="session")
def url_org(env_vars):
def domain_and_uri(uri):
if not uri.startswith("/"):
uri = "/" + uri
return env_vars.domain_org + uri
return domain_and_uri
を参照しtep.fixture.url
、とenv_vars.domain
を修正し、2 つの新しいフィクスチャと を追加します。env_vars.domain_school
env_vars.domain_org
url_school
url_org
さらに一歩進んで、フィクスチャlogin_school
やlogin_org
柔軟なオプションを定義することも考えられます。
まとめ
この記事では、tep 環境変数、フィクスチャ、ユースケースの関係を説明を中心に段階的に説明しており、tep.fixture.url
理解していれば全体の関係は非常に明確です。フィクスチャを使用する理由は、複数の人が共同作業して共有するためです。他の人が書いた関数を使用し、戻り値を再利用する必要があります。一部の学生は関数のパラメータの定義に慣れています。パラメータが変更されなくても大丈夫です。すべてのユースケースは変更されません。エラーを報告します。フィクスチャはこれを非常によく制限しています。デフォルトではパラメータを渡すことはできません。内部関数を定義することでパラメータを渡すことはできますが、そうすることはお勧めできません。冗長なコードを追加して複数のフィクスチャを定義する方がコード結合よりも優れています。 。2 番目の理由はimport
問題です。pytest は自動的にconftest.py
フィクスチャを見つけ、tep はさらに自動的にfixtures
フィクスチャを見つけてそれにインポートしますconftest.py
。これをimport
必要とせずに使用できるため、import
コードが削減され、循環インポートの問題が回避されます。