web-dev-qa-db-ja.com

メソッド引数としてではなく、自分自身によるクラスのPytestフィクスチャ

多くの場合、すべてのメソッドでpytestフィクスチャを使用するテストクラスを記述します。ここに例があります。すべてのメソッドのシグネチャにフィクスチャ名を記述する必要を回避できるようにしたいのですが。 DRYではありません。これはどのように行うことができますか?

テストクラスの属性としてフィクスチャを指定することで、フィクスチャにアクセスできるようにしたいと思います。この例では、GoogleフィクスチャをTestGoogleの属性として表示します。これは可能ですか?

from bs4 import BeautifulSoup
import pytest
import requests

@pytest.fixture()
def google():
    return requests.get("https://www.google.com")


class TestGoogle:
    def test_alive(self, google):
        assert google.status_code == 200

    def test_html_title(self, google):
        soup = BeautifulSoup(google.content, "html.parser")
        assert soup.title.text.upper() == "GOOGLE"
10
Donal Mee

もちろん、自動使用のフィクスチャを使用してください。 これはpytest docsの関連するスポットです 。あなたの例では、変更は追加のフィクスチャを導入することになります(私は_request_google_pageという名前を付けました):

from bs4 import BeautifulSoup
import pytest
import requests

@pytest.fixture()
def google():
    return requests.get("https://www.google.com")


class TestGoogle:

    @pytest.fixture(autouse=True)
    def _request_google_page(self, google):
        self._response = google

    def test_alive(self):
        assert self._response.status_code == 200

    def test_html_title(self):
        soup = BeautifulSoup(self._response.content, "html.parser")
        assert soup.title.text.upper() == "GOOGLE"

googleフィクスチャを完全に削除して、コードを_request_google_pageに移動することもできます。

@pytest.fixture(autouse=True)
def _request_google_page(self):
    self._response = requests.get("https://www.google.com")

_request_google_pageはデフォルトでテストごとに1回呼び出されるため、各テストは新しい応答を受け取ることに注意してください。応答を一度初期化し、TestGoogleクラスのすべてのテストで再利用する場合は、フィクスチャのスコープを調整します(scope='class' for _request_google_page and scope='module' or scope='session' for google)。

18
hoefling