PythonUI 测试夹具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'])