pytest测试夹具(fixture)简介

fixture测试夹具

一、Fixture介绍

Fixture是pytest精髓所在,就像unittest中的setup和teardown一样,但相对之下它的功能更加强大和灵活。

二、Fixture的作用

1.做测试前后的初始化设置,如测试数据准备,链接数据库,打开浏览器等这些操作都可以使用fixture来实现

2.测试用例的前置条件可以使用fixture实现

3.支持经典的xunit fixture ,像unittest使用的setup和teardown

4.fixture可以实现unittest不能实现的功能,比如unittest中的测试用例和测试用例之间是无法传递参数和数据的,但是fixture却可以解决这个问题

三、Fixture定义及调用

fixture通过@pytest.fixture()装饰器装饰一个函数,那么这个函数就是一个fixture,看个实例:

@pytest.fixture()
def manage_browser():    
    driver = webdriver.Chrome()   # 前置条件
        return driver    
    print("后置条件")            # 后置条件

@pytest.mark.fixe
def test_baidu(manage_browser):
    driver = manage_browser
    driver.get("https://www.baidu.com/")

声明的测试夹具函数名称,作为参数传入其他函数,即可完成调用。可以传多个fixture,按先后顺序执行。

pytest测试夹具(fixture)简介

 

 

 

上面的测试夹具中只用return返回初始化浏览器,return后面的后置条件不会执行,因此需要将return改成yield,后置条件就会被调用执行。

Yield是Python中的一个关键字,表示生成器。测试夹具的前置条件遇到yield时返回一个结果,然后将测试夹具挂起,转而去执行测试用例,最后回来测试夹具中执行后置条件。Return和yield后面可以不写任何返回值,表示空没有数据返回。Yield使用示例如下:

import pytest
from selenium import webdriver

@pytest.fixture()
def manage_browser():
    # 前置条件
        driver = webdriver.Chrome()    
    yield driver  # yield,返回函数值,可以继续执行下面的代码
        # 后置条件
    driver.quit()

@pytest.mark.fix
def test_baidu(manage_browser):
    driver = manage_browser  # 这里是参数接收,不能打括号
        driver.get("https://www.baidu.com/")

四、Pytest中fixture前置后置条件

Pytest框架中将前置条件,后置条件单独放在fixture的函数中,所有的用例调用测试夹具的前后置条件。Web自动化的前后置条件如下:

@pytest.fixture()
def manage_browser():
    """初始化浏览器"""
    driver = webdriver.Chrome()
    # 设置隐式等待
        driver.implicitly_wait(20)
    # 最大化浏览器
    driver.maximize_window()
    # 初始化要用到的页面
         login_page = LoginPage(driver)
    # 初始化首页
         index_page = IndexPage(driver)
    yield driver, login_page, index_page
    # 后置条件
    driver.quit()

@pytest.fixture()  # 可以同时创建多个测试夹具
def login():
    """登录的夹具"""
    manage_browser()
    pass

要使用测试夹具,在测试用例类中的test方法中传入夹具函数名(例如上面函数的manage_browser),且框架中所有的测试用例文件中不需要导入夹具函数名,是直接使用的。如下代码:

class TestLogin:

    @pytest.mark.parametrize("test_info", test_data_error)
    def test_01_login_error(self, test_info, manage_browser):
        """登录时,手机号为空"""
                # 拆开元祖中的参数
                driver, login_page, index_page = manage_browser
        # 第一步:登录
                login_page.login(test_info["mobile"], test_info["pwd"])
        # 获取实际结果(封装以后执行的函数或者方法)
                actual = login_page.get_error_msg()
        # 第二步:获取预期结果 test_info["expected"]
                expected = test_info["expected"]
        # 第三步:断言
                # self.assertEqual(expected, actual)  unitte中的断言方式
                assert expected == actual

测试用例类中使用测试夹具,以及数据传递的方式:

pytest测试夹具(fixture)简介

注意:Pytest中的fixture测试夹具单独放在conftest.py文件中,且conftest.py文件需要与pytest启动文件放在同一级目录。

pytest测试夹具(fixture)简介

五、Fixture作用域

Unittest框架中setup的作用是每条测试用例执行之前都会执行一次,setupclass的作用是每个测试用例类执行之前都会执行一次。

pytest的fixture同样有这样的作用域,且使用更广泛更灵活。

​关键代码:@pytest.fixture(scope='作用范围'),参数如下:

上一篇:django的多语言国际化


下一篇:安装Jenkins报错 SSLHandshakeException