web-dev-qa-db-fra.com

Fixation Pytest pour une classe via self et non comme argument de méthode

Souvent, j'écris une classe de test qui utilise un montage pytest dans chaque méthode. Voici un exemple. J'aimerais pouvoir éviter d'avoir à écrire le nom du luminaire dans la signature de chaque méthode. Ce n'est pas SEC. Comment cela peut-il être fait?

Je voudrais pouvoir accéder au luminaire en donnant le luminaire comme attribut de la classe de test. Dans cet exemple, je voudrais voir le google fixture comme un attribut de TestGoogle. Est-ce possible?

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

Bien sûr, utilisez simplement un appareil autouse. Voici l'endroit pertinent dans pytest docs . Dans votre exemple, le changement introduirait un appareil supplémentaire (je l'ai nommé _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"

Vous pouvez même supprimer complètement le luminaire google et déplacer le code vers _request_google_page:

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

Notez que _request_google_page sera appelé une fois par test par défaut, donc chaque test obtiendra une nouvelle réponse. Si vous souhaitez que la réponse soit initialisée une fois et réutilisée tout au long de tous les tests de la classe TestGoogle, ajustez les étendues de fixture (scope='class' pour _request_google_page et scope='module' ou scope='session' pour google).

18
hoefling