当前位置: 首页 > 面试题库 >

通过自我而不是方法参数的类的Pytest夹具

齐锐进
2023-03-14
问题内容

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

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

@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_pagescope='module'or scope='session'for google)。例:

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"


 类似资料:
  • 我正在使用PyTest框架编写和运行我的测试。 我实现了一个具体的记录器: 在conftest.py文件中,我编写了当请求此记录器时将调用的函数(创建记录器夹具) 现在,我的问题是如何使用pytest使这个具体的记录器成为全局的? 这意味着我不想像这样将它作为参数传递给test函数: 但仍然可以在测试函数中使用它(如全局变量)

  • 下面是一个示例项目:http://cl.ly/3N2u2i1S441M 我在一个UITableViewCell超类中,因为当子类被初始化时,我调用super。init()。在子类和超类的init的底部,我调用了一个方法,调用styleCell,对其应用样式。该方法来自于它们都符合的协议,其中一个隐式符合,因为它是子类,并且覆盖了该方法。 在超类'的末尾,调用该样式方法,但它调用子类'方法,而不是它

  • 我有一个类似这样的pytest测试: 现在,作为重构的一部分,我移动了这一行: 放入它自己的夹具中(在conftest.py文件中),因为它在其他地方使用。但是,除了直接导入fixture函数外,是否有其他方法在测试中引用它?我知道funcargs通常是调用fixture的方式,但是在本文中,当我想要调用fixture时,我不在测试函数中。

  • 问题内容: 这是我的情况: 逻辑很简单。“ SomeBaseClass”是我无法修改的第三方工具。我想限制其功能,并且不想允许foo(String strs [])。 问题是在SomeBaseClass内部foo(Sting str)内部调用foo(String strs [])。因此,当我调用MyClass的foo(String str)时,出现运行时异常。我该如何告诉SomeBaseClass

  • 本文向大家介绍JS中使用apply方法通过不同数量的参数调用函数的方法,包括了JS中使用apply方法通过不同数量的参数调用函数的方法的使用技巧和注意事项,需要的朋友参考一下 apply()方法定义 函数的apply()方法和call方法作用相同,区别在于接收的参数的方式不同。 apply()方法接收两个参数,一个是对象,一个是参数数组。 apply()作用 1、用于延长函数的作用域 示例: 这里

  • 问题内容: 让我们看一下这段代码: 我希望这能打印出“孩子”,但结果是“父母”。为什么Java会改为调用父类,我该怎么做才能使其在子类中调用方法? 问题答案: 不会覆盖,因为它没有相同的形式参数。一个拿走,另一个拿走。因此,运行时的多态不会被应用,并且不会导致子类方法的执行。根据Java语言规范: 如果满足以下所有条件,则在类C中声明或由类C继承的实例方法从类C中 重写 另一个在类A中声明的方法: