九、测试夹具fixture

unittest中前置后置条件:setUp() 、tearDown()

pytest中前置后置条件:fixture  也叫测试夹具

fixture测试夹具语法:

函数上面添加@pytest.fixture(),说明这是个测试夹具,我们在代码中设置浏览器函数(函数名driver))为测试夹具

把 return 改成 yield 实现前置和后置

  - yield 前就是前置

  - yield 后的就是后置

  注意:yield可以理解为return,有返回值。执行yield,其后面的代码会继续执行,执行return,其后面的代码不会执行

后置清理语句放在 yield 之后driver.quit()

文件名放在根目录,名称为conftest.py(注意:文件名称是固定的,不可修改为其他)

"""固定文件名 conftest.py.
存储所有的测试夹具。fixture
"""
import pytest
from config.config import WAIT_TIME

@pytest.fixture(scope="class")  
def driver():
    """管理浏览器"""
    # 前置条件
    from selenium import webdriver
    driver = webdriver.Chrome()
    driver.implicitly_wait(WAIT_TIME)
    yield driver   # yield 是个生成器,在这个之前的就是前置条件,在这个之后的就是后置条件 ,相当于return
    # 后置条件
    driver.quit()

'''
@pytest.fixture(scope="class")  ,在运行程序时:
scope="class",,每个测试用例的类,只会执行一次。
scope="function",每个函数都会执行一次。
scope="module",每个模块执行一次。
'''

fixture测试夹具使用:

将测试夹具的定义的函数名,作为参数,放到测试用例的函数中

@pytest.mark.parametrize("test_info", login_success)
def test_login_success(self,test_info,driver):
    pass

测试用例的方法中要用到driver,调用driver这个测试夹具,再执行测试用例的方法,最后再执行后置条件

思考:为什么不将测试夹具放在common模块中去?

在因为driver这个对象,在测试用例中会经常的使用,放在common中要经常进行模块的import操作;而conftest是pytest里面有一个比较智能的地方,不需要去导入,运行程序的时候,会直接去conftest.py文件去找driver,找到了就继续运行,找不到就报错。省了很多导入的操作,也避免了因为导入模块可能存在路径错误的隐患

pytest 有2个功能不能和unittest兼容:

--parmatrize

--fixture

--hook

unittest去编写用例

--ddt

--setUpteatDowm

--self.assertTrue()

pytest运行用例

--自动收集

--用例筛选

--测试报告

--测试插件

pytest有哪些好处?为什么用pytest、unittest

--unittest是标准库,pytest是第三方库

--标准库不需要安装

--标准库不存在说和python版本不兼容的问题 

pytest重运行

安装:pip3 install pytest-rerunfailures

为什么要重运行:这次运行成功,不代表下次运行也会成功,因为有网络等因素的影响 

多次运行用例 

pytest --reruns 2 --reruns-delay 5    # 重运行2次,意思是一共运行3次,每一次的重运行之间相隔5秒

pytest.main(['--reruns','5'])

原文地址:https://www.cnblogs.com/zhangjx2457/p/13810509.html