通常,我会编写一个在每个方法中都使用Pytest夹具的测试类。这是一个例子。我希望能够避免在每个方法的签名中写夹具名称。它不干。怎么能做到?
我希望能够通过将fixture作为测试类的属性来访问fixture。在这个例子中,我希望将Google fixture作为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"
最佳答案
当然,只要使用自动装置就行了。Here is the relevant spot in pytest
docs在您的示例中,更改将引入一个额外的fixture(我将其命名为_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
fixture并将代码移动到_request_google_page
:@pytest.fixture(autouse=True)
def _request_google_page(self):
self._response = requests.get("https://www.google.com")
注意,默认情况下,每个测试调用一次
_request_google_page
,因此每个测试都将得到一个新的响应。如果希望响应初始化一次并在TestGoogle
类中的所有测试中重复使用,请调整fixture范围(scope='class'
for_request_google_page
andscope='module'
orscope='session'
forgoogle
)。关于python - 通过self而不是方法参数的类的Pytest fixture,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50132703/