通常,我会写一个在每个方法中都使用pytest固定装置的测试类。这是一个例子。我希望能够避免必须在每种方法的签名中写入灯具名称。不是干的。如何才能做到这一点?
我希望能够通过将灯具作为测试类的属性来访问灯具。在此示例中,我希望将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"
当然,只需使用自动使用的夹具即可。这是pytestdocs中的相关位置。在您的示例中,更改将引入一个额外的固定装置(我将其命名为_request_google_page):
pytest
_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:
google
@pytest.fixture(autouse=True) def _request_google_page(self): self._response = requests.get("https://www.google.com")
请注意,_request_google_page默认情况下每个测试都会调用一次,因此每个测试都会获得新的响应。如果您希望响应被初始化一次并在TestGoogle类中的所有测试中重新使用,请调整灯具范围(scope='class'for_request_google_page和scope='module'or scope='session'for google)。例:
TestGoogle
scope='class'
scope='module'
scope='session'
from bs4 import BeautifulSoup import pytest import requests @pytest.fixture(scope='module') def google(): return requests.get("https://www.google.com") @pytest.fixture(autouse=True, scope='class') def _request_google_page(request, google): request.cls._response = google class TestGoogle: 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"