在类别范围的pytest固定装置中,request.cls.driver扮演什么角色?

时间:2019-07-02 15:58:37

标签: python pytest

请参阅以下装置,并帮助我了解request和request.cls.driver = driver到底在做什么?据我了解,它与灯具的范围有关,如果我使用其他范围会发生什么?

@pytest.fixture(scope="class")
def driver_init(request):
    from selenium import webdriver
    web_driver = webdriver.Chrome("C:/chromedriver.exe")
    request.cls.driver = web_driver
    yield
    web_driver.close()

3 个答案:

答案 0 :(得分:0)

pytest 的官方 API 文档指出,“请求装置是一个特殊的装置,提供请求测试功能的信息。”。链接 - https://docs.pytest.org/en/stable/reference.html#request

因此“diver_init”夹具中的“request”具有请求测试函数的信息(这将是打开浏览器的方法)。 从“request.cls.driver = web_driver”这一行可以看出,我们正在为调用测试函数分配驱动程序值。因此,在打开 URL 之前,我们需要一个浏览器,它是驱动程序,并使用具有类级别作用域的夹具进行分配。

当我们执行脚本时 - 对于该特定实例,driver_init 将 request.cls.driver 值声明为“webdriver.Chrome("C:/chromedriver.exe")”。因此,它使用夹具参数 request.cls.driver 将驱动程序设置为 chrome 以进行测试执行。

如果没有此分配,request.cls.driver 没有值,并且您的脚本将无法分配驱动程序为 None。

如果夹具的范围发生变化,例如从类到方法-驱动程序值将按顺序分配给下一个方法的 None 并且序列将失败。相反,如果它从类更改为模块,则不会有任何 driver.quit 或 close 方法。因此,您可以在现有会话上运行脚本。

答案 1 :(得分:0)

我想为@hoefling 在上述问题中发表的评论添加一个清晰的例子。

下面的代码显示了类fixture

@pytest.fixture(scope='class')
def prepare_db():
    connection_db = db.create_connection()
    request.cli.connection = connection_db
    yield
    connection = db.close()

@pytest.mark.usefixtures("prepare_db")
class TestCase:
     def test_connection(self):
          assert self.connection.execute("..") == "..."

上面代码中,request.cli函数fixture中的prepared_db,相当于使用fixture的测试类。在这种情况下,它将是 TestCase.connection = connection_db。 TestCase 是一类测试函数。

答案 2 :(得分:0)

基本上在这里,在您的方法 driver_init 中,您使用请求变量作为参数,而不是将驱动程序声明为全局

 web_driver = webdriver.Chrome("C:/chromedriver.exe")  
 request.cls.driver = web_driver

因此,在这里,您将 web_driver 存储在类级别的请求变量中,可以在运行测试时访问该变量。

当参数 scope = "class" 时,类中的多个测试用例将被执行,并且只会调用一次驱动函数。

当parameter scope = "function" 驱动函数在类中不同的测试用例执行之前被调用时,简称为类中的每个测试用例。

相关问题