通常,我会编写一个在每个方法中都使用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"

您甚至可以完全删除googlefixture并将代码移动到_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_pageandscope='module'orscope='session'forgoogle)。

关于python - 通过self而不是方法参数的类的Pytest fixture,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50132703/

10-12 18:16