Aparato de Pytest para una clase a través del yo, no como argumento de método

A menudo escribo una clase de prueba que utiliza un dispositivo pytest en cada método. Aquí hay un ejemplo. Me gustaría poder evitar tener que escribir el nombre del dispositivo en la firma de cada método. No es seco ¿Cómo se puede hacer esto?

Me gustaría poder acceder al aparato dando el aparato como un atributo de la clase de prueba. En este ejemplo, me gustaría ver el accesorio de Google como un atributo de TestGoogle. es posible?

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" 

Claro, solo usa un accesorio de autoajuste. Aquí está el lugar relevante en los documentos pytest . En su ejemplo, el cambio sería introducir un dispositivo adicional (lo _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" 

Incluso podría dejar el dispositivo de google completamente y mover el código a _request_google_page :

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

Tenga en cuenta que _request_google_page se llamará una vez por prueba de forma predeterminada, por lo que cada prueba recibirá una nueva respuesta. Si desea que la respuesta se inicialice una vez y se reutilice a lo largo de todas las pruebas en la clase TestGoogle , ajuste los ámbitos del dispositivo ( scope='class' para _request_google_page y scope='module' o scope='session' para google ).