[pytest] tep 環境変数、フィクスチャ、およびユースケースの関係

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与えれinjectorclient何もせずに使えるということです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"

変数なので、任意の値、strfunctionclassobjectany を割り当てることができます。たとえば、フィクスチャ内で関数を定義します。

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_varsJMeter のユーザー定義変数を利用します。

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.urlenv_vars.domainを修正し、2 つの新しいフィクスチャと を追加しますenv_vars.domain_schoolenv_vars.domain_orgurl_schoolurl_org

さらに一歩進んで、フィクスチャlogin_schoollogin_org柔軟なオプションを定義することも考えられます。

まとめ

この記事では、tep 環境変数、フィクスチャ、ユースケースの関係を説明を中心に段階的に説明しており、tep.fixture.url理解していれば全体の関係は非常に明確です。フィクスチャを使用する理由は、複数の人が共同作業して共有するためです。他の人が書いた関数を使用し、戻り値を再利用する必要があります。一部の学生は関数のパラメータの定義に慣れています。パラメータが変更されなくても大丈夫です。すべてのユースケースは変更されません。エラーを報告します。フィクスチャはこれを非常によく制限しています。デフォルトではパラメータを渡すことはできません。内部関数を定義することでパラメータを渡すことはできますが、そうすることはお勧めできません。冗長なコードを追加して複数のフィクスチャを定義する方がコード結合よりも優れています。 。2 番目の理由はimport問題です。pytest は自動的にconftest.pyフィクスチャを見つけ、tep はさらに自動的にfixturesフィクスチャを見つけてそれにインポートしますconftest.py。これをimport必要とせずに使用できるため、importコードが削減され、循環インポートの問題が回避されます。

おすすめ

転載: blog.csdn.net/m0_68405758/article/details/130949388