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"
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
).